我希望在该用户已登录时在另一个用户帐户(非提升)凭据下运行应用程序。具体来说,我希望我的应用程序的安装程序(在任何管理员帐户下运行)将进程生成到每个登录用户的桌面会话中。这些进程与服务进行通信,并在桌面上显示窗口供用户与之交互。
通常,从LocalSystem
运行的服务,方法是WTSQueryUserToken
- > CreateProcessAsUser
。但是,WTSQueryUserToken
不会在LocalSystem
帐户之外运行(具有SE_TCB_NAME
权限),这会使此方法失败。
如果用户尚未登录,我可以注册该应用程序以在HKLM\...\Run
下运行,以便任何登录用户在登录时都会获得该应用程序的副本。但是如果用户已经登录,但也不起作用(至少,直到他们退出并重新登录)。
我可以看到两个可能的答案:
你不能这样做。遗憾。
您可以从其他地方获取令牌(可能枚举explorer.exe进程并从每个进程中提取访问令牌?),调用DuplicateTokenEx
,然后传递给CreateProcessAsUser
。我尝试了这种方法,并且在尝试OpenProcessToken
在另一个用户会话下运行的进程时始终收到“拒绝访问”,即使启用了调试权限并且使用PROCESS_ALL_ACCESS
打开了该进程。
您怎么看?
如果答案是#1(“你不能这样做”),那么产生非提升过程以在服务和用户之间进行调解的建议最佳做法是什么?服务是通过CreateProcessAsUser将这些进程生成到每个会话中的最佳做法吗?或者,最佳做法是单独运行非提升流程(例如,通过HKLM\...\Run
或HKCU\...\Run
)?