当应用程序需要管理员权限并在管理员下启动时获取受限用户文件夹

Get restricted user folder when an app requires admin rights and started under admin

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

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

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

此致,

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

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

  1. 首先获取提升后的应用 运行 进入的会话 ID。您可以使用 WTSQuerySessionInformation()WTS_CURRENT_SESSION 或 [=12] =]用GetCurrentProcessId(),或者用OpenProcessToken()打开当前进程的token,然后用GetTokenInformation().

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

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