WMI (Windows Management Instrumentation) テクノロジーは、Microsoft が提供する Windows 上のシステム管理ツールです。このツールを使用すると、クライアント システム内のほぼすべての情報をローカルまたはクライアント システム上で管理できます。多くの専門的なネットワーク管理ツールは WMI に基づいて開発されています。このツールは、Win2000 および WinNT では標準ツールであり、Win9X では拡張インストール オプションです。この記事では、VB プログラミングを通じて WMI オブジェクト プログラミングにアクセスする方法を紹介します。
まず、WMI を通じてシステム情報を取得する簡単な例を見てみましょう。この例では、WMI オブジェクトを通じてシステム内で実行されているプロセスを取得します。
FunctionEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PROcess)
ForEachobjInobjs
Enum1=Enum1 obj.Description Chr(13) Chr(10)
次
エンドファンクション
上記のコードでは、WMI オブジェクトは最初に GetObject(WinMgmts:) によって取得されます。WMI オブジェクトの下には多くのサブ項目があります。ここでは、WMI.InstancesOf(Win32_Process) によってシステム内のすべてのプロセス リストのサブ項目を取得します。
WMI オブジェクトにアクセスする完全な例を見てみましょう。この例では、コンピューター情報を取得します。
新しいプロジェクトを作成し、TextBox コントロールと CommandButton コントロールを Form1 に追加し、CommandButton の Click イベントに次のコードを記述します。
PrivateSubCommand1_Click()
ディム、システム、アイテム
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
システム内の各項目について
'List1.AddItemitem.cputype
s=コンピュータ情報&vbCrLf
s=s&****************************&vbCrLf
s=s&コンピュータ名:&項目.名&vbCrLf
s=s&ステータス:&item.ステータス&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&製造元:&item.製造元&vbCrLf
s=s&モデル:&item.Model&vbCrLf
s=s&memory:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&ドメイン:&アイテム.ドメイン&vbCrLf
ワークグループとドメインを取得するための「s=s&Workgroup&item.Workgroup&vbCrLf」オプションは同時に使用できません
s=s&現在のユーザー:&item.ユーザー名&vbCrLf
s=s&ブート状態&item.BootupState&vbCrLf
s=s&このコンピュータは&item.PrimaryOwnerName&vbCrLfに属しています
s=s&システムタイプ&アイテム.CreationClassName&vbCrLf
s=s&コンピュータの種類&項目.説明&vbCrLf
Fori=0To1'ここでは 2 つのシステムがインストールされていると仮定しています
s=s&Chr(5)&スタートアップ オプション&i&:&item.SystemStartupOptions(i)_
&vbCrLf
ネクスティ
次
Text1.Text=s
EndSub
プログラムを実行し、Command1 をクリックすると、テキスト ボックスにコンピュータ情報が表示されます。
上記のコードでは、プログラムは GetObject(winmgmts:) を通じて WMI オブジェクトを取得し、次に次の Win32_ComputerSystem サブキーを取得し、Win32_ComputerSystem オブジェクトのサブ項目にアクセスしてシステム内の情報を取得します。
すべてのシステムが WMI をサポートしているわけではなく、システムによっては製造元などの情報が表示できないことに注意してください。
今日のコンピューターとネットワークは非常に複雑です。たとえば、システム ハードウェアの観点では、マザーボード、ハード ドライブ、ネットワーク カードなどがあります。
ソフトウェアに関しては、オペレーティング システム、システムにインストールされているソフトウェア、実行中のプロセスなどが含まれます。ネットワークの側面には、ドメイン、ワークグループなどが含まれます。 WMI を使用して上記のすべての情報にアクセスすることはできますが、上記と同じ項目を使用してアクセスするのは非常に面倒です。この目的のために、WMI は SQL ステートメントに似たクエリ ステートメントを提供し、これを通じて WMI オブジェクトの下のサブ項目を取得できます。
以下は、システムにインストールされているネットワーク カードをループし、ネットワーク カードの MAC アドレスを返すコードです。
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECTMACアドレス&_
FROMWin32_ネットワークアダプター&_
どこ&_
((MACAddressIsNotNULL)&_
AND(メーカー<>&_
「マイクロソフト」)))
ForEachobjInobjs
MACアドレス=obj.MACアドレス
終了用
次のオブジェクト
エンドファンクション
上記のコードは、WMI オブジェクトを取得し、次に ExecQuery を実行して WMI クエリ ステートメントを実行し、取り付けられているネットワーク カードを取得し、ネットワーク カードの MAC アドレスを返します。
WMI はイベント処理もサポートしており、プログラムの実行と終了、リムーバブル ドライブの挿入と取り外しなどのシステム イベントをプログラムで処理できるようになります。以下は、システム上で実行されているプログラムを監視できるプログラムです。
まず新しいプロジェクトを作成し、メニューでプロジェクト参照項目をクリックし、参照リストで MicrosoftWMIScriptingLibrary を選択して、WMI オブジェクト ライブラリをプロジェクトに追加します。次に、ListBox コントロールを Form1 に追加し、次のコードを Form1 に追加します。
オプション明示的
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
PrivateSubKillEvents()
StatusSink.Cancel
SetStatusSink=なし
EndSub
PrivateSubForm_Load()
DimQueryAsString
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Query=SELECT*FROM__InstanceCreationEvent
クエリ=クエリ WITHIN1
Query=クエリ WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink,Query
EndSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
ディマール
DimstrQueAsString
DimiAsInteger
リスト1.クリア
arr=Split(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ToUBound(arr)
List1.AddItemarr(i)
ネクスティ
EndSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'エラー処理
EndIf
EndSub
上記のプログラムでは、SWbemSink オブジェクト StatusSink が定義され、次に SWbemServices オブジェクト Server が作成され、StatusSink が Server オブジェクトに接続されます。このようにして、プログラムの実行を StatusSink を通じて監視できます。
プログラムを実行し、任意のプログラムを実行すると、実行中のプログラムの情報が Form1 の ListBox に一覧表示されます。
WMI アプリケーションの最も強力な点は、WEB ページを通じてリモート管理を実現できることです。次に、上記の VB プログラムと同様に、システム内で実行されているプログラムを動的に監視できる HTML ページを作成しましょう。監視システムで実行されるプログラムの HTML コードは次のとおりです。
<html>
<頭>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
</頭>
<脚本>
functionwindow.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =WITHIN1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</スクリプト>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</スクリプト>
<本文>
<spanID=info></span>
</本文>
</html>
コードを Htm サフィックスとして含むページ ファイルを保存します。ダブルクリックして Web ページを開き、プログラムを実行すると、実行中のプログラムのファイル名が Web ページに一覧表示されます。
上記では WMI のアプリケーションを簡単に紹介しましたが、実際には、WMI オブジェクトの操作は非常に複雑であり、たとえば、WMI を使用してサーバー上の LAN 全体のコンピューターを監視したり、ソフトウェアをインストールしたりすることもできます。 LAN 上のコンピュータ (ウイルス対策ソフトウェアなど) にバッチを送信します。ページを通じてサーバーにリモートでアクセスし、サーバーを制御してプログラムを実行したり、ユーザーを追加したりできます。その他の WMI アプリケーションについては、MSDN の WMI 開発ホームページにアクセスしてください。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
さらに詳しい情報を入手してください。
->