PowerShell : la machine est-elle un ordinateur fixe ou un ordinateur portable ?
Sommaire
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:
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
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.
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.
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 ».
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
Bonjour,
J’ai découvert la semaine dernière par hasard $env:chassis
Je n’ai pas testé dans tous mes environnement.
Bonjour,
Chez moi, cette variable d’environnement n’existe pas.
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.
Bonjour,
Merci pour ce tutoriel.
Si nous ne utilisons pas MDT, comment le mettre en place automatiquement ?
Le script nous devons le mettre dans une GPO ?
Si les ordinateurs sont déjà dans l’$OU Computer est ce possible de les déplacer dans une $OU Portable ou Fixe ?
Pouvez-vous faire une vidéo ?
Merci
Bien cordialement,