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

Posted

技术标签:

【中文标题】当应用需要管理员权限并在管理员下启动时获取受限用户文件夹【英文标题】:Get restricted user folder when an app requires admin rights and started under admin 【发布时间】:2015-10-19 16:51:58 【问题描述】:

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

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

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

问候,

【问题讨论】:

这就是系统的工作方式。该过程在不同用户的帐户下运行。标准用户并不意味着运行管理任务。一般而言,处理此问题的正确方法是让相关应用始终停止要求管理员权限,并且只要求它们执行需要它们的操作子集。 【参考方案1】:

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

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

    首先获取运行提升的应用程序的会话 ID。您可以使用 WTSQuerySessionInformation()WTS_CURRENT_SESSION,或 ProcessIdToSessionId()GetCurrentProcessId(),或使用 @ 打开当前进程的令牌987654325@,然后使用GetTokenInformation()

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

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

【讨论】:

可能对查找登录用户的会话很有用,但对于获取查询大多数用户相关数据(如 shell 文件夹路径)所必需的登录用户令牌没有用。仅 SID 不足以获取令牌。

以上是关于当应用需要管理员权限并在管理员下启动时获取受限用户文件夹的主要内容,如果未能解决你的问题,请参考以下文章

程序启动时如何请求管理员权限?

安装软件“没有进行此操作的权限”怎么办

在受限用户中启动具有更多用户权限的程序

如何仅在需要时提升权限?

在Windows 7下调试需要管理员权限的程序

为啥我的windows里开启来宾账户,但是来宾账户不能登录