Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
C# CreateProcessAsUser hToken为零_C#_Windows_Winapi_Service - Fatal编程技术网

C# CreateProcessAsUser hToken为零

C# CreateProcessAsUser hToken为零,c#,windows,winapi,service,C#,Windows,Winapi,Service,我正在创建一个应用程序(名称AppRunner),它将使用winapi运行一个可执行文件(名称EXE) 在AppRunner中,我使用CreateProcessAsUser来运行EXE,这个方法使用hToken(用户令牌) 当用户系统在会话0中执行AppRunner时,它将成功获取用户令牌(带有控制台会话id的WTSQueryUserToken),一切正常。 但是,当登录用户在会话>0中执行AppRunner时,它将无法获取用户令牌 我注意到,当使用hToken=0调用CreateProcess

我正在创建一个应用程序(名称AppRunner),它将使用winapi运行一个可执行文件(名称EXE)

在AppRunner中,我使用CreateProcessAsUser来运行EXE,这个方法使用hToken(用户令牌)

当用户系统在会话0中执行AppRunner时,它将成功获取用户令牌(带有控制台会话id的WTSQueryUserToken),一切正常。
但是,当登录用户在会话>0中执行AppRunner时,它将无法获取用户令牌

我注意到,当使用hToken=0调用CreateProcessAsUser时,EXE在用户会话(>0)中的登录用户下执行

我是否可以假设调用hToken=0的CreateProcessAsUser将在用户会话中登录的用户下执行EXE?我在CreateProcessAsUser页面中没有找到任何关于它的文档

谢谢


顺便说一句,如果其他人遇到这种情况:CreateProcessAsUser hToken=0确实将使用与用户相同的用户创建一个进程 但是,CreateEnvironmentBlock将创建一个 具有默认值的环境,这意味着 示例将指向默认用户,而不是当前用户的 appdata文件夹。这对我来说是个大问题

两个变通办法:

  • 调用时继承父进程“(AppRunner)环境。然后,
    APPDATA
    环境变量将指向当前用户的APPDATA文件夹。但是
    USERPROFILE
    仍然指向
    C:\Users\Default
  • 使用获取父进程“(AppRunner)令牌,然后将此令牌传递给
    CreateEnvironmentBlock
    。然后,
    APPDATA
    USERPROFILE
    环境变量都指向当前用户

  • CreateProcessAsUser
    与hToken=0具有与
    CreateProcess
    相同的效果-新流程将使用当前流程令牌BTW执行,以防其他任何人遇到这种情况:hToken=0的CreateProcessAsUser确实将使用与当前流程用户相同的用户创建流程,但是,CreateEnvironmentBlock将创建一个具有默认值的环境,例如,这意味着appdata文件夹将指向默认用户,而不是当前用户的appdata文件夹。这对于我的建议来说是一个大问题,但是我的解决方案是:当AppRunner在会话0中运行时,我使用CreateProcessAsUser。当AppRunner在会话>0中运行时(因此没有系统用户,因此我无法提取hToken),我使用Process.Start。你认为你的解决方案更好吗?我不确定运行的2个进程之间有什么区别methods@Alonzzo2我只是回答你在我的回答中引用的问题。请随意发布您的解决方案作为答案。