问题:
(1)在Windows Server 2008 R2 x64系统上
(2)以用户u1身份运行的a1.exe,使用dwCreationFlags = 0调用CreateProcess()API以启动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使用dwCreationFlags = CREATE_BREAKAWAY_FROM_JOB |调用CreateProcessAsUser()API的问题。 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次启动中都成功。
我的怀疑:
看起来,在post-vista系统(2008,7,8)中,当PowerShell进程被要求使用相同的控制台窗口时,它们面临着问题。 (在没有控制台窗口(CREATE_NO_WINDOW)或不同控制台窗口(CREATE_NEW_CONSOLE)或不使用父进程控制台窗口(DETACHED_PROCESS)的情况下启动powershell进程时没有问题。
我的问题:
我的怀疑是否正确。请求帮助我了解post-vista系统的powershell限制,尤其是w.r.t控制台共享。
Madhukiran
答案 0 :(得分:0)
powershell是一个控制台应用程序进程
是和否。从根本上说,PowerShell是一个可托管的自动化引擎,不需要Window或控制台。但是,PowerShell引擎是基于.NET的,因此您需要在C#(或VB或C ++ / CLI)应用程序中托管它。
启动时通常使用的内容PowerShell.exe是一个瘦的控制台应用程序包装器,它实际上是一个本机应用程序,用于引导CLR和PowerShell引擎(在System.Management.Automation命名空间中)。