如何可靠地从作为SYSTEM运行的进程获得LOGON用户名/sid ?



我有一个应用程序运行(在交互式桌面)作为系统。应用程序需要以当前登录用户的身份启动浏览器或电子邮件客户端。

我想我只要看看桌面、windows工作站或会话,就能确定我在哪个用户的登录桌面上运行。然而,当我从桌面、windows工作站和会话中获取用户信息时,它们似乎都是特殊帐户(例如"logonsessionid_0_4005652")。

一种看起来很有希望的方法是调用WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSUserName, ...)。这产生了登录用户名,我可以调用LookupAccountNameW()来获得SID。

微软关于WTSQuerySessionInformationW的文档中的这一点让我有点不舒服…

检索指定RD会话主机服务器上指定会话的会话信息。(强调我的)

…还有…

如果远程桌面服务未运行,调用WTSQuerySessionInformation失败。

我似乎记得那"家";以前的Windows版本不支持远程桌面。我们的应用面向Windows 10和Windows 11。我可以确定WTSQuerySessionInformationW呼叫将为所有用户工作?

ProcessIdToSessionId在你自己,然后WTSQueryUserToken应该给你一个令牌,你可以使用CreateProcessAsUser

另一个选择是FindWindow找到任务栏并复制资源管理器。费用令牌。如果资源管理器未运行,此操作将不起作用。

相关内容

最新更新