0

我正在使用 WMI 停止远程机器上的服务:

    protected override void Execute()
    {
        ConnectionOptions connectoptions = new ConnectionOptions();
        connectoptions.Username = RemoteMachineUsername;
        connectoptions.Password = RemoteMachinePassword;

        ManagementScope scope = new ManagementScope(@"\\" + RemoteMachineName + @"\root\cimv2");
        scope.Options = connectoptions;
        SelectQuery query = new SelectQuery("select * from Win32_Service where name = '" + ServiceName + "'");
        using (ManagementObjectSearcher searcher = new
                    ManagementObjectSearcher(scope, query))
        {
            ManagementObjectCollection collection = searcher.Get();

                foreach (ManagementObject service in collection)
                {
                    if (service.GetPropertyValue("State").ToString().ToLower().Equals("running"))
                    {
                        //Stop the service
                        service.InvokeMethod("StopService", null);//HOW TO WAIT FOR THIS TO FINISH?
                    }
                }
        }
    }

现在,此方法在服务停止之前很久就完成了。我的问题是,我怎样才能等待服务停止,我怎么知道它是否成功。换句话说,我想以同步的方式做到这一点。

谢谢!

4

2 回答 2

3

ManagementObject.InvokeMethod 方法不同步执行,它是异步的。

您可以解析进程 id的输出参数:

//Execute the method
ManagementBaseObject outParams = 
processClass.InvokeMethod("Create", inParams, null);

//Display results
//Note: The return code of the method is provided
// in the "returnValue" property of the outParams object
Console.WriteLine("Creation of calculator " +
    "process returned: " + outParams["returnValue"]);
Console.WriteLine("Process ID: " + outParams["processId"]);

然后通过某种形式的轮询等待该过程完成。但是请注意,如果您的过程没有完成并退出,您可能会等待一段时间。可能有更好的解决方案 - 我目前也在研究这个问题。

于 2013-04-22T21:42:10.163 回答
1

StopService返回一个uint状态代码,您可以将InvokeMethod所有结果转换为 anuint并检查其返回值。

调用已经应该是同步的,但如果服务没有立即响应停止请求,它可能会超时。如果是这种情况,您可以随时循环检查服务State属性。

于 2012-11-21T12:53:53.990 回答