有一个需要管理员权限的 Windows 应用程序,这在其清单中声明。当受限用户启动它时,她必须输入管理员凭据。没关系,应用程序运行良好,但它无法再获取原始用户文件夹(ShellAPI 返回管理员的文件夹)。
由于该应用程序最初是在 admin 下启动的,因此我无法存储原始用户的文件夹路径以供以后使用。
有没有办法获得初始受限用户凭据?
问候,
有一个需要管理员权限的 Windows 应用程序,这在其清单中声明。当受限用户启动它时,她必须输入管理员凭据。没关系,应用程序运行良好,但它无法再获取原始用户文件夹(ShellAPI 返回管理员的文件夹)。
由于该应用程序最初是在 admin 下启动的,因此我无法存储原始用户的文件夹路径以供以后使用。
有没有办法获得初始受限用户凭据?
问候,
由于您的清单,您的应用程序以管理员用户身份运行,而不是当前登录的受限用户。正如 David Heffernan 所提到的,您应该重新设计您的应用程序,以不要求整个应用程序在提升的情况下运行。将您的管理任务委派给一个单独的进程,该进程在需要时运行提升。
话虽如此,如果您必须提升整个应用程序的运行,一切都不会丢失,但您将不得不做一些额外的工作。
首先获取运行提升的应用程序的会话 ID。您可以使用WTSQuerySessionInformation()
withWTS_CURRENT_SESSION
或ProcessIdToSessionId()
withGetCurrentProcessId()
打开当前进程的令牌,OpenProcessToken()
然后使用GetTokenInformation()
.
获得会话 ID 后,使用EnumProcesses()
、GetProcessImageFileName()
(或等效项)、OpenProcessToken()
和 GetTokenInformation()
查找在与您的应用程序相同的会话 ID 中运行的实例explorer.exe
(或任何 PC 注册的 shell 应用程序,您可以在注册表中找到) .
找到后,您将获得该进程的用户令牌OpenProcessToken()
。复制它DuplicateTokenEx()
以获取其主令牌,然后您可以根据需要将该令牌与 API 等一起LoadUserProfile()
使用。SHGetFolderPath()
SHGetKnownFolderPath()