对于CreateProcessAsUser(),由dwCreationFlags = 0的exe启动时,powershell进程失败

时间:2014-05-16 01:09:36

标签: powershell

  

问题:

(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

1 个答案:

答案 0 :(得分:0)

  
    

powershell是一个控制台应用程序进程

  

是和否。从根本上说,PowerShell是一个可托管的自动化引擎,不需要Window或控制台。但是,PowerShell引擎是基于.NET的,因此您需要在C#(或VB或C ++ / CLI)应用程序中托管它。

启动时通常使用的内容PowerShell.exe是一个瘦的控制台应用程序包装器,它实际上是一个本机应用程序,用于引导CLR和PowerShell引擎(在System.Management.Automation命名空间中)。