代码之家  ›  专栏  ›  技术社区  ›  Dirk Vollmar

远程计算机上进程的WaitForExit

  •  5
  • Dirk Vollmar  · 技术社区  · 16 年前

    我在用 WMI to start a process on a remote machine . 创建进程的调用将立即返回,我还将获取远程计算机上进程的ID。

    我想等待远程进程完成。一个选项是轮询具有给定ID的远程计算机上的进程是否仍然存在。

    但是,我想知道是否有更好的方法来实现这一点,也许可以使用本地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 回复  |  直到 13 年前
        1
  •  4
  •   Shay Erlichmen    14 年前

    我不知道这有多有效,你可以用 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
  •  2
  •   snowcrash09    16 年前

    实现这一点的本机win32方法是执行 WaitForSingleObject() 在返回的进程句柄上 CreateProcess() 但是,我认为此句柄不能从WMI提供给您。

    This article 提供您可以考虑的另一个选项-它不会轮询进程列表并等待进程消失,而是重复查询与进程ID匹配的进程删除事件:

    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 方法以避免对删除事件进行轮询。

        3
  •  1
  •   stevehipwell    16 年前

    如果远程机器上的进程是您的代码,那么您可以打开调用机器上的一个套接字,让远程机器在完成后“ping”它。

    如果要对任何远程进程使用此方法,则可以在远程计算机上安装一个助手应用程序/服务来监视进程并返回已完成的ping。

        4
  •  0
  •   Derek    13 年前

    我还没有机会检查这个,

    int pid=(int)ManagementBaseObject[“processID”];

    process-remprc=process.getProcessByID(PID,远程机器);

    rempc.waitforexit();