Die WMI-Technologie (Windows Management Instrumentation) ist ein von Microsoft bereitgestelltes Systemverwaltungstool unter Windows. Durch dieses Tool können nahezu alle Informationen im Client-System lokal oder auf dem Client-System verwaltet werden. Viele professionelle Netzwerkmanagement-Tools werden auf Basis von WMI entwickelt. Dieses Tool ist ein Standardtool unter Win2000 und WinNT und eine erweiterte Installationsoption unter Win9X. In diesem Artikel wird erläutert, wie Sie über die VB-Programmierung auf die WMI-Objektprogrammierung zugreifen.
Schauen wir uns zunächst ein einfaches Beispiel zum Abrufen von Systeminformationen über WMI an. In diesem Beispiel werden die im System ausgeführten Prozesse über WMI-Objekte abgerufen:
FunctionEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PRocess)
ForEachobjInobjs
Enum1=Enum1 obj.Description Chr(13) Chr(10)
Nächste
EndFunction
Im obigen Code wird das WMI-Objekt zunächst über GetObject(WinMgmts:) abgerufen. Es gibt viele Unterelemente unter dem WMI-Objekt. Hier erhalten wir alle Unterelemente der Prozessliste im System über WMI.InstancesOf(Win32_Process).
Sehen wir uns ein vollständiges Beispiel für den Zugriff auf WMI-Objekte an. In diesem Beispiel werden Computerinformationen abgerufen.
Erstellen Sie ein neues Projekt, fügen Sie ein TextBox-Steuerelement und ein CommandButton-Steuerelement zu Form1 hinzu und schreiben Sie den folgenden Code in das Click-Ereignis des CommandButton:
PrivateSubCommand1_Click()
Dimmt, System, Artikel
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
ForEachitemInSystem
'List1.AddItemitem.cputype
s=ComputerInfo&vbCrLf
s=s&****************************&vbCrLf
s=s&Computername:&item.name&vbCrLf
s=s&Status:&item.Status&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&Hersteller:&item.Hersteller&vbCrLf
s=s&model:&item.Model&vbCrLf
s=s&memory:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&domain:&item.domain&vbCrLf
Die Option „s=s&Workgroup&item.Workgroup&vbCrLf“ zum Abrufen von Arbeitsgruppe und Domäne kann nicht gleichzeitig verwendet werden
s=s&aktueller Benutzer:&item.username&vbCrLf
s=s&boot state&item.BootupState&vbCrLf
s=s&Dieser Computer gehört zu&item.PrimaryOwnerName&vbCrLf
s=s&Systemtyp&item.CreationClassName&vbCrLf
s=s&Computertyp&item.Description&vbCrLf
Fori=0To1'Hier wird davon ausgegangen, dass zwei Systeme installiert sind
s=s&Chr(5)&Startoptionen&i&:&item.SystemStartupOptions(i)_
&vbCrLf
Nexti
Nächste
Text1.Text=s
EndSub
Führen Sie das Programm aus, klicken Sie auf Command1 und die Computerinformationen werden im Textfeld angezeigt.
Im obigen Code ruft das Programm das WMI-Objekt über GetObject(winmgmts:) ab, ruft dann den folgenden Win32_ComputerSystem-Unterschlüssel ab und ruft die Informationen im System ab, indem es auf die Unterelemente im Win32_ComputerSystem-Objekt zugreift.
Es ist zu beachten, dass nicht alle Systeme WMI unterstützen und bei einigen Systemen Informationen wie der Hersteller nicht angezeigt werden können.
Heutige Computer und Netzwerke sind sehr komplex. Was die Systemhardware betrifft, gibt es beispielsweise Motherboards, Festplatten, Netzwerkkarten ...
In Bezug auf Software gibt es Betriebssysteme, im System installierte Software, laufende Prozesse usw. Netzwerkaspekte umfassen Domänen, Arbeitsgruppen usw. Sie können WMI verwenden, um auf alle oben genannten Informationen zuzugreifen, es ist jedoch sehr mühsam, mit denselben Elementen wie oben darauf zuzugreifen. Zu diesem Zweck stellt WMI eine Abfrageanweisung ähnlich einer SQL-Anweisung bereit, über die die Unterelemente unter dem WMI-Objekt abgerufen werden können.
Hier ist ein Code, der die im System installierten Netzwerkkarten durchläuft und die MAC-Adresse der Netzwerkkarte zurückgibt:
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECTMACAddress&_
FROMWin32_NetworkAdapter&_
WO&_
((MACAddressIsNotNULL)&_
UND(Hersteller<>&_
'Microsoft')))
ForEachobjInobjs
MACAddress=obj.MACAddress
ExitFor
Nächstes Objekt
EndFunction
Der obige Code ruft das WMI-Objekt ab und führt dann ExecQuery aus, um eine WMI-Abfrageanweisung auszuführen, um die installierte Netzwerkkarte abzurufen und die MAC-Adresse der Netzwerkkarte zurückzugeben.
WMI unterstützt auch die Ereignisverarbeitung und ermöglicht es Programmen, Systemereignisse wie das Ausführen und Schließen von Programmen, das Einsetzen und Entfernen von Wechseldatenträgern usw. zu verarbeiten. Nachfolgend finden Sie ein Programm, das die auf dem System ausgeführten Programme überwachen kann.
Erstellen Sie zunächst ein neues Projekt, klicken Sie dann im Menü auf das Element „Projektverweise“, wählen Sie „MicrosoftWMIScriptingLibrary“ in der Referenzliste aus und fügen Sie die WMI-Objektbibliothek zum Projekt hinzu. Fügen Sie dann ein ListBox-Steuerelement zu Form1 hinzu und fügen Sie dann den folgenden Code zu Form1 hinzu:
OptionExplicit
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
PrivateSubKillEvents()
StatusSink.Cancel
SetStatusSink=Nichts
EndSub
PrivateSubForm_Load()
DimQueryAsString
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Abfrage=SELECT*FROM__InstanceCreationEvent
Abfrage=Abfrage WITHIN1
Query=WHERETargetInstanceISA'Win32_Process' abfragen
Services.ExecNotificationQueryAsyncStatusSink,Query
EndSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
Dimarr
DimstrQueAsString
DimiAsInteger
List1.Clear
arr=Split(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ToUBound(arr)
List1.AddItemarr(i)
Nexti
EndSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'Fehlerbehandlung
EndIf
EndSub
Im obigen Programm wird ein SWbemSink-Objekt StatusSink definiert, dann ein SWbemServices-Objekt Server erstellt und StatusSink mit dem Server-Objekt verbunden. Auf diese Weise kann die Ausführung des Programms über StatusSink überwacht werden.
Führen Sie das Programm aus und führen Sie dann ein beliebiges Programm aus. Die Informationen des ausgeführten Programms können in der ListBox von Form1 aufgelistet werden.
Der leistungsstärkste Aspekt der WMI-Anwendung besteht darin, dass sie eine Fernverwaltung über eine WEB-Seite realisieren kann. Als Nächstes erstellen wir eine HTML-Seite, die die im System ausgeführten Programme wie das obige VB-Programm dynamisch überwachen kann. Der HTML-Code für das im Überwachungssystem laufende Programm lautet wie folgt:
<html>
<Kopf>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
</Kopf>
<Skript>
functionwindow.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =WITHIN1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</SCRIPT>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</script>
<Körper>
<spanID=info></span>
</Körper>
</html>
Speichern Sie die Auslagerungsdatei mit dem Code als Htm-Suffix. Doppelklicken Sie, um die Webseite zu öffnen, und führen Sie dann ein Programm aus. Die Dateinamen der ausgeführten Programme können auf der Webseite aufgelistet werden.
Das Obige stellt kurz die Anwendung von WMI vor. Tatsächlich ist die Bedienung von WMI-Objekten sehr komplex und die Funktionen sind auch sehr leistungsfähig. Beispielsweise können Sie WMI verwenden, um die Computer im gesamten LAN auf dem Server zu überwachen und Software darin zu installieren Stapel auf die Computer im LAN übertragen (z. B. Antivirensoftware). Greifen Sie über die Seite remote auf den Server zu, steuern Sie den Server, um Programme auszuführen, Benutzer hinzuzufügen usw. Für weitere WMI-Anwendungen können Leser die WMI-Entwicklungshomepage auf MSDN besuchen:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
Erhalten Sie weitere Informationen.
->