如何从WMI spun远程进程获取退出代码

我正在通过WMI(Win32_Process Create)远程执行进程,但我无法弄清楚如何确定进程何时完成执行。 当我第一次发出命令时,有一个退出代码(0表示成功),但这只是告诉我该进程已成功生成。

有没有办法让我知道这个过程何时结束? 谢谢!

面对同样的问题并写了一个简单的VMI包装器:

var exitStatus = WmiOperations.Run("notepad.exe", wait:10); 

Run概要是:

 int Run(string command, // Required string commandline = null, // (default=none) string machine = null, // (default=local) string domain = null, // (default=current user domain) string username = null, // (default=current user login) string password = null, // (default=current user password) SecureString securePassword = null, // (default=current user password) double wait = double.PositiveInfinity); // (default=wait til command ends); 

源代码可以从这里下载。

给凯撒他的到期,代码的灵感来自于这一个 。 只是:

  • 将事物重构为静态类
  • 添加了对远程处理参数的更多控制
  • 重新设计的事件观察器,以抑制无吸引力的CheckProcess测试

这是一个在.NET对象顶部创建的示例,但是用Powershell编写,很容易将其转换为C#

 Clear-Host # Authentication object $ConOptions = New-Object System.Management.ConnectionOptions $ConOptions.Username = "socite\administrateur" $ConOptions.Password = "adm" $ConOptions.EnablePrivileges = $true $ConOptions.Impersonation = "Impersonate" $ConOptions.Authentication = "Default" $scope = New-Object System.Management.ManagementScope("\\192.168.183.220\root\cimV2", $ConOptions) $ObjectGetOptions = New-Object System.Management.ObjectGetOptions($null, [System.TimeSpan]::MaxValue, $true) # Equivalent to local : # $proc = [wmiclass]"\\.\ROOT\CIMV2:Win32_Process" $proc = New-Object System.Management.ManagementClass($scope, "\\192.168.183.220\ROOT\CIMV2:Win32_Process", $ObjectGetOptions) # Now create the process remotly $res = $proc.Create("cmd.exe") # Now create an event to detect remote death $timespan = New-Object System.TimeSpan(0, 0, 1) $querryString = "SELECT * From WIN32_ProcessStopTrace WHERE ProcessID=$($res.ProcessID)" $query = New-Object System.Management.WQLEventQuery ($querryString) $watcher = New-Object System.Management.ManagementEventWatcher($scope, $query) $b = $watcher.WaitForNextEvent() $b