Hé, le scripteur ! Détection de la profondeur de WMI
The Microsoft Scripting Guys
Contenu
Les espaces de noms
Classes WMI
Propriétés
Méthodes
Quand un des scripteurs était antérieurs, il avait deux loisirs qu'il très apprécié. Une a été drinking boissons fermented ; l'autre était camping hiver. Il pense les deux ont été liés. Un Compagnon de son cours ces jours a amateur de suggérer qu'ils « vont en profondeur. » Eh bien, ce mois-ci nous allons pour suivre les conseils de l'ancien ami. Nous allons profondeur dans l'itinéraire de WMI (c'est-à-dire, Windows Management Instrumentation).
Heureusement, nous ne devrez hike n'importe où dans ce cas, excepté peut-être pour le fabricant de café et sauvegarder. Au lieu de cela, nous allons sonder les intensités WMI à l'aide des scripts.
À présent, les scripteurs sont connus pour être folk très pratique. Nous essayez présente des solutions aux problèmes réels plutôt que des explications lofty qui semblent ne pas certains détails, comme comment réellement effectuer tout ce que, pour le lecteur. Ne pensez pas que nous vous aller sur ce bandwagon. Bien que cette colonne n'est pas concentrer sur la réalisation de tâches d'administration système spécifique, il a un objectif pratique. L'objectif principal est de vous former à propos de l'infrastructure WMI. Et nous souhaitez également placer certains scripts probing utiles dans votre main. Se déclenchent des bloc-notes, nous allons en profondeur !
Les espaces de noms
L'espace de stockage WMI est une base de données et il permet de stocker le CIM (Common Information Model). Ce modèle est orientée, objet qui signifie qu'il consiste en un ensemble de libellés (classes WMI) qui représentent les éléments que WMI peut gérer. La classe Win32_Process WMI, par exemple, représente le processus. Les classes WMI sont stockés dans différentes sections de l'espace de stockage WMI. Une section de l'espace de stockage WMI est appelée espace de noms. Si vous deviez stumble lors d'un référentiel WMI dans l'itinéraire, la première chose que vous seriez remarquerez probablement concernant est qu'il est divisé en ces espaces de noms de haut niveau. Le script illustré figure 1
Espaces de noms figure 1 Affichage
strComputer = "."
Call EnumNameSpaces("root")
Sub EnumNameSpaces(strNameSpace)
On Error Resume Next
WScript.Echo strNameSpace
Set objWMIService=GetObject _
("winmgmts:{impersonationLevel=impersonate}\\" & _
strComputer & "\" & strNameSpace)
Set colNameSpaces = objWMIService.InstancesOf("__NAMESPACE")
For Each objNameSpace in colNameSpaces
Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
Next
End Sub
Affiche les noms de tous les espaces de noms dans le référentiel WMI sur l'ordinateur spécifié dans strComputer (un point signifie l'ordinateur local).
Les espaces de noms peuvent inclure subnamespaces. Vous pouvez considérer la chose entière comme étant comme une structure de répertoires. Donc nous pour demander à seulement tous les les espaces de noms (commençant par l'espace de noms racine de niveau supérieur), nous seraient vu en que le premier niveau des espaces de noms dans racine qui serait manquer les subnamespaces. Nous utilisez plutôt l'astuce de récurrence. Nous créons une sous-routine appelée EnumNameSpaces qui prend un espace de noms en tant que paramètre et renvoie tous ses subnamespaces.
Nous lancer des opérations hors en appelant EnumNameSpaces avec racine en tant que paramètre. Ceci renvoie tous les espaces de noms dans l'espace de noms racine. Ensuite, nous faire la récursivité. Notez que EnumNameSpaces elle-même appelle en fait, en transmettant chaque le subnamespaces il identifie. Prenez un slurp volumineux de votre café et pensez que. Le résultat est que chaque espace de noms est traitée et, si elle a subnamespaces, elles sont toutes affichées.
Notez que nous avons inclus une instruction On Error Resume Next au début de la sous-routine. Il est dans le cas où vous exécutez le script dans un contexte de sécurité n'a pas accès à tous les espaces de noms. Si c'est le cas, le script est toujours exécutées, si elle sera un peu lent car il attend délais d'attente.
Oui, vous pouvez uniquement utiliser wbemtest.exe (il s'agit sur chaque ordinateur sur lequel WMI installé) ou (Scriptomatic go.microsoft.com/fwlink/?LinkId=125976) pour ce faire. Mais avec un script de démarrage et vos compétences en matière de scripts elite, vous pouvez filtrer ces espaces de noms ou les copier vers Excel ou comparer les espaces de noms sur deux ordinateurs.
Maintenant que nous pouvez voir comment l'espace de stockage est divisé haut, nous allons développer un script qui permet d'examiner les nouveautés dans chacune de ces sections. Nous savons que les classes WMI sont stockés dans chacune de ces espaces de noms, donc Supposons démarrer en plaçant.
Classes WMI
Vous souvenez-vous expliqué que l'espace de stockage WMI héberge le modèle d'informations communes ? Eh bien, ce modèle est stockée dans le CIMV2 espace de noms (v2 pour la version 2). Si vous recherchez dans l'espace de noms CIMV2, vous devriez voir toutes les classes WMI qui constituent ce modèle. Le script suivant a :
strComputer = "."
Set objWMIService=GetObject("winmgmts: _
{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
For Each objclass in
objWMIService.SubclassesOf()
Wscript.Echo objClass.Path_.Class
Next
Nous allons voir exactement comment ce script fonctionne. L'appel de la fonction GetObject renvoie un objet SWbemServices. GetObject est une fonction VBScript qui renvoie les références aux objets COM scriptables. Dans ce cas, car nous le passée de la chaîne « winmgmts: … ", GetObject renvoie un objet de la bibliothèque de scripts WMI. Notez que la chaîne que nous passons à GetObject inclut l'espace de noms à laquelle nous vous connectez, \root\cimv2 dans ce cas. Ainsi, l'objet SWbemServices que nous devons utiliser est lié à l'espace de noms particulier, que nous spécifiés. Consultez la documentation SWbemServices pour voir quelles possibles actions possibles dans votre script.
Un qui ressemble probablement très bien à vous est ExecQuery. C'est la méthode qui vous permet d'exécuter une requête WQL (Windows Management Instrumentation Query Language) par rapport à l'espace de noms auquel vous êtes connecté. Mais il existe quelques autres actions possibles une fois un objet SWbemServices associé à un espace de noms.
Nous souhaitons voir toutes les classes WMI dans l'espace de noms et SubClassesOf effectue que. La documentation dit qu'elle renvoie un SWbemObjectSet. Qui n'est pas sembler quelque chose vous seriez amené à face uniquement dans les bois ! Se concentrer uniquement sur les trois dernières lettres, il s'agit d'un ensemble. Et, comme le WMI scripteurs savent, vous pouvez parcourez un jeu utilisant For Each.
Maintenant, pas trop étonnamment, chaque membre d'un SWbemObjectSet est un SWbemObject. Chaque ces SWbemObjects représente une des classes WMI dans l'espace de noms CIMV2. Examinez la documentation de SWbemObject et vous verrez toutes les informations nous peut en sortie sur ces classes.
Dans notre script, nous avez choisi d'afficher uniquement le nom de la classe. Pour ce faire, nous d'accès à la propriété Path_. En fait, la propriété Path_ elle-même est un objet. C'est un SWbemObjectPath et, en cours d'un objet, a un ensemble de ses propres propriétés. Nous utilisons une classe, qui est le nom de la classe.
Par conséquent, non seulement vous avez un script qui peut afficher toutes les classes WMI dans un espace de noms, mais vous avez également un script qui peut être mis à jour facilement pour afficher diverses autres concernant ces classes. Par exemple, les classes WMI peuvent être des extensions d'autres classes WMI. Imaginez que vous avez un modèle pour une voiture (Win32_Car), mais vraiment besoin pour gérer les wagons station. Tout dans le modèle pour la voiture s'applique à le wagon station.
Mais vous devez quelques éléments supplémentaires, comme une valeur booléenne indiquant si elle possède que paneling en bois complète. Vous ne voulez recréer toutes les fonctionnalités Win32_Car. Vous seriez amené est un mécanisme pour étendre la classe Win32_Car pour inclure toutes les nouvelles propriétés. WMI inclut uniquement ce un mécanisme.
Pour voir si une classe WMI hérite des propriétés d'une autre classe WMI, vous pouvez vérifier la propriété Derivation_ de la classe SWbemObject associée à cette classe WMI. Le script dans la figure 2 affiche les classes WMI dans l'espace de noms CIMV2 en même temps qu'avec une liste des classes à partir de laquelle dériver.
La figure 2 CIMV2 classe dérivation
strComputer = "."
Set objWMIService=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
For Each objclass in objWMIService.SubclassesOf()
WScript.StdOut.Write objclass.Path_.Class
arrDerivativeClasses = objClass.Derivation_
For Each strDerivativeClass in arrDerivativeClasses
WScript.StdOut.Write " <- " & strDerivativeClass
Next
WScript.StdOut.Write vbNewLine
Next
For Each objNameSpace in colNameSpaces
Call EnumNameSpaces(strNameSpace & "\" & objNameSpace.Name)
Next
End Sub
Le script démarre exactement comme le précédent. Il utilise WScript.StdOut.Write au lieu de WScript.Echo pour éviter d'ajouter automatiquement un nouveau caractère ligne après la chaîne affichée. (Remarque : vous devez exécuter le script en utilisant cscript.exe au lieu de Wscript.exe pour StdOut.Write pour travailler.)
En examinant la documentation de SWbemObject, vous pouvez constater qu'il possède une propriété Derivation_. Cette propriété est un tableau de chaînes contenant les noms des classes à partir de laquelle la classe en cours a été dérivée. Dans notre script, nous en revue ce tableau utilisant For Each et afficher toutes les classes séparés par une flèche ascii. Une fois que vous permettent de commençant par l'objet SWbemServices renvoyé par GetObject et sont parcours via les possibilités dans la documentation de bibliothèque de scripts WMI, vous pouvez tester les propriétés et méthodes sur ces objets pour rechercher ce qui est possible de étrange nommés.
Vous comprendre quelle bibliothèque de scripts WMI objet que vous travaillez à tout moment dans votre script permet de déplacer au niveau suivant des scripts WMI. Au lieu d'utiliser simplement nos scripts, vous êtes également comprendre pourquoi nous avons pu appeler ExecQuery ou faire référence à la propriété Properties_. Et vous pouvez faire des choses plus.
L'outil Scriptomatic ne live à vos attentes ? Aucun problème. Continuer et le modifier pour faire ce que vous souhaitez. D'autres sont peut-être d'achat votre création de vous. Dans ce cas, messagerie instructions pour scripter@microsoft.com en plaçant ce qui suit dans le champ détaillant comment nous recevrons nos droits vérifie.
Propriétés
Chaque classe WMI modélise quelque chose que vous pouvez gérer à l'aide d'un jeu de propriétés et méthodes. Les propriétés sont caractéristiques de la chose. Un processus, par exemple, a un code et une priorité et utilise une certaine quantité de mémoire. Ces propriétés sont toutes incluses dans la classe Win32_Process WMI.
Une fois vous avez identifié la classe pour gérer une entité, examinez les propriétés disponibles pour vérifier si vous souhaitez gérer est dans le modèle de gestion. La classe SWbemObject inclut une propriété appelée Properties_. Drôle, hein ? La valeur de cette propriété est un objet SWbemPropertySet qui comprend une collection d'objets SWbemProperty. Chacune de ces objets SWbemProperty correspond à une propriété dans la classe WMI associée à la SWbemObject. Je sais, tous ces noms SWbem * vérifiez tout ce que son très compliqué, mais il n'est pas tout incorrect. Prélever un oeil figure 3 .
La figure 3 SWbemObject expose les propriétés de la classe WMI pour whichit est lié (cliquez sur l'image pour l'agrandir)
Gardez à l'esprit que les classes qui commencent par SWbem * sont membres de la bibliothèque WMI Scripting Object. Ils sont les objets qui vous permettent de travailler avec WMI. Ils ne font pas partie du modèle WMI de choses que vous pouvez gérer.
Dans la figure 3 , SWbemObject représente une classe WMI, Win32_SomeClass qui possède des propriétés : Property_1, Property_2 et Property_3. Elle expose les via sa propre propriété Properties_. Bien entendu, si elle est liée à une autre classe WMI, Win32_SomeOtherClass, puis le nom de sa propriété ne change. Il est toujours Properties_. Mais les propriétés de la classe à laquelle il est lié sera probablement différentes.
En fait, SWbemObject prend les propriétés de la classe WMI particulier auquel il est lié, mais il vous permet d'accéder à ces propriétés différentes à l'aide du même mécanisme Properties_. Sens ? Prendre une autre gulp de café et meditate sur le diagramme. Il tout deviendra claire.
Le script dans la figure 4 exploite SWbemObject et sa propriété Properties_ pour extraire et afficher toutes les propriétés de la classe Win32_Service WMI. La valeur début du script doit être familier. La modification principale est que nous factorisée l'espace de noms et la classe WMI, rendant plus facile à modifier. Par exemple, vous pouvez modifier uniquement la valeur de strClass à Win32_BIOS pour voir les propriétés de cette classe au lieu de celles de Win32_Service. Dans la pour chaque boucle, nous itération de la SWbemPropertySet collection (objClass.Properties) affiche le nom de chaque SWbemProperty.
La figure 4 obtenir les propriétés de Win32_Service
strComputer = "."
strNameSpace = "root\cimv2"
strClass = "Win32_Service"
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\" & strNameSpace & ":" & strClass)
WScript.Echo strClass & " Class Properties"
WScript.Echo "------------------------------"
For Each objClassProperty in objClass.Properties_
WScript.Echo objClassProperty.Name
Next
Méthodes
Enfin, certaines classes WMI dépassent la modélisation des propriétés ou les caractéristiques d'une entité plus faciles à gérer et inclure des méthodes qui permettent d'accéder aux problèmes ou les actions qu'une entité pouvez prendre, ou ont pris sur elle.
Le format du script pour renvoyer toutes les méthodes d'une classe WMI (illustré La figure 5 ) exactement parallels le script qui renvoie des propriétés.
La figure 5 obtenir les méthodes pour une classe WMI
strComputer = "."
strNameSpace = "root\cimv2"
strClass = "Win32_Service"
Set objClass = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
strComputer & "\" & strNameSpace & ":" & strClass)
WScript.Echo strClass & " Class Methods"
WScript.Echo "---------------------------"
For Each objClassMethod in objClass.Methods_
WScript.Echo objClassMethod.Name
Next
La différence est bien sûr que la propriété Methods_ est utilisée au lieu de la propriété Properties_. À présent, ne souvenez, il également serait possible affiche les types des paramètres de ces méthodes prennent ? Comment peut nous afficher uniquement les classes WMI qui ont en fait des méthodes ? Ils sont les types de questions que vous essayez devez écrire des scripts pour répondre une fois la lecture de cette colonne.
Nous espérons que vous avons fourni vous avec un premier aperçu utile en comment faire pour sonder les intensités de WMI. Vous devez effectuer votre façon via une forêt de SWbem épais * s. Mais les scripts fournissent un mécanisme intéressant et léger pour passer en profondeur. Hiver deux amis camping ne donc chance. Ils ne jamais réellement effectuée il très long. Il s'avère un approvisionnement adéquate du nécessaire boissons fermented n'était pas très facilement transportées dans la profondeur au milieu d'hiver.
scripteurs le travail pour —, sont employés par — Microsoft. Lorsque pas en train de jouer au base-ball, d'entraîner une équipe/de regarder un match (et autres activités) qu'ils dirigent le Script Center de TechNet. Extraire à www.scriptingguys.com.