Flash info

"Les IT Pros sont en train de migrer rapidement car PowerShell est plus facile et plus puissant que VBScript."

Microsoft Scripting Guys

 
Accueil arrow Bibliothèque de scripts arrow Système arrow Récupérer la version d'OS et la date d'installation
Récupérer la version d'OS et la date d'installation
Écrit par Arnaud Petitjean [MVP]   
26-06-2010

Get-OSInfo 

Besoin d'un petit script d'inventaire rapide pour déterminer la version de l'OS, le niveau de Service Pack et la date d'installation d'une machine (locale ou distante) ? Alors ce script est fait pour vous... 

 Exemple de résultat :

  ComputerName OS                                          ServicePack    InstallationDate
  ------------ --                                          -----------    ----------------
  Machine1     Microsoft Windows XP Professionnel       Service Pack 2 15/06/2009 13:25:53
  Machine2     Microsoft Windows XP Professionnel       
Service Pack 3 08/03/2010 10:36:37
  Machine3     Microsoft(R) Windows(R) Server 2003...                  16/10/2007 15:42:15

Pour récupérer toutes ces informations système, nous aurons simplement besoin de la classe WMI Win32_OperatingSystem.

Comme tout bon script PowerShell qui se respecte, nous allons faire en sorte d'obtenir en sortie un objet et non simplement du texte. Cela va se réaliser grâce à une fonctionnalité assez méconnue de la commande Select-Object.

Pour rester simple et compatible avec PowerShell v1 nous pouvons écrire le script suivant :

Function Get-OSInfo
{
   param ([String]$ComputerName = '.')

   $infos = Get-WmiObject Win32_OperatingSystem -ComputerName $ComputerName

   $infos | Select-Object -property @{Name='ComputerName'; Expression = {$_.Csname}},
                                    @{Name='OS'; Expression = {$_.caption}},
                                    @{Name='ServicePack'; Expression = {$_.csdversion}},
                                    @{Name='InstallationDate'; Expression ={[system.Management.ManagementDateTimeConverter]::ToDateTime($_.Installdate)}}
                                    
}

 Exemple 1: Utilisation locale

PS > Get-OSInfo | Format-Table -AutoSize

ComputerName    OS                                         ServicePack InstallationDate
------------    --                                         ----------- ----------------
ARNAUD-PORTABLE Microsoft Windows Server 2008 R2 Standard              24/05/2010 16:27:15

Le résultat de cette commande est donc un objet qui possède les 4 propriétés que nous avons défini dans notre script.

 Exemple 2: Utilisation sur une machine distante  

PS > Get-OSInfo -ComputerName MachineDistante

 Exemple 3: Utilisation sur un groupe de machines distantes  

PS > 'Machine1','Machine2','Machine3' | foreach {Get-OSInfo -ComputerName $_}

  ComputerName OS                                                    ServicePack    InstallationDate
  ------------ --                                                    -----------    ----------------
  Machine1     Microsoft Windows XP Professionnel                    Service Pack 2 15/06/2009 13:25:53
  Machine2     Microsoft Windows XP Professionnel                    Service Pack 3 08/03/2010 10:36:37
  Machine3     Microsoft(R) Windows(R) Server 2003, Standard Edition Service Pack 2 16/10/2007 15:42:15

Nous avons atteint l'objectif que je m'étais fixé, mais nous pouvons à présent améliorer encore notre script afin d'exploiter au mieux les nouvelles fonctionnalités de PowerShell v2. Nous allons donc faire en sorte de pouvoir directement envoyer les données à la fonction sans avoir à réaliser le foreach.

Voilà ce que j'aimerais pouvoir écrire :

PS > 'Machine1','Machine2','Machine3' | Get-OSInfo

Mais je ne veux pas faire de concession, c'est à dire que je ne veux pas perdre le paramètre ComputerName. Je veux seulement donner de la flexibilité d'usage à mon script. C'est là qu'interviennent alors ce que l'on appelle les fonctions avancées.

#Requires -version 2
function Get-OSInfo
{
   [CmdletBinding()]
   param (
     [Parameter(Mandatory=$False, ValueFromPipeline=$true)]
     [String[]]$ComputerName = '.'
  
)

   Process
   {
     foreach ($computer in $ComputerName)
     {
        $infos = Get-WmiObject Win32_OperatingSystem -ComputerName $Computer
   
        $infos | Select-Object -property @{Name='ComputerName'; Expression = {$_.Csname}},
            @{Name='OS'; Expression = {$_.caption}},
            @{Name='ServicePack'; Expression = {$_.csdversion}},
            @{Name='InstallationDate'; Expression ={[system.Management.ManagementDateTimeConverter]::ToDateTime($_.Installdate)}}
     }
   }                                 
}

Toute la magie du Pipe réside dans les instructions [CmdletBinding()], [Parameter(Mandatory=$False, ValueFromPipeline=$true)] et Process.

Autrement dit, la fonction accepte maintenant les données à travers le pipeline mais de façon non obligatoire. Et maintenant le tour est joué ! Nous pouvons l'utiliser de la façon de notre choix.

Dernière chose pour parfaire notre script : nous allons lui ajouter de l'aide afin que lorsqu'un utilisateur demande de l'aide avec la commande Get-Help qu'il obtienne une aide similaire à une commande native.

Cela se réalise de la façon suivante :

#Requires -version 2
function Get-OSInformation
{
   <#
   .SYNOPSIS
     Obtient des informations sur le système d'exploitation local, distant ou sur un groupe de machines.
   .DESCRIPTION
     La fonction Get-OSInformation récupère les informations suivantes: Version de l'OS, du Service Pack, et la date d'installation du système.
  Cette fonction s'appuie sur WMI, vous devez donc vous assurer que le réseau sur lequel vous effectuez votre requête laisse passer le protocole RPC et que la machine distante accepte les requêtes WMI (normalement configuré par défaut).
   .PARAMETER ComputerName
     Spécifie un ordinateur distant. La valeur par défaut est l'ordinateur local.

  Tapez le nom NetBIOS, une adresse IP ou le nom de domaine complet d'un ordinateur distant.
  
  Ce paramètre ne s'appuie pas sur la communication à distance Windows PowerShell. Vous pouvez utiliser le paramètre ComputerName de Get-Hotfix même si votre ordinateur n'est pas configuré pour exécuter des commandes distantes.
   .EXAMPLE
     Get-OSInformation
  
  ComputerName                  OS                            ServicePack                   InstallationDate
  ------------                  --                            -----------                   ----------------
  MachineLocale                 Microsoft(R) Windows(R) Se... Service Pack 2                16/10/2007 15:42:15
  
  Cette commande obtient les informations système de l'ordinateur local.
   .EXAMPLE
     Get-OSInformation -ComputerName MachineDistante
  
  Cette commande obtient les informations système d'un ordinateur distant.
   .EXAMPLE
     Get-OSInformation -ComputerName Machine1, Machine2, Machine3 | Format-Table -autosize

  ou
  
  PS > 'Machine1','Machine2','Machine3' | Get-OSInformation | Format-Table -autosize
  
  ComputerName OS                                                    ServicePack    InstallationDate
  ------------ --                                                    -----------    ----------------
  Machine1     Microsoft Windows XP Professionnel                    Service Pack 2 15/06/2009 13:25:53
  Machine2     Microsoft Windows XP Professionnel                    Service Pack 3 08/03/2010 10:36:37
  Machine3     Microsoft(R) Windows(R) Server 2003, Standard Edition Service Pack 2 16/10/2007 15:42:15

  Cette commande obtient les informations système d'un ensemble d'ordinateurs distants.
  
  Notez que vous pouvez utiliser directement le pipe pour passer des valeurs à cette commande.
 .NOTES
  Author:  Arnaud PETITJEAN
  Version:  1.0
  Date:  23/06/2010
   #>

   [CmdletBinding()]
   param (
     [Parameter(Mandatory=$False, ValueFromPipeline=$true)]
     [String[]]$ComputerName = '.')

   Process
   {
     foreach ($computer in $ComputerName)
     {
       $infos = Get-WmiObject Win32_OperatingSystem -ComputerName $Computer
   
       $infos | Select-Object -property @{Name='ComputerName'; Expression = {$_.Csname}},
            @{Name='OS'; Expression = {$_.caption}},
            @{Name='ServicePack'; Expression = {$_.csdversion}},
            @{Name='InstallationDate'; Expression ={[system.Management.ManagementDateTimeConverter]::ToDateTime($_.Installdate)}}
     }
   }                                 
}

Exemple 4 : Obtention d'aide sur la fonction

PS C:\> help Get-OsInfo -Detailed

get-help_get-osinfo.png
Dernière mise à jour : ( 26-06-2010 )
 
© 2017 PowerShell-Scripting.com