WaitForExit для процесса на удаленном компьютере - PullRequest
5 голосов
/ 14 апреля 2009

Я использую WMI для запуска процесса на удаленной машине . Вызов для создания процесса немедленно возвращается, и я также получаю идентификатор процесса на удаленной машине.

Я хотел бы дождаться завершения удаленного процесса. Один из вариантов - опросить, существует ли еще процесс на удаленной машине с заданным идентификатором.

Однако мне было интересно, есть ли лучший способ добиться этого, возможно, с использованием собственных функций WinAPI?

Просто для дополнительной информации, это код, который я сейчас использую для запуска удаленного процесса:

ConnectionOptions connOptions = new ConnectionOptions();
connOptions.Impersonation = ImpersonationLevel.Impersonate;
connOptions.EnablePrivileges = true;

connOptions.Username = domainUserName;
connOptions.Password = password;

ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", host), connOptions);
manScope.Connect();

ObjectGetOptions objectGetOptions = new ObjectGetOptions();
ManagementPath managementPath = new ManagementPath("Win32_Process");
ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);

ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
inParams["CommandLine"] = commandLine;

ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);

Ответы [ 4 ]

4 голосов
/ 14 апреля 2009

Я не знаю, насколько это эффективно, вы можете использовать ManagementEventWatcher для просмотра запроса.

Вот что я нашел в сети.

WqlEventQuery wQuery = 
 new WqlEventQuery("Select * From __InstanceDeletionEvent Within 1 Where TargetInstance ISA 'Win32_Process'");

using (ManagementEventWatcher wWatcher = new ManagementEventWatcher(scope, wQuery))
{    
  bool stopped = false;

  while (stopped == false)
  {
    using (ManagementBaseObject MBOobj = wWatcher.WaitForNextEvent())
    {
      if (((ManagementBaseObject)MBOobj["TargetInstance"])["ProcessID"].ToString() == ProcID)
      {
        // the process has stopped
        stopped = true;
      }
    }
  }

  wWatcher.Stop();
}
2 голосов
/ 14 апреля 2009

Родным способом Win32 для достижения этой цели было бы выполнение WaitForSingleObject() для дескриптора процесса, возвращаемого CreateProcess(), однако я не думаю, что этот дескриптор доступен вам из WMI.

В этой статье предлагается еще один вариант, который вы могли бы рассмотреть - вместо того, чтобы опрашивать список процессов и ждать, пока ваш процесс исчезнет, ​​он неоднократно запрашивает события удаления процессов, соответствующие вашему идентификатору процесса:

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
objWMIService.Create "notepad.exe", null, null, intProcessID

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colMonitoredProcesses = objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceDeletionEvent Within 1 Where TargetInstance ISA 'Win32_Process'")

Do Until i = 1
    Set objLatestProcess = colMonitoredProcesses.NextEvent
    If objLatestProcess.TargetInstance.ProcessID = intProcessID Then
        i = 1
    End If
Loop

Вы также можете улучшить это, используя объект ManagementEventWatcher и его метод WaitForNextEvent, чтобы избежать необходимости опрашивать события удаления.

1 голос
/ 15 апреля 2009

Если процесс на удаленном компьютере является вашим кодом, вы можете открыть сокет на вызывающем компьютере и позволить удаленному компьютеру «пропинговать» его, когда он завершится.

Если вы хотите использовать этот метод для любого удаленного процесса, у вас может быть вспомогательное приложение / служба на удаленном компьютере, который отслеживает ваш процесс и возвращает завершенный пинг.

0 голосов
/ 02 мая 2012

У меня еще не было возможности проверить это,

int pid = (int) managementBaseObject ["processId"];

Process remPrc = Process.GetProcessById (pid, RemoteMachine);

remPrc.WaitForExit (); * +1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...