印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
コラム
Scripting Clinic
 WMI スクリプト入門 : 第 1 部
WMI スクリプト入門 : 第 1 部

Greg Stemp, Dean Tsaltas, and Bob Wells
Microsoft Corporation

Ethan Wilansky
Network Design Group

June 13, 2002
日本語版最終更新日 2002 年 10 月 2 日

要約 : Scripting Guys による "Scripting Clinic" の最初のコラムでは、WMI スクリプト ライブラリを使用して、役に立つ Windows® システム管理スクリプトを作成する方法について説明します。

Microsoft® Windows Management Instrumentation (WMI) は、Microsoft の最大の秘密です。あるいは、そのように言われています。いずれにせよ、WMI が "Windows の管理を可能にする Microsoft の主要なテクノロジ" であることには間違いありません。これがどのようにみなさんに影響するかというと、Windows サーバーやワークステーションを管理したり、Windows 管理アプリケーションを作成したりするには、WMI を理解している必要があります。この記事は WMI について学習するシリーズの初回で、具体的には、WMI スクリプト ライブラリを使用して多数の Windows システム管理スクリプトを作成する方法を学習します。

本題に入る前に、"Scripting Clinic" を継続する機会を与えてくれた Andrew Clinick に感謝します。Andrew が最後のコラムでより多くの仕事を他人に委せる予定であると言ったのは冗談ではなかったのです。実は、Andrew は別のプロジェクトに移ることになり、彼の後を引き継いでくれるように丁重にお願いされました。Andrew は "Scripting Clinic" のクオリティを高く設定したので最初はためらいもありましたが、今では嬉しく思っています。

ここで、自己紹介をさせていただきます。私たち Scripting Guys は、Microsoft Windows Server 2003 リソース キットの一部として出荷される新しいマニュアル『System Administration Scripting Guide』の執筆チームです。コラムの顔写真 (英語) で、左側にいるのが Dean で右側が Greg です。噂によると、Ethan と Bob は週に 1 度の若返り療法の予約があって、写真撮影のチャンスを逃したそうです。Ethan と Bob の顔写真が掲載されたときとてもハンサムに写っていたとしても、本当はとても野暮な奴であることをここでお伝えしておきます。くれぐれもご注意ください。

WMI の概要

WMI は 1998 年に Windows NT® 4.0 Service Pack 4 のアドオン コンポーネントとして最初にリリースされた、管理のための中核的なテクノロジで、Windows 2000、Windows XP、および Windows Server 2003 ファミリの各オペレーティング システムに組み込まれています。WMI は Distributed Management Task Force (DMTF) が監視する業界標準に基づいており、すべての (ほとんどすべての) Windows リソースへのアクセス、構成、管理、および監視を可能にする管理基盤です。

WMI の能力と規模を把握するには、以前から、場合によっては今日、どのような方法で Windows のワークステーションやサーバーを管理し、監視したかを考えてください。Windows リソースには、ディスク、イベント ログ、ファイル、フォルダ、ファイル システム、ネットワーキング コンポーネント、オペレーティング システム設定、パフォーマンス データ、プリンタ、プロセス、レジストリ設定、セキュリティ、サービス、共有、ユーザー、グループなどがありますが、これらを管理するために、現在に至るまで多数のグラフィカル管理ツールが使用されています。

グラフィカル ツールは機能的な管理ソリューションを提供してきましたが、これらすべてに共通して言えることは何でしょうか。答えの 1 つとしては、WMI の導入以前の Windows グラフィカル管理ツールはすべて Win32® アプリケーション プログラミング インタフェース (API) に依存して Windows リソースのアクセスおよび管理を行っていました。なぜでしょうか。WMI の導入以前は、Win32 API を通じてアクセスする方法が、プログラムから Windows リソースにアクセスする唯一の方法だったためです。ほとんどのスクリプト言語は Win32 API を直接呼び出すことができないため、この状況において、Windows システム管理者は、よく使われるスクリプト言語を使用して一般的なシステム管理タスクを自動化する簡単な方法を実行できませんでした。WMI によってこの状況が一変し、一貫したモデルとフレームワークを通じてすべての Windows リソースを表現し、外部の世界に公開することが可能になりました。とりわけ、システム管理者は、WMI スクリプト ライブラリを使用してシステム管理スクリプトを作成し、WMI を通じて公開されるあらゆる Windows リソースを管理できるようになりました。

Windows スクリプト ホストと Microsoft Visual Basic® Scripting Edition (VBScript)、または COM オートメーションをサポートする任意のスクリプト言語 (ActiveState Corporation の ActivePerl など) を使用すると、次のような側面からエンタープライズ システム、アプリケーション、およびネットワークの管理と自動化を実現するスクリプトを作成できます。


  • Windows Server 2003、Windows XP Professional、および Windows 2000 システムの管理 - パフォーマンス データ、マネージ イベント ログ、ファイル システム、プリンタ、プロセス、レジストリ設定、スケジューラ、セキュリティ、サービス、共有、その他多数のオペレーティング システム コンポーネントおよび構成の設定を取得するスクリプトを作成できます。
  • ネットワーク管理 - DNS、DHCP、および SNMP に対応したデバイスなど、ネットワーク サービスを管理する WMI ベースのスクリプトを作成できます。
  • リアルタイムの状態監視 - WMI イベント サブスクリプションを使用してスクリプトを作成すると、イベント ログ エントリの発生、ファイル システムとレジストリの変更、およびその他のリアルタイムのオペレーティング システムの変更に対する監視と応答が可能になります。概念的に、WMI にとって WMI のイベント サブスクリプションと通知は、SNMP の世界での SNMP トラップと同じです。
  • .NET Enterprise Server の管理 - Microsoft Application Center、Operations Manager、Systems Management Server、Internet Information Server、Exchange Server、および SQL Server を管理するスクリプトを作成できます。

WMI スクリプトのクイック スタート

ここでは、WMI スクリプトの全体像を把握するために、Windows ベースのリモート コンピュータに搭載された物理メモリの合計容量を取得するという一見ありふれたタスクについて考察します。WMI の導入以前は、サードパーティ製ツールの追加なしでスクリプトを使用してこのタスクを実行することは簡単にはできませんでした。実際に、WMI の導入以前は、オペレーティング システムに組み込まれたツールを使用してコンピュータに搭載されたメモリ容量を確認するには、[システムのプロパティ] ダイアログ ボックスで確認するより他に方法がありませんでした。現在では、ターゲット コンピュータに WMI がインストールされている場合は、そのコンピュータに管理者としてアクセスする権限がある限り、リスト 1 に示すような簡単な WMI スクリプトを使用して、リモート Windows コンピュータに搭載された物理メモリの容量を取得できます。

リスト 1. WMI と VBScript を使用して物理メモリの合計を取得する

                  
strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_LogicalMemoryConfiguration")

For Each wbemObject In wbemObjectSet
    WScript.Echo "物理メモリの合計 (kb): " & wbemObject.TotalPhysicalMemory
Next

                

リスト 1 のスクリプト例を実行するには、テキスト エディタ (notepad.exe など) にスクリプトをコピーして貼り付け、変数 strComputer に割り当てられた値をドメイン内の有効な WMI 対応コンピュータに置き換え、拡張子 .vbs を付けてスクリプトを保存し、図 1 に示すようにスクリプトを実行します。

ms974579.scripting06112002_fig1(ja-jp,MSDN.10).gif

図 1. GetMemory.vbs の出力


入力ミスがなければ、簡単な手品のように、ターゲット コンピュータの物理メモリ容量がコンソールに表示されるのを確認できます。

「コンピュータのメモリ容量を取得するのに、どうしてスクリプトを 6 行も書かなければならないんだ。」と思われるかもしれませんが、もう少し説明させてください。なぜなら、リスト 1 と同じ基本手順を使用すれば、WMI を通じて公開されるあらゆる Windows リソースの構成とステータス情報を取得できるからです。

たとえば、リモート コンピュータにインストールされたすべてのサービスについて、名前、状態、およびスタートアップ タイプを取得することも可能です。リスト 2 のスクリプト例では、リスト 1 と同じ基本手順を使用して、まさしく今述べた操作を実行します。

リスト 2. WMI および VBScript を使用してサービス情報を取得する

                  
strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Service")

For Each wbemObject In wbemObjectSet
    WScript.Echo "表示名:  " & wbemObject.DisplayName & vbCrLf & _
                 "   状態:      " & wbemObject.State       & vbCrLf & _
                 "   スタート モード: " & wbemObject.StartMode
Next

                

リスト 2 を実行すると、出力は図 2 のようになります。

ms974579.scripting06112002_fig2(ja-jp,MSDN.10).gif

図 2. GetServices.vbs の出力


たとえば、サービスには関心がないけれども、Windows イベント ログのレコードを取得する必要があるとします。ここでも、リスト 1 のスクリプト テンプレートを使用すれば、リスト 3 のように Windows イベント ログの読み取りが簡単に実行できます。リスト 3 を実行する前に、イベント ログに数千件のレコードが含まれている場合はスクリプト例の実行に時間を要することを指摘しておきます。

リスト 3. Windows イベント ログ レコードを読み取る

                  
strComputer = "atl-dc-01"

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_NTLogEvent")

For Each wbemObject In wbemObjectSet
    WScript.Echo "ログ ファイル:        " & wbemObject.LogFile        & vbCrLf & _
                 "レコード番号:   " & wbemObject.RecordNumber   & vbCrLf & _
                 "タイプ:            " & wbemObject.Type           & vbCrLf & _
                 "生成時刻:  " & wbemObject.TimeGenerated  & vbCrLf & _
                 "ソース:          " & wbemObject.SourceName     & vbCrLf & _
                 "カテゴリ:        " & wbemObject.Category       & vbCrLf & _
                 "カテゴリ文字列: " & wbemObject.CategoryString & vbCrLf & _
                 "イベント:           " & wbemObject.EventCode      & vbCrLf & _
                 "ユーザー:            " & wbemObject.User           & vbCrLf & _
                 "コンピュータ:        " & wbemObject.ComputerName   & vbCrLf & _
                 "メッセージ:         " & wbemObject.Message        & vbCrLf
Next

                

リスト 1、2、3 を詳しく見てみると、3 つのスクリプトについて 2 つの重要な点を挙げることができます。第 1 の点は、3 つのスクリプトがどれも同じ 3 つの手順を実行していることです。どのスクリプトも WMI に接続し、WMI マネージ リソースを取得し、リソースのいくつかのプロパティを表示します。第 2 の点は、ターゲット リソースを識別するクラス名 (Win32_LogicalMemoryConfiguration、Win32_Service、および Win32_NTLogEvent) とリソースのプロパティのみが各スクリプトで変更されていることです。

各スクリプトで使用されている 3 つの手順は、WMI マネージ リソースに関する情報を取得するすべての WMI スクリプトに共通しています。各手順についてもう少し詳しく考察してみましょう。

手順 1 : WMI サービスに接続する

WMI スクリプトの最初の手順では、ターゲット コンピュータの Windows Management サービスとの接続を確立します。ローカルまたはリモート コンピュータ上で WMI に接続するには、VBScript の Getobject 関数を呼び出し、WMI スクリプト ライブラリのモニカ名である "winmgmts:" に続けてターゲット コンピュータの名前を指定して GetObject に渡します。

この方法で WMI に接続すると、SWbemServices オブジェクトへの参照が返されます。リスト 1、2、3 では wbemServices という変数を使用してこれを参照しています。SWbemServices は、WMI スクリプト ライブラリに定義された約 1 ダースのオブジェクトのうちの 1 つです。WMI スクリプト ライブラリには、WMI インフラストラクチャにアクセスするスクリプトで使用される、汎用目的オブジェクトのセットが用意されています。SWbemServices オブジェクトへの参照を取得した後は、SWbemServices で用意されている任意のメソッドを呼び出すことが可能になります。InstancesOf はそのようなメソッドの 1 つです。

手順 2 : WMI マネージ リソースのインスタンスを取得する

明らかなことですが、2 番目の手順は、実行するタスクによって大きく異なります。WMI マネージ リソースに関する情報を取得する場合、手順 2 では、SWbemServices オブジェクトの InstancesOf メソッドを呼び出すだけです。メソッド名が示唆するように、InstancesOf は、リソースのクラス名によって識別されるマネージ リソースのインスタンスをすべて返します。InstancesOf を使用すると、要求したリソースが SWbemObjectSet コレクションとして返されます。リスト 1、2、3 では、wbemObjectSet という変数を使用してこれを参照しています。SWbemObjectSet は、WMI スクリプト ライブラリに定義されたもう 1 つのスクリプト オブジェクトです。

手順 3 : WMI マネージ リソースのプロパティを表示する

最後の手順では、SWbemObjectSet コレクションの内容を列挙します。SWbemObjectSet の各アイテムは、要求したリソースの 1 つのインスタンスを表す SWbemObject (WMI スクリプト ライブラリのもう 1 つのオブジェクト) です。SWbemObject を使用して、マネージ リソースのクラス定義に定義されたメソッドとプロパティにアクセスします。

これで、WMI から情報を取得するスクリプトでは、同じ手順が使用されていることがわかりました。ところで、Win32_LogicalMemoryConfiguration、Win32_Service、Win32_NTLogEvent とはどのようなクラスでしょうか。これらのクラスはどこから来たのでしょうか。また、他にはどのようなクラスがあり、どのように使用するのでしょうか。これらの質問の答えは、WMI アーキテクチャを構成するコンポーネントにあります。以下では WMI アーキテクチャについて考察します。

WMI アーキテクチャ

図 3 に示すように、WMI アーキテクチャは主要な 3 つの層によって構成されています。

  • マネージ リソース
  • WMI インフラストラクチャ
  • コンシューマ

ms974579.scripting06112002_fig3(ja-jp,MSDN.10).gif

図 3. WMI アーキテクチャ


ここでは、リソースが存在する最下位の層から始めます。

マネージ リソース

マネージ リソースは、WMI を使用して公開および管理される、あらゆる論理または物理コンポーネントです。WMI を使用して管理される Windows リソースの例としては、コンピュータ システム、ディスク、周辺機器、イベント ログ、ファイル、フォルダ、ファイル システム、ネットワーキング コンポーネント、オペレーティング システム サブシステム、パフォーマンス カウンタ、プリンタ、プロセス、レジストリ設定、セキュリティ、サービス、共有、SAM ユーザーおよびグループ、Active Directory?、Windows インストーラ、Windows Driver Model (WDM) デバイス ドライバ、SNMP Management Information Base (MIB) データなどがあり、これらはほんの一部にすぎません。WMI マネージ リソースは、プロバイダを通じて WMI と通信します。WMI マネージ リソースと通信するスクリプトを書くようになると、"インスタンス (instance)" という用語が実行中のスクリプトでマネージ リソースの仮想表現を参照するために使われているのを頻繁に見かけるようになります。

WMI インフラストラクチャ

中間層は WMI インフラストラクチャです。WMI は、Common Information Model オブジェクト マネージャ (CIMOM)、Common Information Model (CIM) リポジトリ、およびプロバイダから成る主要な 3 つのコンポーネントで構成されています。この 3 つの WMI コンポーネントを合わせると、構成データおよび管理データの定義、公開、アクセス、取得が行われるインフラストラクチャとなります。小規模でもスクリプトに欠かせない 4 番目のコンポーネントは、WMI スクリプト ライブラリです。

WMI プロバイダ

WMI プロバイダは、WMI とマネージ リソースとの間の仲介としての役割を果たします。プロバイダは、コンシューマのアプリケーションやスクリプトの代わりに、WMI マネージ リソースの情報を要求し、命令を送信します。たとえば、リスト 1 と 2 では、組み込みの Win32 プロバイダを使用してメモリとサービスの関連情報を取得しています。リスト 3 では、組み込みの Event Log プロバイダを使用して、Windows イベント ログのレコードを取得しています。

プロバイダは、WMI の標準に準拠した、統一されたアクセス モデルに基づいて、マネージ リソースを WMI インフラストラクチャに公開し、マネージ リソース固有の実装詳細を隠します。WMI プロバイダは、マネージ リソースのネイティブ API を使用して各マネージ リソースと通信し、WMI プログラミング インタフェースを使用して CIMOM と通信します。たとえば、組み込みの Event Log プロバイダは、Win32 Event Log の API を呼び出してイベント ログにアクセスします。

ソフトウェア開発者は、WMI の拡張可能アーキテクチャに基づいて、アドオン プロバイダを開発および統合し、各製品に固有の管理機能を公開できます。例を挙げると、Exchange コネクタ ステータスを監視する Exchange Server 2000 プロバイダなどがあります。同様に、Application Center、Operations Manager、Systems Management Server、Internet Information Server、SQL Server のすべてに WMI プロバイダが組み込まれています。

通常、プロバイダは、%SystemRoot%\system32\wbem ディレクトリに存在するダイナミック リンク ライブラリ (DLL) として実装します。WMI には、Windows 2000、Windows XP、および Windows Server 2003 ファミリのオペレーティング システムのための多数の組み込みプロバイダがあります。組み込みのプロバイダは、標準プロバイダとも呼ばれ、Win32 サブシステム、イベント ログ、パフォーマンス カウンタ、レジストリなどの既知のオペレーティング システム ソースからデータと管理機能を提供します。表 1 に、Windows 2000、Windows XP、および Windows Server 2003 ファミリのオペレーティング システムに組み込まれた標準 WMI プロバイダの一部を示します。

表 1. 標準 WMI プロバイダの一部のリスト


プロバイダDLL名前空間説明
Active Directory プロバイダdsprov.dllroot\directory\ldapActive Directory オブジェクトを WMI にマッピングします。
Event Log プロバイダntevt.dllroot\cimv2Windows イベント ログを管理します。イベント ログ設定の読み取り、バックアップ、クリア、コピー、削除、監視、名前変更、圧縮、圧縮解除、変更などを行います。
Performance Counter プロバイダwbemperf.dllroot\cimv2生のパフォーマンス データへのアクセスを提供します。
Registry プロバイダstdprov.dllroot\defaultレジストリのキーおよび値の読み取り、書き込み、列挙、監視、作成、削除などを行います。
SNMP プロバイダsnmpincl.dllroot\snmpSNMP MIB データへのアクセスを提供し、SNMP によって管理されたデバイスからトラップします。
WDM プロバイダwmiprov.dllroot\wmiWDM デバイス ドライバ上の情報へのアクセスを提供します。
Win32 プロバイダcimwin32.dllroot\cimv2コンピュータ、ディスク、周辺機器、ファイル、フォルダ、ファイル システム、ネットワーキング コンポーネント、オペレーティング システム、プリンタ、プロセス、セキュリティ、サービス、共有、SAM ユーザーおよびグループなどの情報を提供します。
Windows Installer プロバイダmsiprov.dllroot\cimv2インストールされたソフトウェアに関する情報へのアクセスを提供します。

Windows XP と Windows Server 2003 には追加の標準プロバイダが多数組み込まれています。標準プロバイダの完全な一覧については、WMI Software Developers Kit (SDK) ドキュメントの「WMI Providers」(英語) のリファレンスを参照してください。

CIMOM

CIMOM ("シーマム" と呼ぶ) は、コンシューマとプロバイダ間の通信を処理します。この用語は、Web ベースの Enterprise Management イニシアチブと、Distributed Management Task Force (英語) が管理する Common Information Model の仕様に由来します。

CIMOM は WMI 情報のブローカーです。すべての WMI 要求およびデータ フローは CIMOM を通じて行います。Windows Management Instrumentation サービス winmgmt.exe は、Windows XP および Windows Server 2003 ファミリのオペレーティング システムで CIMOM の役割を果たし、汎用サービス ホスト プロセス svchost.exe の制御下で実行されます。

注 : Windows 2000 または Windows NT 4.0 Service Pack 4 が稼動しているコンピュータでは、WMI サービスは別のサービス プロセスとして実行されます。Windows Millennium Edition (Me)、Windows 98、または Windows 95 OSR 2.5 が稼動しているコンピュータでは、WMI は標準の実行可能プロセスとして実行されます。

CIMOM は、コンシューマが WMI にアクセスするための共通インタフェースを提供します。さらに、WMI インフラストラクチャに対して次のような中核となるサービスを提供します。


  • プロバイダの登録 - WMI プロバイダは、場所と機能に関する情報を CIMOM によって登録します。この情報は、CIM リポジトリに格納されます。
  • 要求のルーティング - CIMOM はプロバイダ登録情報を使用して、コンシューマの要求を適切なプロバイダにルーティングします。
  • リモート アクセス - コンシューマは、リモート システム上の CIMOM に接続して、リモートの WMI 対応システムにアクセスします。接続が確立された後、コンシューマは同じ操作をローカルで実行することが可能になります。
  • セキュリティ - CIMOM は、ローカル コンピュータまたはリモート コンピュータで、各ユーザーのアクセス トークンの有効性を検査してから WMI への接続を許可することで、WMI マネージ リソースへのアクセスを制御します。WMI はオペレーティング システムが提供するセキュリティをオーバーライドしたり回避したりしません。
  • クエリ処理 - コンシューマは WMI Query Language (WQL) を使用して、任意の WMI マネージ リソースに対するクエリを発行することができます。たとえば、24 時間以内に発生した特定のイベント ID に一致するすべてのイベント ログに対してクエリを発行できます。プロバイダがネイティブでクエリ処理をサポートしない場合、CIMOM がクエリを評価します。
  • イベント処理 - WMI マネージ リソースに対する変更を表すイベントへのコンシューマの加入が可能になります。たとえば、論理ディスク ドライブの容量が容認できるしきい値を下回ったことを示すイベントへの加入が可能です。CIMOM は指定の間隔でマネージ リソースをポーリングし、サブスクリプションが満たされたときにイベント通知を生成します。

管理アプリケーション、管理ツール、およびスクリプトは、CIMON を利用してデータの採掘、イベントへの加入、または管理に関連するその他のタスクを実行します。CIMOM は、コンシューマの要求をサービスするために必要なプロバイダやクラスの情報を CIM から取得します。CIMOM は CIM から取得した情報を使用して、コンシューマの要求を適切なプロバイダに渡します。

CIM リポジトリ

WMI は、異なるソースの構成情報と管理情報はスキーマにより統一的に表現できるという思想に基づいています。CIM はスキーマであり、オブジェクト リポジトリまたはクラス ストアとも呼ばれ、マネージ環境をモデル化し、WMI が公開するすべてのデータを定義します。スキーマは DMTF Common Information Model 標準 (英語のドキュメント) に準拠しています。

クラスの概念に基づいて構築される Active Directory のスキーマと同様に、CIM は "クラス" で構成されます。クラスは WMI で管理されるリソースの青写真です。ただし、作成されディレクトリに格納されるオブジェクトを表す Active Directory クラスとは異なり、CIM クラスは通常は動的なリソースを表します。つまり、リソースのインスタンスは CIM に格納されているのではなく、コンシューマの要求に基づいてプロバイダにより動的に取得されます。これは単純な理由によります。ほとんどの場合、WMI マネージ リソースは稼動状態が頻繁に変わるので、オンデマンドで読み取ることで最新情報を取得する必要があるためです。

注 : CIM では "リポジトリ" という用語が誤解を招くことがあります。CIM はリポジトリであって静的なデータの格納が可能ですが、CIM の主要な役割はマネージ リソースの青写真を格納することです。

Active Directory クラスと同様、CIM クラスも階層的に編成され、子クラスが親クラスから継承します。DMTF はコア クラスおよびコモン クラスの一連の基本クラスを管理しており、Microsoft などのシステムやアプリケーション ソフトウェアの開発者は、これらのクラスからシステムまたはアプリケーションに固有の拡張クラスを派生し、作成します。

クラスは特定の管理領域を表す論理グループとして、"名前空間" にグループ化されています。たとえば、一般にコンピュータとオペレーティング システムに関連付けられたリソースを表すほとんどのクラスは、root\cimv2 名前空間に含まれます。前のスクリプトで使用したクラス (Win32_LogicalMemoryConfiguration、Win32_Service、および Win32_NTLogEvent) は root\cimv2 名前空間に存在し、CIM に定義された事実上数百ものクラスのうちの 3 つにすぎません。

CIM クラスはプロパティおよびメソッドで構成されています。プロパティは WMI マネージ リソースの構成と状態を表し、メソッドは WMI マネージ リソースに対する操作を実行する実行可能な関数です。

注 : CIM クラスで定義されたメソッドおよびプロパティと、WMI スクリプト ライブラリのオートメーション オブジェクトが提供するメソッドおよびプロパティとを混同しないでください。

CIM は物理的に %SystemRoot%\system32\wbem\Repository\FS\ ディレクトリに存在し、次の 4 つのファイルから構成されています。


  • index.btr - バイナリツリー (btree) インデックス ファイル。
  • index.map - トランザクション制御ファイル。
  • objects.data - マネージ リソース定義が格納されている CIM リポジトリ。
  • objects.map - トランザクション制御ファイル。

注 : Microsoft Windows 2000 と Windows NT 4.0 Service Pack 4 では、CIM は %SystemRoot%\system32\wbem\Respository\cim.rep に格納されています。Windows Millennium Edition (Me)、Windows 98、および Windows 95 OSR 2.5 オペレーティング システムでは、CIM は %windir%\system\wbem\Respository\cim.rep に格納されています。

CIM はオブジェクト指向設計の原則に基づいていますが、WMI の使用や WMI ベースのスクリプト作成の生産性を向上させるために情報モデリングまたはスキーマ設計の熟練者になる必要はありません。重要なのは CIM の基本構造と組織を理解し、CIM 内部でどのようにナビゲートし、内容を解釈したらよいかわかっていることです。

WMI スクリプト ライブラリ

WMI スクリプト ライブラリにはオートメーション オブジェクトのセットが用意されています。VBScript、Jscript、および ActiveState の ActivePerl などのスクリプト言語では、これらを通じて WMI インフラストラクチャにアクセスします。

WMI スクリプト ライブラリのオートメーション オブジェクトは、WMI インフラストラクチャのための一貫性のある統一されたスクリプト モデルを提供します。前に示したように、WMI スクリプト ライブラリを使用してあるタイプのマネージ リソースを取得する方法を理解したら、同じ手順を使用して他の WMI マネージ リソースを簡単に取得できます。前に示した 3 つのスクリプトのいずれかを選び、スクリプトに簡単な修正を加えるだけで、リモート コンピュータで実行しているプロセス (Win32_Process) に関する情報、プロセッサ (Win32_Processor) の情報、オペレーティング システム (Win32_OperatingSystem) の情報、または WMI によって公開される多数のマネージ リソースのうちのどれでも取得することが可能です。

WMI スクリプト ライブラリは、%SystemRoot%\system32\wbem ディレクトリに物理的に存在する wbemdisp.dll という単一の DLL に実装されます。WMI スクリプト ライブラリには wbemdisp.tlb というタイプ ライブラリも含まれています。WMI スクリプト タイプ ライブラリを使用すると、XML ベースの Windows スクリプト ファイル、拡張子 .wsf を持つ WSH スクリプトから WMI の定数を参照できます。

WMI コンシューマ

最上位層はコンシューマです。コンシューマはスクリプト、エンタープライズ管理アプリケーション、Web ベースのアプリケーション、またはその他の管理ツールであり、WMI インフラストラクチャを通じて利用可能な管理情報のアクセスおよび管理を行います。

注 : 多くの管理アプリケーションは、WMI コンシューマおよび WMI プロバイダとして二重の役割を果たします。Application Center、Operations Manager、Systems Management Server などの Microsoft 管理製品もこれに該当します。

CIM を探索する

ここまでにかなりの量のマテリアルについてふれましたが、まだ説明していない点が 1 つあります。それは、WMI を通じて公開されるリソースを決定する方法です。いくつかのツールを使用して、CIM スキーマを参照し、WMI マネージ リソースのクラス定義を調べることができます。

  • WMI コントロール - WMI コントロール (wmimgmt.msc) は、ローカル コンピュータまたはリモート コンピュータでの WMI 設定の構成を可能にする Microsoft 管理コンソール (MMC) スナップインです。WMI コントロールを使用して CIM を参照することはできませんが、ツールの [セキュリティ] タブで、ローカル コンピュータまたはリモート コンピュータで使用可能な CIM 名前空間を指定できます。WMI コントロールの使用の詳細については、Windows 2000 ヘルプまたは Windows XP のヘルプ、およびサポート センターの WMI コントロールの概要を参照してください。
  • WMI Tester - WMI Tester (wbemtest.exe) は、WMI インフラストラクチャとのやり取りを行う汎用グラフィカル ツールです。WMI Tester を使用して CIM スキーマを参照し、マネージ リソースのクラス定義を調べることができます。また、マネージ リソースのインスタンスの取得やクエリの実行など、WMI ベースのスクリプトと同じ操作を行うことも可能です。WMI Tester は WMI 対応のすべてのコンピュータでの既定の WMI インストールに含まれているため、wbemtest.exe は WMI の学習およびトラブルシューティングのためのツールとして最適です。WMI Tester の使用の詳細については、Windows XP のヘルプおよびサポート センターの WMI Tester の概要を参照してください。
  • WMI コマンド ライン - Windows XP の一部としてリリースされた WMI コマンド ライン ツール (wmic.exe) には、WMI インフラストラクチャに対応するコマンド ライン インターフェイスが用意されています。wmic.exe を使用すると、CIM の参照や CIM クラス定義のチェックなどの一般的な WMI タスクをコマンド ラインから実行できます。WMI コマンド ライン ツールの使用の詳細については、Windows XP のヘルプおよびサポート センターの WMI コマンド ライン (WMIC) ツールの使用に関するトピックを参照してください。
  • CIM Studio - WMI SDK の一部である CIM Studio には、WMI インフラストラクチャとのやり取りを行うための Web ベースのインターフェイスが用意されています。WMI Tester と同様に、CIM Studio を使用して CIM スキーマの参照、クラス定義の表示、マネージ リソースのインスタンスの取得を行うことができます。CIM Studio の優れたユーザー インターフェイスを使用すると、クラスの関係や関連付けを簡単に表示できます。また、CIM Studio には基本的な検索機能があり、これらの 2 つの機能は WMI Tester ツールには用意されていません。CIM Studio を使用するには、WMI SDK をダウンロードしてインストールする必要があります。WMI SDK は、Windows Management Instrumentation (WMI) SDK (英語) からダウンロードできます。
  • EnumClasses.vbs、EnumInstances.vbs、EnumNamespaces.vbs - Windows 2000 Server リソース キットには、WMI の優れた機能を活用するスクリプトが数多く含まれています。これらの 3 つのスクリプトは、CIM スキーマの参照、クラス定義の表示、およびマネージ リソースのインスタンスの取得に使用できる汎用スクリプトです。

その他にチェックする必要のあるリソースは、次のとおりです。

  • WMI SDK ドキュメント - WMI SDK には、標準の WMI プロバイダから提供されるクラスの包括的な一覧が含まれています。MSDN オンライン ライブラリの WMI SDK ドキュメンテーション (英語) を参照してください。
  • TechNet Script Center - TechNet Script Center (英語) には、今後リリースされる『System Administration Scripting Guide』の WMI ベースのサンプル スクリプトが多数用意されています。

WMI Tester (wbemtest.exe) のチュートリアル

CIM の参照および探索のためのツールについて簡単に説明したところで、WMI Tester (wbemtest.exe) を使用してみます。Win32_Process クラス定義を調べて、コンピュータで実行中のプロセスから複数のプロパティを取得するようにリスト 2 を変更します。最適な結果を得るため、Administrators グループのアカウントでログオンしてから練習を開始してください。

  1. コマンド プロンプトを開いて「C:\>wbemtest.exe」と入力し、Enter キーを押して WMI Tester ツールを起動します。WMI Tester のメイン ウィンドウではほとんどのボタンが無効になっています。これは、この時点で WMI に接続されていないためです。
  2. [接続] をクリックし、ローカル コンピュータまたはリモート コンピュータの WMI サービスに接続します。[接続] ダイアログ ボックスが表示されます。このダイアログ ボックスには、[名前空間] というテキスト入力フィールドがあり、この既定値は root\default です。[名前空間] フィールドの値を root\cimv2 に変更し、[接続] ダイアログ ボックスの [接続] ボタンをクリックして、WMI Tester のメイン ウィンドウに戻ります。
  3. メイン ウィンドウの左上隅にある名前空間の識別子が root\cimv2 になります。これで、すべてのボタンが有効になります。これは、現在の資格情報のコンテキストを使用してローカル ホストの WMI に正常に接続されていることを示します。[クラスの列挙] をクリックし、[スーパークラス情報] ダイアログ ボックスを開きます。
  4. [スーパークラス情報] ダイアログ ボックスの [スーパークラス名の入力] フィールドを空白のままにして、[再帰] をクリックします。次に、[OK] をクリックして、root\cimv2 名前空間で定義されているすべての CIM クラスを列挙します。

    ここで、多数のクラス定義が表示されている [クエリ結果] ダイアログ ボックスを調べます。クラスの数は、実行している Windows のバージョンによって異なります。たとえば、Windows 2000 の場合は、約 600 個のクラス定義があります。Windows XP の場合は、約 900 個のクラス定義があります。

    [クエリ結果] ダイアログ ボックスの先頭に表示されるクラスの先頭には 2 つのアンダースコアが付いています。これらはシステム クラスです。システム クラスは、プロバイダの登録、名前空間のセキュリティ、イベントの通知などの内部の WMI 構成と操作をサポートする、定義済みの CIM クラスです。ここではシステム クラスは無視して、先頭に CIM_ が付いたクラスが見つかるまで [クエリ結果] ダイアログ ボックスを下方向にスクロールしてください。

    CIM_ で始まる名前のクラスは DMTF が管理するコア クラスおよびコモン クラスの基本クラスです。先頭に Win32_ が付いたクラスが見つかるまでスクロールしてください。

    Win32_ で始まる名前のクラスは Windows 固有のマネージ リソースを表す Microsoft 拡張クラスです。root\cimv2 名前空間について初めて調べるのであれば、root\cimv2 名前空間の一連のクラス (特にプリフィックス Win32_ が付いたクラス) について理解することができます。

  5. Win32_Process クラスが見つかるまで [クエリ結果] ダイアログ ボックスを下方向にスクロールし、クラス名をダブルクリックして Win32_Process ダイアログのオブジェクト エディタを開きます。
  6. [オブジェクト エディタ] ダイアログ ボックスには、選択したクラスの定義および実装の詳細 (プロパティとメソッド) が表示されます。前述したとおり、クラス定義は WMI で管理できるリソースの青写真です。

    [システム プロパティを表示しない] チェック ボックスをオンにして、システム プロパティを非表示にします。Win32_Process のその他のプロパティは、ローカル コンピュータまたはリモート コンピュータで実行中のプロセスから取得できる情報を表します。

    WMI スクリプトの練習を終了する際は、Name、Handle、および ProcessID プロパティを取得してみてください。上記の 3 つのリストのいずれかをテンプレートとして使用し、スクリプトを実行します。その後は手順 7 に進んでください。

    注 : ローカル コンピュータでスクリプトを実行するには、strComputer 変数の値を "." (1 つのドットを二重引用符で囲む) に設定します。
  7. 新しく作成した GetProcesses.vbs スクリプトを実行したら、WMI Tester を使用してスクリプトの結果を確認できます。Win32_Process ダイアログのオブジェクト エディタで、[インスタンス] をクリックします。[クエリ結果] ダイアログ ボックスに、コンピュータで実行中のプロセスのインスタンスが一覧表示されます。いずれかのプロセスのインスタンスをダブルクリックして、詳細を表示します。

まとめ

これまでの説明は WMI スクリプトのほんの一部にすぎません。実を言うと、これにはわけがあります。WMI に対するスクリプトの機能には多くの可能性があり、細かい部分に気をとられているともっと重要な部分を見落としがちです。しかし、心配する必要はありません。足りない点についてはこのシリーズを通してきちんと説明していきます。この時点で重要なのは、WMI が Windows で最も重要な唯一の管理のためのテクノロジであることと、WMI ベースのスクリプトを作成するために開発者またはスクリプト専門家になる必要はないということです。新しく作成したスクリプトをさらに変更して、他のプロセスのプロパティや、さらには他のマネージ リソースを取得してみてください。来月お会いするまでには、カスタムのシステム管理スクリプトでツールボックスがいっぱいになっているかもしれません。練習の成果をどうぞお知らせください。

リスト 4. WMI Tester のチュートリアルに対する回答

                  
strComputer = "."   ' ドット (.) は WMI のローカル コンピュータを表します。

Set wbemServices = GetObject("winmgmts:\\" & strComputer)
Set wbemObjectSet = wbemServices.InstancesOf("Win32_Process")

For Each wbemObject In wbemObjectSet
    WScript.Echo "名前:          " & wbemObject.Name      & vbCrLf & _
                 "   ハンドル:     " & wbemObject.Handle    & vbCrLf & _
                 "   プロセス ID: " & wbemObject.ProcessID
Next

                

Scripting Clinic

Greg Stemp は長い間米国のスクリプトの権威のひとりであり、ワールドクラスとして広く知られています。なぜ彼らはフットボールのコーチに自分たちの履歴書の内容を作成させたのでしょう。本当のことでしょうか。彼は解雇されたのでしょうか。ともかく、彼が働いているのは・・・私が言ってしまってもかまわないですね。わかりました。Greg Stemp は Microsoft の社員で、『System Administration Scripting Guide』のトップ ライターの肩書を持っています。

Bob Wells はスクリプトの利点を聞いてくれる人を探してあてもなくさまよっています。Bob の飼い犬の 2 匹のダックスフントはほとんどの人間よりもスクリプトについて詳しいという噂です。彼は暇なときに『System Administration Scripting Guide』に寄稿しています。

Ethan Wilansky は業務時間のほとんどを執筆とコンサルティングに充てています。彼はスクリプトとヨガとガーデニング、それに家族に夢中です (必ずしもこの順番のとおりではありません)。現在、彼はごみを出して夕食の皿を洗うためのスクリプトの作成に取り組んでいます。


© 2012 Microsoft. All rights reserved. 使用条件 | 商標 | プライバシー
Page view tracker