【发布时间】:2014-05-16 01:09:36
【问题描述】:
问题:
(1) 在 windows server 2008 R2 x64 系统上
(2) a1.exe 以用户 u1 运行,调用 CreateProcess() API,dwCreationFlags=0 启动 a2.exe。
(3) a2.exe 使用 dwCreationFlags=CREATE_BREAKAWAY_FROM_JOB | 调用 CreateProcessAsUser() API CREATE_SUSPENDED 以用户 u2 身份启动 powershell.exe
(4) a1.exe 调用 a2.exe 5 次
(5)powershell命令行为“powershell.exe -command echo Hi”
(6) 只有第一个powershell 进程成功运行,并将输出“Hi”返回给a1.exe,退出代码为0
(7) 每隔一个(2 到 5 个)powershell 进程都失败,退出代码为 1
修复:
(1) 修复了 a2.exe 调用 CreateProcessAsUser() API 的问题 dwCreationFlags=CREATE_BREAKAWAY_FROM_JOB | CREATE_SUSPENDED | CREATE_NO_WINDOW 启动 powershell 进程。
我知道的事情:
(1) powershell 是一个控制台应用程序进程,因此在失败的情况下将使用父进程 a2.exe 的控制台窗口。
(2)在5次调用中,a1.exe进程、5个a2.exe进程、5个powershell.exe进程都会使用同一个控制台窗口,即a1.exe的
(3) 在工作情况下,powershell 进程既不会使用父进程 a2.exe 的控制台窗口,也不会创建新的控制台窗口,即不会为 powershell 进程设置控制台句柄。
(4) 在 pre-vista 系统(xp、2003 等)中没有此类问题——即即使不使用 CREATE_NO_WINDOW 属性,powershell 进程在所有 5 次启动中都成功。
我的怀疑:
看起来,在后 vista 系统(2008、7、8)中,当要求 powershell 进程使用相同的控制台窗口时,它们会遇到问题。 (在没有控制台窗口 (CREATE_NO_WINDOW) 或使用不同的控制台窗口 (CREATE_NEW_CONSOLE) 或不使用父进程的控制台窗口 (DETACHED_PROCESS) 时启动 powershell 进程时没有问题。
我的问题:
我的怀疑是否正确。请求帮助我了解 post-vista 系统上的 powershell 限制,尤其是 w.r.t 控制台共享。
马杜基兰
【问题讨论】:
-
我怀疑您需要 1. 直接与 Microsoft 交谈; 2,将请求上报给 PSH 团队:您正在寻找不太可能成为任何产品文档的一部分的非常具体的技术信息。 TL;DR:让多个进程想要完全控制在同一个控制台窗口中同时运行的控制台似乎是一个奇怪的秘诀。
-
我建议您研究从 c# 对 powershell 运行空间的编程调用 - 这比您解决这些问题要少得多。msdn.microsoft.com/en-us/library/…
标签: powershell