うぃろぅです。
小ネタ。
探すのに割りと時間がかかったので自分用にメモ。
Windows サービスで自分自身のサービス名を取得する
こんなことする機会これ以降あるのかなって。
何がしたかったかってログファイルの名前にsc create
で設定した自分自身のサービス名をつけたかった。
WMIを使う
自分の知識不足というだけの話ではあるが、WMIというものを使うらしい。
WMI とは、Windows Management Instrumentation の略で、Windows のシステム管理のためのインターフェースとのこと。
以下の記事を読めば大体全部わかる。
調べた結果できあがったコードがこちら。
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); } }
ManagementObjectEnumerator
がmoeとかいう可愛さあふれる名前になっていたり最初の要素を取得するために説明もなくmoe.MoveNext()
って書いてあったり突っ込みどころは多いが、これでいけた。
スコープ短いし大目にみてくりゃれ。(CV.小清水亜美)
どうやら自分自身のIDでサービステーブルに対してSelectかけてるっぽい。
64bit版だろうが32bit版だろうがWin32_Service
を調べればいいらしい。実際に試したらどちらでもとることができた。
小ネタついでに時間表記指定はMM
なら24時間表記、mm
なら12時間表記。
ではまた。