Windows CreateProcessAsUser不来自服务
我想在另一个用户帐户(非提升)的凭据下运行应用程序,而该用户已登录。具体来说,我希望我的应用程序的安装程序(在任何管理员帐户下运行)在每个登录用户的桌面会话中生成进程。这些进程与服务通信,并在桌面上显示供用户交互的窗口 通常,从作为Windows CreateProcessAsUser不来自服务,windows,service,createprocessasuser,Windows,Service,Createprocessasuser,我想在另一个用户帐户(非提升)的凭据下运行应用程序,而该用户已登录。具体来说,我希望我的应用程序的安装程序(在任何管理员帐户下运行)在每个登录用户的桌面会话中生成进程。这些进程与服务通信,并在桌面上显示供用户交互的窗口 通常,从作为LocalSystem运行的服务来看,方法是WTSQueryUserToken->CreateProcessAsUser。但是,WTSQueryUserToken不会在LocalSystem帐户之外运行(具有SE\u TCB\u NAME权限),这使得这种方法在这里失
LocalSystem
运行的服务来看,方法是WTSQueryUserToken
->CreateProcessAsUser
。但是,WTSQueryUserToken
不会在LocalSystem
帐户之外运行(具有SE\u TCB\u NAME
权限),这使得这种方法在这里失败
如果用户还没有登录,我可以注册应用程序在HKLM\…\run
下运行,这样任何登录的用户都可以在登录时获得应用程序的副本。但是,如果用户已经登录,这也不起作用(至少在他们注销并再次登录之前)
我可以看到两个可能的答案:
DuplicateTokenEx
,然后传递到CreateProcessAsUser
。我尝试了这种方法,并且在另一个用户会话下运行的进程上尝试OpenProcessToken
时,始终收到“拒绝访问”的消息,即使启用了调试权限,并且进程是使用process\u ALL\u access
打开的如果答案是#1(“您不能这样做”),那么,对于生成非提升流程以在服务和用户之间进行调解,建议的最佳实践是什么?通过CreateProcessAsUser将这些进程生成到每个会话中,这是服务的最佳实践吗?或者非提升进程单独运行(例如通过
HKLM\…\run
或HKCU\…\run
)是最佳做法?一个明显的解决方法是动态安装和启动服务,以便您可以从系统上下文调用WTSQueryUserToken。您可以在完成工作后再次删除该服务。是的,这确实是最简单的解决方法,如果(A)无法从非服务调用方(例如,安装程序)执行此操作,以及(B)以这种方式执行此操作并不坏!(A) 我不知道为什么打开进程令牌会被拒绝访问,但枚举进程充其量是一种笨拙的方法,所以我个人建议坚持使用WTSQueryUserToken,它被记录为仅在您使用系统时才起作用。(B)有先例;微软的软件,如psexec和processmonitor,通过动态安装服务来工作。我更担心的是,以这种方式运行应用程序可能是一种不好的做法;从Vista会话0隔离的角度来看,最好将它们注册为从HKLM \…\run运行,而不是从服务中生成它们。