La technologie WMI (Windows Management Instrumentation) est un outil de gestion de système sous Windows fourni par Microsoft. Grâce à cet outil, presque toutes les informations du système client peuvent être gérées localement ou sur le système client. De nombreux outils de gestion de réseau professionnels sont développés sur la base de WMI. Cet outil est un outil standard sous Win2000 et WinNT, et une option d'installation étendue sous Win9X. Cet article explique comment accéder à la programmation objet WMI via la programmation VB.
Tout d'abord, examinons un exemple simple d'obtention d'informations système via WMI. Cet exemple obtient les processus exécutés dans le système via des objets WMI :
FunctionEnum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts :)
Setobjs=WMI.InstancesOf(Win32_PRocess)
PourEachobjInobjs
Enum1=Enum1 obj.Description Chr(13) Chr(10)
Suivant
FinFonction
Dans le code ci-dessus, l'objet WMI est d'abord obtenu via GetObject(WinMgmts :). Il existe de nombreux sous-éléments sous l'objet WMI. Ici, nous obtenons tous les sous-éléments de la liste de processus dans le système via WMI.InstancesOf(Win32_Process).
Examinons un exemple complet d'accès aux objets WMI. Cet exemple obtient des informations sur l'ordinateur.
Créez un nouveau projet, ajoutez un contrôle TextBox et un contrôle CommandButton à Form1, puis écrivez le code suivant dans l'événement Click du CommandButton :
PrivateSubCommand1_Click()
Dims, système, article
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
PourEachitemInSystem
'List1.AddItemitem.cputype
s=InfoOrdinateur&vbCrLf
s=s&****************************&vbCrLf
s=s&nom de l'ordinateur :&item.name&vbCrLf
s=s&Status :&item.Status&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&Fabricant :&item.Fabricant&vbCrLf
s=s&model:&item.Model&vbCrLf
s=s&mémoire :~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&domaine :&item.domaine&vbCrLf
L'option 's=s&Workgroup&item.Workgroup&vbCrLf' pour obtenir le groupe de travail et le domaine ne peut pas être utilisée en même temps
s=s&utilisateur actuel :&item.username&vbCrLf
s=s&état de démarrage&item.BootupState&vbCrLf
s=s&Cet ordinateur appartient à&item.PrimaryOwnerName&vbCrLf
s=s&type de système&item.CreationClassName&vbCrLf
s=s&Type d'ordinateur&item.Description&vbCrLf
Fori=0To1'Ici, on suppose que deux systèmes sont installés
s=s&Chr(5)&Options de démarrage&i&:&item.SystemStartupOptions(i)_
&vbCrLf
Suivant
Suivant
Texte1.Texte=s
FinSub
Exécutez le programme, cliquez sur Command1 et les informations sur l'ordinateur seront affichées dans la zone de texte.
Dans le code ci-dessus, le programme obtient l'objet WMI via GetObject(winmgmts :), puis obtient la sous-clé Win32_ComputerSystem suivante et obtient les informations dans le système en accédant aux sous-éléments de l'objet Win32_ComputerSystem.
Il convient de noter que tous les systèmes ne prennent pas en charge WMI et que, dans certains systèmes, les informations telles que le fabricant ne peuvent pas être affichées.
Les ordinateurs et les réseaux d'aujourd'hui sont très complexes. Par exemple, en termes de matériel système, il existe des cartes mères, des disques durs, des cartes réseau...
En termes de logiciels, il existe des systèmes d'exploitation, des logiciels installés dans le système, des processus en cours d'exécution, etc. Les aspects réseau incluent les domaines, les groupes de travail, etc. Vous pouvez utiliser WMI pour accéder à toutes les informations ci-dessus, mais il sera très difficile d'y accéder en utilisant les mêmes éléments que ci-dessus. À cette fin, WMI fournit une instruction de requête similaire à une instruction SQL, grâce à laquelle les sous-éléments sous l'objet WMI peuvent être obtenus.
Voici un code qui parcourt les cartes réseau installées dans le système et renvoie l'adresse MAC de la carte réseau :
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECTMACAdresse&_
FROMWin32_NetworkAdapter&_
OÙ&_
((MACAddressIsNotNULL)&_
ET (Fabricant<>&_
'Microsoft')))
PourEachobjInobjs
MACAddress=obj.MACAddress
QuitterPour
Suivantobj
FinFonction
Le code ci-dessus obtient l'objet WMI, puis exécute ExecQuery pour exécuter une instruction de requête WMI afin d'obtenir la carte réseau installée et renvoyer l'adresse MAC de la carte réseau.
WMI prend également en charge le traitement des événements, permettant aux programmes de gérer les événements système, tels que l'exécution et la fermeture du programme, l'insertion et le retrait de lecteurs amovibles, etc. Vous trouverez ci-dessous un programme capable de surveiller les programmes exécutés sur le système.
Créez d'abord un nouveau projet, puis cliquez sur l'élément de références du projet dans le menu, sélectionnez MicrosoftWMIScriptingLibrary dans la liste des références et ajoutez la bibliothèque d'objets WMI au projet. Ajoutez ensuite un contrôle ListBox à Form1, puis ajoutez le code suivant à Form1 :
OptionExplicite
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
PrivateSubKillEvents()
StatusSink.Cancel
SetStatusSink=Rien
FinSub
PrivateSubForm_Load()
DimQueryAsString
SetStatusSink=NouveauSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
Requête = SELECT*FROM__InstanceCreationEvent
Requête=Requête DANS1
Requête=Requête WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink, Requête
FinSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
Dimar
DimstrQueAsString
DimiAsInteger
Liste1.Effacer
arr=Split(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)VersUBound(arr)
Liste1.AddItemarr(i)
Suivant
FinSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ParValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'Gestion des erreurs
FinSi
FinSub
Dans le programme ci-dessus, un objet SWbemSink StatusSink est défini, puis un objet SWbemServices Server est créé et StatusSink est connecté à l'objet Server. De cette façon, le fonctionnement du programme peut être surveillé via StatusSink.
Exécutez le programme, puis exécutez n'importe quel programme, et les informations du programme en cours d'exécution peuvent être répertoriées dans la ListBox de Form1.
L'aspect le plus puissant de l'application WMI est qu'elle peut réaliser une gestion à distance via une page WEB. Créons ensuite une page HTML, qui peut surveiller dynamiquement les programmes exécutés dans le système, comme le programme VB ci-dessus. Le code HTML du programme exécuté dans le système de surveillance est le suivant :
<html>
<tête>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
</tête>
<SCRIPT>
fonctionwindow.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szRequête = DANS1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</SCRIPT>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</script>
<corps>
<spanID=info></span>
</corps>
</html>
Enregistrez le fichier d'échange avec le code en tant que suffixe Htm. Double-cliquez pour ouvrir la page Web, puis exécutez un programme. Les noms de fichiers des programmes en cours d'exécution peuvent être répertoriés sur la page Web.
Ce qui précède présente brièvement l'application de WMI. En fait, le fonctionnement des objets WMI est très complexe et les fonctions sont également très puissantes. Par exemple, vous pouvez utiliser WMI pour surveiller les ordinateurs sur l'ensemble du réseau local sur le serveur et y installer des logiciels. lots vers les ordinateurs du réseau local (tels qu'un logiciel antivirus). Accédez au serveur à distance via la page, contrôlez le serveur pour exécuter des programmes, ajoutez des utilisateurs, etc. Pour plus d'applications WMI, les lecteurs peuvent visiter la page d'accueil du développement WMI sur MSDN :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
Obtenez plus d'informations.
->