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.
The post PowerShell : la machine est-elle un ordinateur fixe ou un ordinateur portable ? first appeared on IT-Connect.