Windows Management Instrumentation

**Windows Management Instrumentation** (**WMI**) は、Windows Driver Modelへの拡張の一種で、システムの構成要素について情報収集と通知を行うオペレーティングシステム (OS) のインタフェースを提供する。WMI はDistributed Management Task Force (DMTF) の定めた Web-Based Enterprise Management (WBEM) と Common Information Model (CIM) 標準のマイクロソフトによる実装である。

WMI により、Windowsを搭載したパーソナルコンピュータやサーバをVBScriptやPowerShellのようなスクリプト言語で（ローカルでもリモートでも）管理できるようになる。WMIはWindows Vista、Windows Server 2003、Windows XP、Windows Me、Windows 2000に最初から実装されている。Windows 95およびWindows 98向けのWMIはダウンロード可能である。

また、マイクロソフトはWMIのキャラクタユーザインタフェースとして **Windows Management Instrumentation Command-line** (**WMIC**) を提供している。

## WMIの目的
WMIの目的は、オープンな仕様の管理情報を提供することで、各種OS環境で動作する管理アプリケーション群がそれら情報を共有できるようにすることである。WMIではシステム管理標準を定め、Desktop Management Interface (DMI) やSimple Network Management Protocol (SNMP) といった既存の管理標準との関連も定めている。WMIでは一様なモデルを提供することで他の標準を補っている。このモデルは、任意の情報源からの管理データを共通の方法でアクセスできる管理対象環境を表している。

## 概要
管理技法を統一して単純化するため、DMTFは統一的な方法で管理対象群を表現するCommon Information Model (CIM) を定義した。CIMオブジェクトモデルは、全てのメーカー（ハードウェア、ソフトウェア）が統一的に使える用語と意味論を用いたオブジェクトデータベースモデルである。このオブジェクトモデルはCIMリポジトリと呼ばれるデータベースに実装される。

CIMに基づき、WMIはDMTF標準をWindowsの各要素を表せるように拡張した実際の管理対象要素を含む。また、WMIはCOMにも対応しており、COM対応の各種アプリケーションが管理情報を利用可能としている。

インストール処理の一部として、マイクロソフトのアプリケーションの多く（Microsoft SQL Server、Exchange Server、Microsoft Office、Internet Explorer、Host Integration Server、Automated Deployment Servicesなど）は標準のCIMを拡張して、それぞれの管理情報をCIMリポジトリに格納する。これを「WMIクラス」と呼び、属性と値の組で管理情報を保持し、メソッドによって何らかのアクションを実行できるようになっている。管理対象へのアクセスは「プロバイダ」と呼ばれるソフトウェアコンポーネントを使って行われる。プロバイダの実体は、C/C++で書かれたCOMオブジェクトを実装したDLLである。プロバイダは特定の管理情報にアクセスするよう設計されているため、CIMリポジトリは「ネームスペース」と呼ばれる領域に論理的に分割されている。各ネームスペースは特定の管理領域に関わるクラス群についてのプロバイダ群が含まれる（例えば、Active DirectoryのためのRootDirectoryDAP、SNMP情報のための RootSNMP、Internet Information Services情報のためのRootMicrosoftIISv2など）。

CIMリポジトリ上の様々な管理情報を利用するため、WMIにはSQL風の言語であるWMI Query Language (WQL) が付属している。

## 開発プロセス
WMIはCIMとプロバイダ群によって管理対象を抽象化しているため、プロバイダの開発にはいくつかのステップが含まれる。主な4つのステップを以下に挙げる。

#ステップ1 - 管理対象モデルを作成
#* モデル定義
#* モデル実装
#ステップ2 - WMIプロバイダを作成
#* 実装すべきプロバイダの種類を決定
#* プロバイダのホスティングモデルを決定
#* ATLウィザードでプロバイダのテンプレートを作成
#* プロバイダのコードを実装
#* プロバイダを WMIとシステムに登録
#ステップ3 - プロバイダのテスト
#ステップ4 - 利用者サンプルコードを作成

## WMIプロバイダ
Windows NT 4.0 SP4のころ最初のWMI実装のリリースが行われて以来、マイクロソフトはWindowsにWMIプロバイダを着実に追加してきた。 Windows NT 4.0では、マイクロソフトは15のWMIプロバイダを実装していた。Windows 2000リリース時にはOSの一部として29のプロバイダが実装されていた。Windows Server 2003リリース時には80のプロバイダが実装されている。Windows Vistaでは新たなプロバイダが13個追加されており、全部で100近くのプロバイダが存在する。これにより、WMIはWindowsにおいて遍在する管理層としての地位を確立しつつある。

このような状況から、ITシステム管理の分野ではWMIに基づいたスクリプトや自動化プロシージャの開発が盛んになっている。単なるスクリプトだけでなく、MOM、SMS、ADS、HP OpenView for Windows (HPOV)、BMCソフトウェア、CAなどがWMIに基づいて管理情報を提供/操作するユーザインタフェースを管理ソフトウェアに追加している。これによりスクリプト作成ができない管理者も、特にWMIに関する知識を学ばなくともWMIを利用可能となっている。もちろんWMIはスクリプトによって操作可能であるため、スクリプトを使えた方が選択肢は広がる。

## 例
.NET FrameworkにはWMIのマネージラッパー (System.Management.dll) が用意されており、System.Management.ManagementClassクラスがCIM管理クラスを表している。WMIクラスは、ディスクドライブならWin32_LogicalDisk、Notepad.exeのような実行中プログラムならWin32_Processとなる。

以下の例は、"MSNdis_80211_ServiceSetIdentifier" を使って、システムが現在接続しているWi-FiネットワークのSSIDを探すC#プログラムのコードである。


```csharp
ManagementClass mc = new ManagementClass("root\\WMI", "MSNdis_80211_ServiceSetIdentifier", null);
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
    string wlanCard = (string)mo["InstanceName"];
    bool active = (bool)mo["Active"];
    byte[] ssid = (byte[])mo["Ndis80211SsId"];
}
```


## 参考文献


## 外部リンク
* WMI at the Windows Hardware Developer Central
* CIM terminology
* WMI Overview and Background
* WMI and CIM overview
* How improved support for WMI makes PowerShell the best environment to use and script WMI
* Working with WMI providers to PowerShell