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

时间:2015-10-19 16:51:58

标签: winapi credentials admin-rights

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

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

有没有办法获得初始受限制的用户凭证?

此致

1 个答案:

答案 0 :(得分:2)

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

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

  1. 首先获取正在运行提升的应用的会话ID。您可以使用WTSQuerySessionInformation() WTS_CURRENT_SESSIONProcessIdToSessionId() GetCurrentProcessId(),或者使用OpenProcessToken()打开当前流程的令牌,然后使用GetTokenInformation()

  2. 获得会话ID后,使用EnumProcesses()GetProcessImageFileName()(或同等),OpenProcessToken()GetTokenInformation()查找{{1}的实例(或者是PC的注册shell应用程序,您可以在注册表中找到),它与您的应用程序在相同的会话ID中运行。

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