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