WMIを利用してWindowsをログオフ、シャットダウン、再起動する [C#]

C#でWMIを利用して、OSのログオフ(サインアウト)、シャットダウン、再起動をする方法を紹介します。

WMIとはWindows Management Infrastructureの略で、Windowsにおいて、システムについての様々な情報をソフトウェアなどから統一的な方法で取得・設定できるようにする、Windowsのシステム管理を行うためのインターフェイスです。

WMIを利用することで、Windowsのシステム情報が取得できる他、日付の設定やシャットダウンなどの操作を行うことができます。

WMIを利用してOSをシャットダウンする

WMIを操作するには、System.Management名前空間にあるManagementClassクラスを使用します。
ManagementClassクラスを使用することで、ディスクドライブを表す「Win32_LogicalDisk」や、Notepad.exeなどのプロセスを表す「Win32_Process」などの WMIクラスを作成できます。
Windowsのシャットダウン処理では、「Win32_OperatingSystem」クラスを作成して利用します。

ManagementClassクラスを使用してWin32_OperatingSystemクラスを作成するには、ManagementClassクラスのパラメーター(コンストラクタの引数)に文字列 “Win32_OperatingSystem” を渡してインスタンスを生成します。

生成したManagementClassオブジェクトのGetメソッドを使用して、Win32_OperatingSystemオブジェクトを取得して使用できるようにします。

ManagementClassオブジェクトのScopeプロパティで取得できる、ManagementScopeオブジェクトのOptionsプロパティで取得できる、ConnectionOptionsオブジェクトのEnablePrivilegesプロパティにTrueを指定して、適切な権限を利用可能にします。

ManagementClassオブジェクトのGetInstancesメソッドで、WMIのインスタンス(オブジェクト)のコレクションを取得します。

コレクションを列挙してManagementObjectを取得します。

ManagementObjectのInvokeMethodメソッドでシャットダウン処理を実行します。
InvokeMethodメソッドのパラメーターには、実行するメソッド名(文字列)とメソッドのパラメーター(オブジェクト配列)を指定します。

メソッドの実行後、ManagementObjectのDisposeメソッドでリソースを開放します。

サンプルプログラム

サンプルプログラムとして、Windowsのシャットダウンオプションを実行できるデスクトップアプリケーションを作成します。
サンプルプログラムを実装するためには、Visual Studioで作成したC#のプロジェクトにアセンブリ(System.Management.dll)への参照を追加する必要があります。
アセンブリを追加する方法については、以下の記事を参考にしてください。

WMIを利用してWindowsOSの情報を取得する [C#]
Windowsのシステム構成要素についての情報を取得できるWMI(Windows Management Infrastructure)を利用...

ユーザーインターフェース

サンプルプログラムはWindowsフォームアプリケーションで作成します。
フォームを作成し、シャットダウン処理を行うためのログオフ(サインアウト)ボタン(button1)、シャットダウンボタン(button2)、再起動ボタン(button3)、電源オフボタン(button4)を配置します。また、シャットダウン処理を強制的に実行するかどうかを示すチェックボックスも配置します。

WMIでWindowsをシャットダウンするサンプルフォームのデザイン

サンプルコード

ログオフ(サインアウト)、シャットダウン、再起動、電源オフの各ボタンのクリック時のイベント処理を実装します。

プログラムの実行

プロジェクトをビルドして実行(デバッグ)します。

WMIでWindowsをシャットダウンするサンプルフォーム

上記の画面が表示され、各ボタンをクリックした際に、シャットダウン処理が実行されれば実装は完了です。