[C#] ManagementObjectを利用したWindowsサービスの操作まとめ


はじめに

C#でのサービスの開始・停止などは「System.ServiceProcess.ServiceControllerクラス」を利用して行うのが結構一般的ですが、今回はManagementObjectを利用した操作についての備忘録です。

本クラスを利用すると、結構汎用的にアクションを起こせるので重宝しています。

 

処理概要


using System.Management;

namespace sample
{
    class SampleClass
    {
        public void ServiceUtil(string svcName, string actionName, object[] actionParams)
        {
            string objectPath = $"Win32_Service.Name={svcName}";

            using(var srv = new ManagementObject(new ManagementPath(objectPath)))
            {
                try
                {
                    var result = srv.InvokeMethod(actionName, actionParams);
                    Console.WriteLine(result);
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine(e.StackTrace);
                }
            }
        }
    }
}

利用方法

サービス開始

string serviceName = "[serviceName]";
ServiceUtil(serviceName, "StartService", null);

※ [serviceName]には実際に起動するサービス名を記載する。

 

サービス停止

string serviceName = "[serviceName]";
ServiceUtil(serviceName, "StopService", null);

※ [serviceName]には実際に起動するサービス名を記載する。

 

サービスのモード変更

string serviceName = "[serviceName]";
string actionName = "Automatic";
ServiceUtil(serviceName, "StopService", new object[] {actionName});

※ [serviceName]には実際に起動するサービス名を記載する。

actionNameに指定できる値は下記の通りである。

アクション名 説明
Automatick システムの起動時に、オペレーティング システムによってサービスが開始します
Boot サービスがシステム ローダーによって開始されるデバイス ドライバーであることを示します。
Disabled ユーザーまたはアプリケーションによってサービスが開始できないよう、サービスが無効になっていることを示します。
Manual サービスが ユーザー (サービス コントロール マネージャーを使用) によって手動でのみ開始されるか、またはアプリケーションによって開始されるかを示します。
System サービスが IOInitSystem 関数によって開始されるデバイス ドライバーであることを示します。

下記参考

 

最後に

Windowsサービスに関する操作は意外にシンプルにできちゃいます。

一度汎用メソッドを作っておけば、あとは呼び出すだけです。

是非、参考にしてみてください。