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 = 0 与CreateProcess
具有相同的效果 - 将使用当前进程令牌执行新进程
顺便说一句,如果其他人遇到这种情况: 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
。然后APPDATA
和USERPROFILE
环境变量都指向当前用户。
【讨论】:
感谢您的建议,但我的解决方案是:当 AppRunner 在会话 0 中运行时,我使用 CreateProcessAsUser。当 AppRunner 在 session > 0 中运行时(因此没有系统用户我无法提取 hToken)我使用 Process.Start。你认为你的解决方案更好吗?我不确定这两种进程运行方法有什么区别 @Alonzzo2 我只是回答你在我的回答中引用的问题。随时发布您的解决方案作为答案。以上是关于CreateProcessAsUser hToken 为零的主要内容,如果未能解决你的问题,请参考以下文章
无密码的 CreateProcessAsUser 和 LogonUser
CreateProcessAsUser 进程以 -1073741502 退出
从 Vista 上的服务中使用 CreateProcessAsUser 的桌面问题