0

有一个需要管理员权限的 Windows 应用程序,这在其清单中声明。当受限用户启动它时,她必须输入管理员凭据。没关系,应用程序运行良好,但它无法再获取原始用户文件夹(ShellAPI 返回管理员的文件夹)。

由于该应用程序最初是在 admin 下启动的,因此我无法存储原始用户的文件夹路径以供以后使用。

有没有办法获得初始受限用户凭据?

问候,

4

1 回答 1

2

由于您的清单,您的应用程序以管理员用户身份运行,而不是当前登录的受限用户。正如 David Heffernan 所提到的,您应该重新设计您的应用程序,以不要求整个应用程序在提升的情况下运行。将您的管理任务委派给一个单独的进程,该进程在需要时运行提升。

话虽如此,如果您必须提升整个应用程序的运行,一切都不会丢失,但您将不得不做一些额外的工作。

  1. 首先获取运行提升的应用程序的会话 ID。您可以使用WTSQuerySessionInformation()withWTS_CURRENT_SESSIONProcessIdToSessionId()withGetCurrentProcessId()打开当前进程的令牌,OpenProcessToken()然后使用GetTokenInformation().

  2. 获得会话 ID 后,使用EnumProcesses()GetProcessImageFileName()(或等效项)、OpenProcessToken()GetTokenInformation()查找在与您的应用程序相同的会话 ID 中运行的实例explorer.exe(或任何 PC 注册的 shell 应用程序,您可以在注册表中找到) .

  3. 找到后,您将获得该进程的用户令牌OpenProcessToken()。复制它DuplicateTokenEx()以获取其主令牌,然后您可以根据需要将该令牌与 API 等一起LoadUserProfile()使用。SHGetFolderPath()SHGetKnownFolderPath()

于 2015-10-19T22:46:30.020 回答