C# CreateProcessAsUser hToken为零
我正在创建一个应用程序(名称AppRunner),它将使用winapi运行一个可执行文件(名称EXE) 在AppRunner中,我使用CreateProcessAsUser来运行EXE,这个方法使用hToken(用户令牌) 当用户系统在会话0中执行AppRunner时,它将成功获取用户令牌(带有控制台会话id的WTSQueryUserToken),一切正常。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
但是,当登录用户在会话>0中执行AppRunner时,它将无法获取用户令牌 我注意到,当使用hToken=0调用CreateProcessAsUser时,EXE在用户会话(>0)中的登录用户下执行 我是否可以假设调用hToken=0的CreateProcessAsUser将在用户会话中登录的用户下执行EXE?我在CreateProcessAsUser页面中没有找到任何关于它的文档 谢谢
顺便说一句,如果其他人遇到这种情况:CreateProcessAsUser hToken=0确实将使用与用户相同的用户创建一个进程 但是,CreateEnvironmentBlock将创建一个 具有默认值的环境,这意味着 示例将指向默认用户,而不是当前用户的 appdata文件夹。这对我来说是个大问题 两个变通办法:
APPDATA
环境变量将指向当前用户的APPDATA文件夹。但是USERPROFILE
仍然指向C:\Users\Default
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我只是回答你在我的回答中引用的问题。请随意发布您的解决方案作为答案。