CreateProcessAsUser hToken 为零

Posted

技术标签:

【中文标题】CreateProcessAsUser hToken 为零【英文标题】:CreateProcessAsUser hToken is zero 【发布时间】:2020-07-26 01:16:57 【问题描述】:

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

在 AppRunner 中,我使用 CreateProcessAsUser 来运行 EXE,并且此方法需要一个 hToken(用户令牌)。

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

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

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

谢谢

【问题讨论】:

CreateProcessAsUser with hToken = 0CreateProcess 具有相同的效果 - 将使用当前进程令牌执行新进程 顺便说一句,如果其他人遇到这种情况: CreateProcessAsUser with hToken=0 确实会创建一个与当前进程的用户具有相同用户的进程,但是 CreateEnvironmentBlock 将创建一个具有默认值的环境,这意味着例如 appdata 文件夹将指向默认用户,而不是当前用户的 appdata 文件夹。这对我来说是个大问题 【参考方案1】:

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

两种解决方法:

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

【讨论】:

感谢您的建议,但我的解决方案是:当 AppRunner 在会话 0 中运行时,我使用 CreateProcessAsUser。当 AppRunner 在 session > 0 中运行时(因此没有系统用户我无法提取 hToken)我使用 Process.Start。你认为你的解决方案更好吗?我不确定这两种进程运行方法有什么区别 @Alonzzo2 我只是回答你在我的回答中引用的问题。随时发布您的解决方案作为答案。

以上是关于CreateProcessAsUser hToken 为零的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcessAsUser hToken 为零

无密码的 CreateProcessAsUser 和 LogonUser

CreateProcessAsUser 进程以 -1073741502 退出

从 Vista 上的服务中使用 CreateProcessAsUser 的桌面问题

“更改用户”时 CreateProcessAsUser 不起作用

C# .NET Framework API(非 Win32 API)中的 CreateProcessAsUser()