有一个Windows应用程序需要管理员权限,并在其清单中声明。当受限制的用户启动它时,她必须输入管理员凭据。这是OK的,应用程序工作得很好,但它不能再获得原始用户文件夹(ShellAPI返回管理员的)。
由于应用程序最初是在admin下启动的,因此我无法存储原始用户的文件夹路径以供以后使用。
是否有办法获得初始受限用户凭据?
认为,
由于您的manifest,您的应用程序以admin用户运行,而不是当前登录的受限制用户。正如David Heffernan所提到的,你应该重新设计你的应用,不要要求整个应用都在高架状态下运行。将您的管理任务委托给一个单独的进程,该进程在需要时提升运行。
话虽如此,如果你必须高架运行你的整个应用程序,一切都不会失去,但你将不得不做一些额外的工作。
-
首先获取您的提升应用程序正在运行的会话ID。您可以使用
WTSQuerySessionInformation()
和WTS_CURRENT_SESSION
,或ProcessIdToSessionId()
和GetCurrentProcessId()
,或使用OpenProcessToken()
打开当前进程的令牌,然后使用GetTokenInformation()
。 -
一旦你有了会话ID,使用
EnumProcesses()
,GetProcessImageFileName()
(或同等),OpenProcessToken()
和GetTokenInformation()
来找到explorer.exe
的实例(或无论PC的注册壳应用程序是什么,你可以在注册表中找到),它运行在与你的应用程序相同的会话ID。 -
找到后,您就拥有了
OpenProcessToken()
中该进程的用户令牌。使用DuplicateTokenEx()
复制它以获得其主令牌,然后您可以根据需要将该令牌与LoadUserProfile()
,SHGetFolderPath()
和SHGetKnownFolderPath()
等api一起使用。