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の結果を にキャストして、その戻り値を確認できます。InvokeMethoduint

呼び出しは既に同期しているはずですが、サービスが停止要求にすぐに応答しない場合、タイムアウトになる可能性があります。その場合は、常にサービスStateプロパティのチェックをループできます。

于 2012-11-21T12:53:53.990 に答える