うぃろぅ.log

140字で綴りきれない日々の徒然備忘録

【Windows サービス】 自分自身のサービス名を取得する

うぃろぅです。

小ネタ。
探すのに割りと時間がかかったので自分用にメモ。

Windows サービスで自分自身のサービス名を取得する

こんなことする機会これ以降あるのかなって。
何がしたかったかってログファイルの名前にsc createで設定した自分自身のサービス名をつけたかった。

WMIを使う

自分の知識不足というだけの話ではあるが、WMIというものを使うらしい。
WMI とは、Windows Management Instrumentation の略で、Windows のシステム管理のためのインターフェースとのこと。
以下の記事を読めば大体全部わかる。

uchukamen.com

調べた結果できあがったコードがこちら。

public static void SetupLogConfig()
{
    var LogFolderPath = @"C://foo";

    // ManegementObjectSercherを使って自身のプロセスIDのサービス情報を取得し、
    // サービス情報からサービス名を取得
    var wmi = new System.Management.ManagementObjectSearcher(
        "select name from Win32_Service where ProcessId = "
        + System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
    var moe = wmi.Get().GetEnumerator();
    moe.MoveNext();
    var serviceName = moe.Current["name"].ToString();

    // 日付を取得し、ログ名とパスを設定
    var date = System.DateTime.Now.ToString("yyyyMMdd");
    logName = $"{serviceName}_{date}.log";
    logPath = System.IO.Path.Combine(LogFolderPath, logName);

    // ログ出力ディレクトリ作成
    if (!System.IO.Directory.Exists(LogFolderPath))
    {
        System.IO.Directory.CreateDirectory(LogFolderPath);
    }
}

ManagementObjectEnumeratormoeとかいう可愛さあふれる名前になっていたり最初の要素を取得するために説明もなくmoe.MoveNext()って書いてあったり突っ込みどころは多いが、これでいけた。
スコープ短いし大目にみてくりゃれ。(CV.小清水亜美)

どうやら自分自身のIDでサービステーブルに対してSelectかけてるっぽい。 64bit版だろうが32bit版だろうがWin32_Serviceを調べればいいらしい。実際に試したらどちらでもとることができた。

小ネタついでに時間表記指定はMMなら24時間表記、mmなら12時間表記。

ではまた。