PowerShell : la machine est-elle un ordinateur fixe ou un ordinateur portable ?

I. Présentation

Lorsque l'on crée un script PowerShell pour gérer les machines de son parc informatique, on peut chercher à obtenir l'information suivante : est-ce qu'il s'agit d'un ordinateur fixe ou d'un ordinateur portable ? Cela tombe bien, nous allons répondre à cette question dans ce tutoriel orienté scripting PowerShell, mais aussi Active Directory, nous verrons pourquoi.

II. PowerShell : PC fixe ou PC portable ?

Sans parler de PowerShell, réponds à une question simple : qu'est-ce qui différencie un ordinateur fixe d'un ordinateur portable ? Sans parler du format, au niveau du matériel il y a une différence majeure : un ordinateur portable dispose d'une batterie, tandis qu'un ordinateur fixe n'en a pas.

C'est d'autant plus intéressant que l'on va pouvoir vérifier avec PowerShell si la machine dispose d'une batterie ou non. Pour moi, c'est une bonne façon de déterminer s'il s'agit d'un PC fixe ou d'un PC portable. Il va falloir interroger la classe "win32_battery".

Ouvrez une console Windows PowerShell et exécutez cette commande :

Get-WmiObject -Class win32_battery

Dans le cas où la commande est exécutée sur un ordinateur portable, elle va renvoyer un résultat:

PowerShell - Win32_battery

Sinon, elle ne pourra pas renvoyer un tel résultat donc on sait que l'on est sur un ordinateur fixe.

Une autre façon de faire, c'est de regarder le type de châssis de la machine. Pour obtenir cette information, il faut interroger la classe "Win32_SystemEnclosure" et récupérer la valeur de la propriété "ChassisTypes".

Get-WmiObject -Class Win32_SystemEnclosure | Select-Object ChassisTypes

PowerShell Châssis type

Cette commande retourne un numéro, pour ma part "9" sur mon ordinateur portable et "3" dans une VM. Si l'on regarde la documentation Microsoft au sujet de la propriété "Win32_SystemEnclosure", on peut obtenir la signification de cet identifiant.

  • 3 = Desktop
  • 9 = Laptop

C'est tout de suite plus parlant ! Tout cela pour dire que différencier les ordinateurs portables et les ordinateurs fixes, on peut aussi s'appuyer sur le type de châssis.

Voici les types qui font référence à des PC portables (ou équivalents) même si j'ai un doute sur les 3 dernières valeurs, car ma Surface Pro retourne la valeur "9" :

  • 8 = Portable
  • 9 = Laptop
  • 10 = Notebook
  • 14 = Sub Notebook
  • 30 = Tablet
  • 31 = Convertible
  • 32 = Detachable

En exécutant la commande ci-dessous, on peut filtrer sur les PC portables, car la commande ne retournera rien si l'ordinateur n'est pas un portable :

Get-WmiObject -Class Win32_SystemEnclosure | Where-Object { $_.ChassisTypes -in ("8","9","10","14","30","31","32") }

Personnellement, je préfère vérifier la présence de la batterie, je trouve cela plus simple tout en étant efficace, mais s'intéresser au châssis est une autre façon de faire.

III. Ajouter l'ordinateur dans une OU spécifique en fonction de son type

Passons à la deuxième partie de l'article où l'on va exploiter ce que l'on a vu précédemment. L'idée c'est d'ajouter l'ordinateur au domaine Active Directory tout en l'affectant à une OU spécifique en fonction de son type. Un script que vous pouvez lancer lorsque vous déployez vos machines, avec MDT par exemple. Une façon simple de trier automatiquement les fixes et les portables dans votre AD dès l'intégration de la machine dans le domaine.

Reprenons la vérification de la batterie comme exemple. Nous allons intégrer la commande précédente dans une structure conditionnelle "if-else". Ce qui donnera le bloc suivant :

# Si c'est un ordinateur portable...
if(Get-WmiObject -Class win32_battery){
   Write-Host "C'est un ordinateur portable"
   <instructions>
# Sinon, c'est un ordinateur fixe...
}else{
   Write-Host "C'est un ordinateur fixe"
   <instructions>
}

Nous allons compléter les blocs "<instructions>" de façon à intégrer l'intégration au domaine. Pour intégrer une machine au domaine en PowerShell, on doit utiliser le cmdlet Add-Computer. La seule différence entre l'intégration d'un ordinateur fixe et d'un ordinateur portable, c'est l'OU de destination.

Voici deux lignes : la première pour ajouter la machine, la seconde pour redémarrer la machine.

# Ajoute le PC dans le domaine dans l'OU spécifiée
Add-Computer -DomainName $DomainName -Credential $Credential -OUPath $OU

# Redémarre le PC instantanément après l'avoir ajouté au domaine
Restart-Computer -Force

Maintenant, nous devons affecter la bonne valeur à la variable $OU en fonction du type de machine (à ajuster pour correspondre à votre environnement).

  • Pour un PC portable, par exemple : "OU=Portables,OU=Ordinateurs,DC=IT-CONNECT,DC=LOCAL"
  • Pour un PC fixe, par exemple : "OU=Fixes,OU=Ordinateurs,DC=IT-CONNECT,DC=LOCAL"

Au final, on obtient le bout de code suivant :

# Si c'est un ordinateur portable...
if(Get-WmiObject -Class win32_battery){
   Write-Host "C'est un ordinateur portable"
   $OU = "OU=Portables,OU=Ordinateurs,DC=IT-CONNECT,DC=LOCAL"

# Sinon, c'est un ordinateur fixe...
}else{
   Write-Host "C'est un ordinateur fixe"
   $OU = "OU=Fixes,OU=Ordinateurs,DC=IT-CONNECT,DC=LOCAL"
}
# Ajoute le PC dans le domaine dans l'OU spécifiée
Add-Computer -DomainName $DomainName -Credential $Credential -OUPath $OU

# Redémarre le PC instantanément après l'avoir ajouté au domaine
Restart-Computer -Force

Il faudra également gérer deux variables :

  • $DomainName : le nom du domaine Active Directory à rejoindre
  • $Credential : les identifiants à utiliser pour s'authentifier sur le domaine et ajouter la machine

IV. Ajouter l'ordinateur dans une OU spécifique en fonction de son modèle

Si l'on veut aller plus loin, plutôt que de se baser sur le type de la machine, on pourrait se baser directement sur le modèle. On pourrait imaginer faire une répartition encore plus fine des machines au niveau des OU, même si je ne suis pas fan personnellement.

Pour récupérer le modèle de la machine en PowerShell, on va utiliser la commande suivante qui va venir interroger la classe "Win32_ComputerSystem" :

(Get-WmiObject -Class Win32_ComputerSystem).Model

On pourrait déclarer une liste de modèles de machine, aussi bien pour les fixes que les portables. Néanmoins, il faut faire l'éclatement manuellement à moins d'avoir une base de référence quelque part...

Par exemple :

$Portables = @("20K5S1RX00","20LXS2XQ00","20JRS0KD00","20Q8S2Y200")
$Fixes = @("10SUS2BT00","10M8S2JJ00","10T8SAVP00","PC0MR816")

La condition sera un peu différente puisque l'on va rechercher notre modèle dans nos deux tableaux ($Portables et $Fixes) :

$Modele = (Get-WmiObject -Class Win32_ComputerSystem).Model
# Si c'est un ordinateur portable...
if($Modele -in $Portables){
   Write-Host "C'est un ordinateur portable"
   <instructions>
# Sinon si c'est un ordinateur fixe...
}elseif($Modele -in $Fixes){
   Write-Host "C'est un ordinateur fixe"
   <instructions>
}

Il ne reste plus qu'à reprendre le bloc de code ci-dessus pour intégrer la variable $OU et ensuite ajouter la machine au domaine.

Merci à Lucas J. pour m'avoir donné l'idée de cet article et pour sa participation à la construction de ce tutoriel sur la partie Active Directory.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau et cofondateur d'IT-Connect. Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3219 posts and counting.See all posts by florian

6 thoughts on “PowerShell : la machine est-elle un ordinateur fixe ou un ordinateur portable ?

  • Bonjour,
    Attention avec la vérification de la batterie. Certains onduleurs connectés en USB sont considérés par Windows comme des batteries, et retourneront un résultat avec la classe Win32_battery (vérifié sur un serveur avec un tel onduleur). Il est donc préférable d’utiliser Win32_SystemEnclosure ou de trouver une autre méthode.

    Répondre
    • Bonjour =)
      Merci pour cette précision, j’avoue que je n’ai pas pensé à ce cas de figure et je ne l’ai pas rencontré. Du coup, quand on regarde le contenu de la classe Win32_Battery, quelle est la valeur de la propriété « Description » ? Je me dis qu’il doit y avoir un moyen de détecter l’onduleur, car sur un PC portable la description c’est « Batterie interne ».

      Répondre
      • La description est identique. La description est une valeur trop aléatoire pour être utilisée dans ce but. La classe Win32_SystemEnclosure est plus contraignante à utilisée du fait de la multitude de types, mais sûrement plus fiable.

        __GENUS : 2
        __CLASS : Win32_Battery
        __SUPERCLASS : CIM_Battery
        __DYNASTY : CIM_ManagedSystemElement
        __RELPATH : Win32_Battery.DeviceID= »1000MfrProd »
        __PROPERTY_COUNT : 33
        __DERIVATION : {CIM_Battery, CIM_LogicalDevice, CIM_LogicalElement,
        CIM_ManagedSystemElement}
        __SERVER : SRVHYV
        __NAMESPACE : root\cimv2
        __PATH : \\SRVHYV\root\cimv2:Win32_Battery.DeviceID= »1000MfrProd »
        Availability :
        BatteryRechargeTime :
        BatteryStatus :
        Caption : Batterie interne
        Chemistry : 2
        ConfigManagerErrorCode :
        ConfigManagerUserConfig :
        CreationClassName : Win32_Battery
        Description : Batterie interne
        DesignCapacity :
        DesignVoltage : 0
        DeviceID : 1000MfrProd
        ErrorCleared :
        ErrorDescription :
        EstimatedChargeRemaining :
        EstimatedRunTime :
        ExpectedBatteryLife :
        ExpectedLife :
        FullChargeCapacity :
        InstallDate :
        LastErrorCode :
        MaxRechargeTime :
        Name :
        PNPDeviceID :
        PowerManagementCapabilities : {1}
        PowerManagementSupported : False
        SmartBatteryVersion :
        Status :
        StatusInfo :
        SystemCreationClassName : Win32_ComputerSystem
        SystemName : SRVHYV
        TimeOnBattery :
        TimeToFullCharge :
        PSComputerName : SRVHYV

        Répondre
  • Bonjour,
    J’ai découvert la semaine dernière par hasard $env:chassis
    Je n’ai pas testé dans tous mes environnement.

    Répondre
    • Bonjour,
      Chez moi, cette variable d’environnement n’existe pas.

      Répondre
      • Bonjour,
        Chez moi non plus, la commande retourne une valeur vide. J’ai testé sur la dernière Build de Windows 10 du canal Dev pour voir, c’est pareil.

        Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

 

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.