samedi 7 février 2009

Création de fiche serveur avec Word 2007 et PowerShell (Partie 2)

La partie précédente de cet article se trouve ici !
Nous voici à la première étape : Identification et récupération des informations pertinentes sur nos serveurs !

Dans cet article nous allons créer un module PowerShell capable de récupérer les informations des serveurs de notre parc informatique. Mais… c’est quoi un module ? C’est tout simplement un ensemble de fonctions : une sorte de librairie que nous pouvons réutiliser et partager !

Remarque : Les modules sont apparus avec PowerShell V2.

Pour faire notre premier module, nous allons créer un fichier nommé « Computer_Info.psm1 ». Remarquez l’extension .PSM1 du fichier ! La seconde chose à faire est d’y écrire nos fonctions qui iront chercher les informations de nos serveurs.

Ensuite, nos futurs scripts pourront faire appel aux fonctions de ce module. Vous l’aurez compris, les modules permettent de réutiliser le code, de faire des librairies ; bref de capitaliser !

Par défaut, PowerShell ira chercher nos modules dans les répertoires listés dans la variable d’environnement PSMODULEPATH ainsi que dans le répertoire courant du script faisant appel à un module. Pour afficher cette variable, exécutez la commande :

PS> $env:PSMODULEPATH

Nous pouvons donc commencer à récupérer les informations pertinentes de nos serveurs. Nous allons pour cela utiliser plusieurs méthodes. La première : WMI !
Cette première fonction que nous allons écrire dans notre module est une petite surcouche à la Cmdlet PowerShell Get-WmiObject. Elle nous permettra uniquement d’économiser quelques lignes de code…

  1. function Get-WmiInfo($strClass, $strComputer)
  2. {
  3.     return Get-WmiObject -Class $strClass -Namespace 'root\cimv2' `
  4.                          -ComputerName $strComputer
  5. }

Nous allons également ajouter une autre petite fonction qui nous facilitera la vie…

  1. function Add-Property($obj, $strProperty, $objValue)
  2. {
  3.     Add-Member -InputObject $obj -Type 'NoteProperty' -Name $strProperty `
  4.                -value $objValue -force
  5. }

La fonction Add-Property est une surcouche à la Cmdlet Add-Member permettant ici d’ajouter une propriété à un objet. Vous comprendrez pourquoi nous l’utiliserons un peu plus bas dans cet article !

Maintenant que nous avons écrit nos deux fonctions « outil », nous pouvons dans un premier temps récupérer les informations matérielles de nos machines :

  1. function Get-ComputerHardware($strComputer)
  2. {
  3.     $objRes = New-Object Object
  4.     $int = 0
  5.     
  6.     # Processors
  7.     $obj = Get-WmiInfo 'Win32_Processor' $strComputer
  8.     foreach ($objInfo in $obj) {
  9.         Add-Property $objRes 'Is32Bit' ($objInfo.Architecture -eq 0x0)
  10.         Add-Property $objRes 'Is64Bit' ($objInfo.Architecture -eq 0x9)
  11.         $int++
  12.     }
  13.     Add-Property $objRes 'NbCPU' $int
  14.     
  15.     # BIOS
  16.     $obj = Get-WmiInfo 'Win32_Bios' $strComputer
  17.     Add-Property $objRes 'BIOS' $obj.Name
  18.     
  19.     # System
  20.     $obj = Get-WmiInfo 'Win32_ComputerSystem' $strComputer
  21.     $int = [int]($obj.TotalPhysicalMemory / 1024 / 1024 / 1024)
  22.     Add-Property $objRes 'TotalMemory' "$int Go"
  23.     Add-Property $objRes 'Manufacturer' $obj.Manufacturer
  24.     Add-Property $objRes 'Model' $obj.Model
  25.     Add-Property $objRes 'Domain' $obj.Domain
  26.     Add-Property $objRes 'DNSName' ($obj.Name + '.' + $obj.Domain)
  27.     Add-Property $objRes 'NetBIOSName' $obj.Name
  28.     
  29.     # Media
  30.     $obj = Get-WmiInfo 'Win32_CDROMDrive' $strComputer
  31.     foreach ($objInfo in $obj) {
  32.         switch ($objInfo.MediaType)
  33.         {
  34.             'CD-ROM' { Add-Property $objRes 'MediaCD' $true }
  35.             'DVD-ROM' { Add-Property $objRes 'MediaDVD' $true }
  36.             'CD Writer' { Add-Property $objRes 'MediaCDRW' $true }
  37.             'DVD Writer' { Add-Property $objRes 'MediaDVDRW' $true }
  38.             default { }
  39.         }
  40.     }
  41.     
  42.     # Physical or virtual
  43.     $obj = Get-WmiInfo 'Win32_BaseBoard' $strComputer
  44.     $bln = ($obj.Manufacturer.Tolower() -contains 'microsoft'-Or
  45.            ($obj.Manufacturer.Tolower() -contains 'vmware')
  46.     Add-Property $objRes 'IsVirtual' $bln
  47.     Add-Property $objRes 'IsPhysical' (-not $bln)
  48.     
  49.     # Network adapters
  50.     Set-StrictMode -Off
  51.     $obj = Get-WmiInfo 'Win32_NetworkAdapter' $strComputer |
  52.            Where-Object { $_.PhysicalAdapter -eq $true } |
  53.            Select-Object ProductName, MACAddress
  54.     Set-StrictMode -Version 2.0
  55.     Add-Property $objRes 'NetworkCards' $obj
  56.     
  57.     # Disks
  58.     $obj = Get-WmiInfo 'Win32_DiskDrive' $strComputer |
  59.            Select-Object Model, Size
  60.     Add-Property $objRes 'Disks' $obj
  61.     
  62.     # Volumes
  63.     $obj = Get-WmiInfo 'Win32_LogicalDisk' $strComputer |
  64.            Where-Object { $_.DriveType -eq 3 } |
  65.            Select-Object VolumeName, DeviceID, Size, FreeSpace
  66.     Add-Property $objRes 'Volumes' $obj

  67.     return $objRes
  68. }

La fonction Get-ComputerHardware retourne un objet dont les propriétés sont les informations matérielles d’un ordinateur récupérées par différentes requêtes WMI !

Nous pouvons également récupérer des informations logicielles :

  1. function Get-ComputerSoftware($strComputer)
  2. {
  3.     $objRes = New-Object Object
  4.     
  5.     # Operating system
  6.     $obj = Get-WmiInfo 'Win32_OperatingSystem' $strComputer
  7.     Add-Property $objRes 'OSName' $Obj.Caption
  8.     Add-Property $objRes 'OSVersion' $Obj.Version
  9.     Add-Property $objRes 'OSServicePack' $obj.CSDVersion
  10.     Add-Property $objRes 'OSArchitecture' $obj.OSArchitecture
  11.     
  12.     # Services
  13.     $obj = Get-Service -ComputerName $strComputer |
  14.            Select-Object DisplayName, ServiceName, Status
  15.     Add-Property $objRes 'Services' $Obj
  16.     
  17.     # KB
  18.     $obj = Get-WmiInfo 'Win32_QuickFixEngineering' $strComputer |
  19.            Sort-Object InstalledOn |
  20.            Select-Object Description, HotFixID, InstalledBy, InstalledOn
  21.     Add-Property $objRes 'KB' $Obj
  22.     
  23.     return $objRes
  24. }

Remarquez ici l’utilisation de la Cmdlet Get-Service avec le paramètre –ComputerName qui existe depuis la V2 !

Maintenant que nous avons récupéré les informations matérielle et logicielle, nous avons presque terminé notre module !

Vous avez remarqué que nous avons écrit des fonctions « outil ». Nous aimerions donc que ces fonctions ne soient pas utilisables dans des scripts car sorties de leur contexte elles peuvent être mal utilisées.

  1. Export-ModuleMember -Function 'Get-ComputerHardware',
  2.                               'Get-ComputerSoftware'

La Cmdlet Export-ModuleMember nous permet d’exposer uniquement nos deux principales fonctions de notre module. Ainsi, les scripts qui utiliseront notre module ne pourront se servir que de ces deux fonctions !

Nous avons donc dans cet article :
1. Créé un module PowerShell V2,
2. Récupéré les informations matérielles et logicielles d’une machine.

Dans le prochain article, nous créerons notre document Word 2007 qui sera utilisé pour générer nos fiches serveurs !

2 commentaires:

  1. Bonjour, comment faire pour créer le fichier nommé « Computer_Info.psm1 » ? quelle est la commande ?

    RépondreSupprimer
  2. Bonjour,

    Pour créer un fichier en PowerShell, vous pouvez utiliser la Cmdlet New-Item. Dans notre exemple, si vous souhaitez créer le fichier Computer_Info.psm1 vous pouvez exécuter la commande suivante dans une session PowerShell Administrateur :
    New-Item -Path C:\Windows\system32\WindowsPowerShell\v1.0\Modules -Name Computer_Info.psm1 -ItemType File

    Le répertoire indiqué est le répertoire des modules PowerShell par défaut (contenu dans la variable $env:PSModulePath)

    Il conviendra ensuite d'écrire l'ensemble des fonctions et commandes décrites dans cet article.

    RépondreSupprimer