Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows CreateProcessAsUser不来自服务_Windows_Service_Createprocessasuser - Fatal编程技术网

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
下运行,这样任何登录的用户都可以在登录时获得应用程序的副本。但是,如果用户已经登录,这也不起作用(至少在他们注销并再次登录之前)

我可以看到两个可能的答案:

  • 你不能这样做。对不起

  • 您可以从其他地方获取令牌(可能枚举explorer.exe进程并从每个进程提取访问令牌?),调用
    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运行,而不是从服务中生成它们。