Windows PowerShellMeilleur outil d'inventaire organisera !

Don Jones

Contenu

Exploration de l'outil
Lecteur de test
Ordinateurs en masse
Vous que faire avec son ?
Aller plus loin
Puissants outils Do-It-Yourself

En versements quelques dernières de cette colonne, ai j'démontré diverses techniques pour l'utilisation de Windows PowerShell pour collecter des informations de stock d'ordinateur.Dans cet article, je va rassembler tout en un outil prête à exécuter qui peut collecter n'importe quel type d'information de WMI (Windows Management Instrumentation).

Vidéo

Don Jones encapsule des son souches de numéros sur la création d'un outil d'inventaire très puissante, complet.Dans cette vidéo en continu, il démontre la touche finale, que vous aurez besoin d'ajouter.

Et l'outil est conçu pour fonctionner avec une liste texte de noms d'ordinateur ou les noms d'ordinateur interrogées à partir d'Active Directory.

Exploration de l'outil

Je commencer avec le script lui-même (voir figure 1 ), parcourant les éléments de sa structure et examiner des astuces qu'il utilise.Certaines de ces techniques peuvent sembler un peu étrange ou hors du lieu, mais je suis lumping les dans cet emplacement afin que je peut montrer une variété d'astuces pratiques utilisés.

La figure 1 le script

1. function Get-WmiInventory {
2.  param (
3.  $wmiclass = "Win32_OperatingSystem"
4.  )
5.  PROCESS {
6.   $ErrorActionPreference = "SilentlyContinue"
7.   $computer = $_
8.   trap {
9.    $computer | out-file c:\errors.txt -append
10.    set-variable skip ($true) -scope 1
11.    continue
12.   }
13.   $skip = $false
14.   $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop
15.   if (-not $skip) {
16.    foreach ($obj in $wmi) {
17.     $obj | Add-Member NoteProperty ComputerName $computer
18.     write $obj
19.    }
20.   }
21.  }
22. }  

Dans ligne 1, vous pouvez afficher que la fonction est nommée Get-WmiInventory. Juste en dessous, je définir un paramètre d'entrée nommé $ wmiclass et lui donner la valeur par défaut « Win32_OperatingSystem ». Le scriptblock traitement indique que cela est une fonction de filtrage une conçu pour accepter une collection de noms d'ordinateur à partir de la canalisation, vous le verrez dans un instant comment je transmets ces informations dans la fonction.

La ligne 6 désactive le comportement du shell normal rapport d'erreurs puisque je veux fournir mes propres journalisation des erreurs. Et ligne 7 simplement extrait le nom de l'ordinateur actuel (comme transmis à la fonction) dans l'ordinateur $ variable.

Maintenant, accédez à la ligne 13, où je créer une variable nommée $ Ignorer et de lui la valeur de type Boolean la valeur False (cette option plus dans un instant). De ligne 14, j'essaie ensuite récupérer les informations WMI souhaitées de l'ordinateur actuel en utilisant la cmdlet Get-WmiObject. Notez que j'ai spécifié le paramètre –ErrorAction (ou –EA), qui indique l'environnement pour générer une exception si la récupération WMI échoue pour une raison quelconque.

La ligne 15 vérifie si le $ ignorez toujours variable contient la valeur False. Si c'est, puis ligne 16 énumère tout ce qui proviennent en WMI et l'ajoute (sur la ligne 17) une propriété de nom de l'ordinateur à chaque objet WMI. Ainsi, lorsque vous le script est retournez objets WMI à partir de plusieurs ordinateurs, chacun d'eux porte ses nom de l'ordinateur parent dans une propriété pratique. Ligne 18 génère chaque objet pour le pipeline pour une autre cmdlet peut traiter avec celui-ci ou et sous-système de mise en forme de l'environnement peut être sur pour afficher des propriétés de l'objet.

Mais que se passe-t-il si cas de problème ? Puisque J'AI spécifié –EA arrêter, l'interpréteur de commandes exécutera l'interruption de la ligne 8. Tout d'abord, il écrit la nom de l'ordinateur dans un fichier texte afin que j'ai un journal des noms d'ordinateur qui a échoué le stock. Ensuite, sur ligne 10, J'AI défini la variable ignorer $ sur la valeur booléenne True. Cela empêche le script tente de sortie rien à la ligne 15, si je hadn't fait cela, alors que chaque ordinateur qui échoue créerait informations de stock de l'ordinateur précédent en cours de sortie à nouveau.

Windows PowerShell Forum aux questions

Q : Puis-je utiliser Windows PowerShell pour gérer Windows Server 2008 Server Core ?

A absolument. Oh, vous avez probablement entendu que Windows PowerShell ne peut pas être installé sur Server Core car Server Core ne prend pas en charge .NET Framework, qui nécessite l'interpréteur de commandes. Mais ce n'est pas un problème. Beaucoup d'administrateurs plus sage n'est pas installer quoi que ce soit sur leurs serveurs si elles peuvent vous aider il et Windows PowerShell ne fait pas exception. Au lieu de cela, vous pouvez installer Windows PowerShell sur votre ordinateur client et utiliser pour gérer à distance Server Core Aide ces technologies (Windows Management INSTRUMENTATION), Active Directory et bien plus encore. Vous pouvez, par exemple, gérer facilement la plupart des aspects d'Active Directory sur un contrôleur de domaine basé à Server Core, tout sans quitter le confort de votre bureau.

Ligne 10 utilise une technique différente pour définir la variable : le recouvrement lui-même est une étendue variable privée et ne contenir variable $ ignorer. Le $ ignorer variable souhaitée provient de portée parent de l'interruption, d'un niveau supérieur. La cmdlet Set-variable permet de modifier la variable via le paramètre étendue, indiquant que l'ignorer $ m'intéresse est un niveau de haut. Notez également que lorsque vous utilisez Set-variable, le nom de la variable n'est pas incluent le symbole $ en face de.

Lecteur de test

Un simple tester consiste à simplement canal dans un seul nom de l'ordinateur, comme suit :

"localhost" | Get-WmiInventory 

Parce que je n'avez pas spécifié un nom de classe WMI, la valeur par défaut Win32_­OperatingSystem est utilisé. Pour indiquer une autre classe, effectuez cette :

"localhost" | Get-WmiInventory "Win32_LogicalDisk"

la figure 2 illustre les résultats. Et si vous souhaitez inclure plusieurs noms d'ordinateur, vous simplement créer une liste séparées par des virgules d'eux comme suit :

"localhost","server2","client17" | 
Get-WmiInventory "Win32_LogicalDisk"

fig02.gif

La figure 2 résultats Get-WmiInventory

Ordinateurs en masse

Spécification des noms d'ordinateurs individuels est assez fastidieux si vous possédez une liste longue. Si vous disposez déjà d'une liste de noms d'ordinateur dans un fichier texte, une nom de l'ordinateur par ligne, puis vous pouvez transférer ces noms directement à la fonction stock en procédant ainsi :

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service"

Une autre technique implique l'utilisation de la cmd­let Get-QADComputer, qui est fournie dans le cadre des cmdlets de Active Directory libres disponibles à partir de quest.com/powershell. Vous devez installer les cmdlets de Active Directory, ouvrez Windows PowerShell et exécuter :

Add-PSSnapin Quest.ActiveRoles.ADManagement

Exécutez Get-QADComputer pour extraire tous les ordinateurs à partir d'Active Directory. Mais sachez que dans un grand domaine, cela prendra un certain temps ! Vous pouvez exécuter Help les Get-les QADComputer pour afficher les options disponibles pour filtrer la liste des ordinateurs, tels qu'extrait uniquement les ordinateurs qui se trouvent dans une unité d'organisation spécifique (OU). Vous devez également apporter une modification mineure au script, modification ligne 7

$computer = $_

$computer = $_.Name

Cela est nécessaire car les objets générés par Get-QADComputer stocke le nom de l'ordinateur dans une propriété Name plutôt que comme un objet de chaîne simple.

Vous que faire avec son ?

Sortie par défaut de ce script va prendre que forme le sous-système de mise en forme de Windows PowerShell crée par défaut. Par exemple, la classe Win32_OperatingSystem est un petit sous-ensemble (seulement six propriétés) des informations disponibles de cette classe. Vous pouvez transférer sortie ce script vers n'importe quel cmdlet shell standard pour personnaliser cette sortie. Ainsi, pour afficher numéro de version et service d'informations de pack, ainsi que les noms d'ordinateur, procédez cela :

Get-Content c:\names.txt | Get-WmiInventory | 
Format-List BuildNumber,ServicePackMajor­Version,­ComputerName

Si vous souhaitez obtenir un inventaire des services installés et produire un tableau HTML, procédez comme suit :

Get-Content c:\names.txt | Get-WmiInventory "Win32_Service" | 
ConvertTo-HTML | Out-File c:\services_inventory.html

Et si vous souhaitez obtenir un inventaire complet des informations de disque logique et l'écrire dans un fichier valeurs séparées (CSV) virgule, faire cela :

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" | Export-CSV c:\disks.csv

Notez que car la fonction Get-WmiInventory génère des objets, texte pas simple, l'interpréteur de commandes pouvez utiliser tout à fait un peu pour vous aider à obtenir les données dans le formulaire que vous avez besoin, qu'il s'agisse de statistiques trending, Gestion des rapports, ou simplement un rapide aperçu des informations importantes.

Aller plus loin

Une faiblesse dans le script en cours est qu'il récupère tous les objets WMI de la classe que vous spécifiez. Avec certaines classes, qui peut être trop de données. Je préfère généralement restreindre les Win32_LogicalDisk, de sorte que j'extrais uniquement les disques locaux, qui possède une propriété DriveType de 3. Je pouvez facilement modifier le script pour inclure souhaitez que les critères de filtre, le script modifié est illustré figure 3 . Pour appeler ce nouveau script, J'AI utilisez ceci :

Get-Content c:\names.txt | 
Get-WmiInventory "Win32_LogicalDisk" "DriveType='3'"

La figure 3 le script révisée pour prend en charge le filtrage

1. function Get-WmiInventory {
2.  param (
3.   $wmiclass = "Win32_OperatingSystem"
4.   $filter = ""
5.  )
6.  PROCESS {
7.   $ErrorActionPreference = "SilentlyContinue"
8.   $computer = $_
9.   trap {
10.    $computer | out-file c:\errors.txt -append
11.    set-variable skip ($true) -scope 1
12.    continue
13.  }
14.  $skip = $false
15.  $wmi = Get-WmiObject -class $wmiclass -computer $computer -ea stop –filter $filter
16.  if (-not $skip) {
17.    foreach ($obj in $wmi) {
18.     $obj | Add-Member NoteProperty ComputerName $computer
19.     write $obj
20.    }
21.   }
22.  }
23. }

Les modifications, en lignes 4 et 15, simplement collecter un paramètre nommé filtre $ et lui transmettre au paramètre –filter de Get-WmiObject. Lors de l'appel de la fonction, le paramètre Filtre $ est ensuite, donc il est transmis en tant que deuxième valeur après le nom de classe WMI. Il existe bien plus que vous pouvez faire pour personnaliser cette fonction pour votre environnement spécifique, mais il existe quelques éléments que vous devez éviter ceci :

  • Ne pas avoir la fonction d'envoyer la sortie pour tout sauf le pipeline, qui est effectué sur la ligne 19 du script modifié. En d'autres termes, n'avez pas besoin les informations de sortie de fonction un fichier. En revanche, prenez la sortie de pipeline de la fonction et envoyer à une cmdlet comme Out-File, qui se place la sortie sur un fichier ou tout autre support. Cela garantit que la fonction conserve sa souplesse.
  • Ne pas filtrer les informations contenues dans la fonction, comme suppression des propriétés d'objet WMI ou uniquement générer un sous-ensemble des propriétés. Cela serait trop réduire de flexibilité la fonction pour scénarios futures. En revanche, si vous ne devez toutes les informations en cours de sortie, canal que sortie pour une cmdlet Format Select-Object et afin que peut uniquement les informations dont vous avez besoin de la tâche en cours.
  • N'ajoutez pas les tâches supplémentaires à la fonction. Conserver chaque fonction chargées unique, plutôt que construction super-functions que beaucoup de choses. Si vous disposez d'un processus complexe, réaliser qu'il en création de chaque tâche discret comme une fonction autonome et puis des informations d'une à l'autre. Il conserve chaque fonction plus flexible, plus facile à gérer et beaucoup plus facile à déboguer.

Puissants outils Do-It-Yourself

Lorsqu'un script comme il s'agit pas remplace un système de gestion de configuration puissant tels que System Center Configuration Manager, il constituent un moyen facile d'informations de sélection de stock à partir d'un ensemble d'ordinateurs distants. Ce script est un bon exemple d'une des choses que Windows PowerShell est préférable à: offrant une solution rapide et ad hoc aux problèmes que Microsoft n'a pas foresee lors de la création Windows ou tout ce qui autres produits vous utilisez.

Étant donné que ce script particulière utilise WMI, il fonctionne avec ordinateurs tout le moyen au Windows NT 4.0, même si Windows PowerShell lui-même ne peut pas être installé sur un ordinateur qui ancien ! Et, parce que plusieurs produits Microsoft exposent des informations de gestion via WMI, vous pouvez collecter des informations de différents produits. Je souhaitez utiliser un outil explorateur WMI (un gratuit une est à ScriptingAnswers.com dans la « Outils de zone ») pour parcourir les informations WMI disponibles sur un ordinateur, puis utiliser un script comme celui que j'ai montré ici pour collecter des qu'informations à partir de plusieurs ordinateurs.

Don Jones un partenaire concentrés Technologies et co-auteur de Windows PowerShell: TFM (Press SAPIEN). Obtenir des conseils de Windows PowerShell hebdomadaires et contacter Don, à ConcentratedTech.com.