Дождитесь завершения удаленного процесса в .net

Мы все знаем и любим Process.WaitForExit ().

Учитывая pid процесса на удаленной машине (созданной WMI / psexec), как мне ждать его завершения?

14.12.2008 09:20:01
3 ОТВЕТА
РЕШЕНИЕ
Process.GetProcessById(processId, machineName).WaitForExit();
0
27.09.2011 23:50:53
не уверен, как это должно быть правильным ответом. В соответствии с документом msdn.microsoft.com/en-us/library/fb4aw7b8.aspx SystemException будет выброшено, когда "Вы пытаетесь вызвать WaitForExit () для процесса, который выполняется на удаленном компьютере. Этот метод доступен только для процессов, запущенных на локальном компьютере. "
Simon 15.09.2011 00:36:35

Опросить удаленный компьютер, используя PSLIST SysInternals.

0
14.12.2008 10:49:00

Для меня Process.GetProcessByID () просто не работал (он утверждал, что не может подключиться к машине). Это сработало:

public static bool WaitForProcess(int pid, string machine, TimeSpan timeout)
{
  // busy wait
  DateTime start = DateTime.Now;
  while (IsAlive(pid, machine))
  {
    if (start.Add(timeout).CompareTo(DateTime.Now) <= 0)
      return false;

    Thread.Sleep(1000);
  }
  return true;
}

public static bool IsAlive(int pid, string machine)
{
  // doesn't work for me (throws "The network path was not found" exception)
  //return Process.GetProcessById(pid, @"\\" + machine) != null;
  string user;
  string domain;
  GetProcessInfoByPID(pid, machine, out user, out domain);
  return !string.IsNullOrEmpty(user);
}

public static string GetProcessInfoByPID(int PID, string machine, out string User, out string Domain)
{
  // copied from http://www.codeproject.com/KB/cs/processownersid.aspx?fid=323674&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2076667
  // with slight modifications
  ConnectionOptions connOptions = new ConnectionOptions();
  connOptions.Impersonation = ImpersonationLevel.Impersonate;
  connOptions.EnablePrivileges = true;
  ManagementScope manScope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", machine), connOptions);
  manScope.Connect();

  User = String.Empty;
  Domain = String.Empty;
  string OwnerSID = String.Empty;
  string processname = String.Empty;
  try
  {
    ObjectQuery sq = new ObjectQuery
      ("Select * from Win32_Process Where ProcessID = '" + PID + "'");
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(manScope, sq);
    if (searcher.Get().Count == 0)
      return OwnerSID;
    foreach (ManagementObject oReturn in searcher.Get())
    {
      string[] o = new String[2];
      //Invoke the method and populate the o var with the user name and domain
      oReturn.InvokeMethod("GetOwner", o);

      //int pid = (int)oReturn["ProcessID"];
      processname = (string)oReturn["Name"];
      //dr[2] = oReturn["Description"];
      User = o[0];
      if (User == null)
        User = String.Empty;
      Domain = o[1];
      if (Domain == null)
        Domain = String.Empty;
      string[] sid = new String[1];
      oReturn.InvokeMethod("GetOwnerSid", sid);
      OwnerSID = sid[0];
      return OwnerSID;
    }
  }
  catch
  {
    return OwnerSID;
  }
  return OwnerSID;
}
2
14.12.2008 12:16:57