Dans mon précédent post Comment rechercher les versions OS dans Active Direcroty avec Powershell ?
J’expliquais comment utiliser la commande Get-AdComputer pour rechercher les versions OS dans Active Directory avec Powershell.
Cependant cette commande s’applique sur des comptes ordinateurs AD liés à des machines physique ou virtuel qui n’existent plus ou qui sont tout simplement éteintes
Pour que ce soit plus dynamique je vais combiner la commande Get-AdComputer avec la commande Get-CimInstance en utilisant la classe Win32_OperatingSystem.
La commande Get-CimInstance essaye de joindre la machine en direct pour récupérer les informations demandées.
Dans notre cas nous allons donc voir comment utiliser Get-CimInstance pour retrouver des versions de Windows.
Nous allons essayer de faire cela en une ligne de commande, sans nécessairement faire un script. C’est parti!
Prérequis pour utiliser Get-CimInstance
La commande Get-CimInstance utilise WinRM (Windows Remote Management) la liste des prérequis pour WinRM est disponible ici, mais je vous la résume pour plus de lisibilité.
Prérequis Système:
La machine qui lancera la commande et la machine interrogée devront:
- Etre sous Windows*
- être allumée (c’est bête mais des fois on y pense pas)
- Avoir Windows PowerShell 2.0 ou plus
- Avoir Microsoft .NET Framework 2.0 ou plus
- Avoir Windows Remote Management 2.0
*c’est aussi possible sous Linux et MacOs mais cela nécessite d’activer d’autres prérequis notamment le https avec échange de certificats etc. cela peut s’avérer fastidieux
Privilèges ou Droits Utilisateurs pour lancer la commande
- Etre membre du groupe Administrateur local de la machine distante
Prérequis réseau sur la machine distante:
- Port réseau WinRM http (5985) ou https (5986)
En préambule il faut tenter de lancer ces commandes depuis un poste ou un serveur qui a un accès réseau à tous les postes, si possible depuis un Contrôleur de Domaine et avoir les droits nécessaire pour utillser WinRM.Utilisant des commandes de lecture (Get) et par défaut l’AD étant en lecture seule par tous les utilisateurs AD il n’y aura pas de risque de casse ;-).
Créer la liste des comptes AD à interroger avec Get-AdComputer
Pour éviter d’élargir la recherche à tous les comptes de l’Active Directory nous allons utiliser le paramètre -SearchBase pour limiter à certaines OU (Organization Unit).
Le paramètre SearchBase nécessite d’entrer l’OU cible en « Distinguished Name »
Get-ADComputer -SearchBase « OU=Serveurs,OU=Paris,DC=sysproject,DC=local »
cmdlet Get-ADComputer at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Filter:
En entrant la commande, PS nous indique qu’il faut entrer le paramètre « -Filter » pour pouvoir l’exécuter dans notre cas je vais filtrer sur le nom des serveurs.
Get-ADComputer -SearchBase « OU=Serveurs,OU=Paris,DC=sysproject,DC=local » -Filter { name -like « * »}
Puis nous allons sélectionner la propriété Name (nom). Pour la faire passer dans la commande suivante grâce à un pipe. Super nous commençons à avoir des choses.
Get-ADComputer -SearchBase « OU=Serveurs,OU=Paris,DC=maf,DC=local » -Filter { name -like « * » } | Select-object -Property Name
Name
———
Server01
Server02
Server03
Server04
Server05
Lancer la commande Get-CimInstance sur la liste des comptes créés
Comme évoqué la commande à suivre sera Get-CimInstance pour retrouver des versions de Windows en utilisant la classe Win32_OperatingSystem.
Nous aurions pu utilisé la commande Get-WMIObject mais celle-ci sera bientôt dépréciée (deprecated). La différence est très bien expliquée dans ce post (en anglais).
Nous faisons donc une boucle sur les valeurs « name » récupérées
Get-ADComputer -SearchBase « OU=Serveurs,OU=Paris,DC=maf,DC=local » -Filter { name -like « * » } | Select-object -Property Name | % { Get-CimInstance -ComputerName $_.Name -ClassName Win32_OperatingSystem }
SystemDirectory Organization BuildNumber RegisteredUser SerialNumber Version PSComputerName
———————— ——————- —————— —————- —— ——————– ———– —————————
C:\Windows\sys… SYSPROJECT 17763 ADMIN 00429-80392-7… 10.0.17763 Server01
C:\Windows\sys… SYSPROJECT 14393 ADMIN 00377-70390-3… 10.0.14393 Server02
C:\Windows\sys… SYSPROJECT 14393 ADMIN 00377-70390-3… 10.0.14393 Server03
C:\Windows\sys… SYSPROJECT 9600 ADMIN 00252-60420-5… 6.3.9600 Server04
Pour ma part je ne suis pas satisfait du résultat car les résultats sont tronqués et nous n’avons pas tout … Je vais donc regarder toutes les propriétés existantes et sélectionner celles dont j’ai besoin en arrêtant la boucle avec la combinaison de touche CTRL+C dès que j’ai mon premier résultat. Histoire de ne pas boucler pour rien.
Les propriétés qui m’intéressent sont donc:
- PSComputerName: Server01 > pour avoir le nom DNS du serveur c’est plus pratique
- Caption: Microsoft Windows Server 2012 R2 Standard > à l’instar de la propriété Name la version
- InstallDate: 13/02/2018 14:44:55 > parce que ça m’intéresse
- OsArchitecture: 64 bits > parce que ça m’intéresse également
Nous allons mettre tout cela en forme avec la commande Format-Table (raccourci FT) et le paramètre Autosize sinon le champ Caption reste tronqué. Il y a d’autre manière de faire d’ailleurs n’hésitez pas à en ajouter dans les commentaires mais j’ai choisi celle-là.
Get-ADComputer -SearchBase « OU=Serveurs,OU=Paris,DC=maf,DC=local » -Filter { name -like « * » } | Select-object -Property Name | % { Get-CimInstance -ComputerName $_.Name -ClassName Win32_OperatingSystem -Property « * » } | Select-Object -Property PSComputername, Caption, InstallDate, OsArchitecture | ft -AutoSize
Résultat final
Et voila le travail ! Si vous avez beaucoup de machine la commande peut-être longue le temps d’interrogé toutes vos machines. Je vous conseille donc de la lancer sur un serveur comme ça vous pouvez faire autre chose en même temps.
PSComputerName Caption InstallDate OsArchitecture
————– ——- ———– ————–
Server01 Microsoft Windows Server 2012 R2 Standard 13/02/2018 14:44:55 64 bits
Server02 Microsoft Windows Server 2016 Standard 27/02/2019 10:22:45 64 bits
Server03 Microsoft Windows Server 2019 Standard 22/09/2020 14:12:22 64 bits
Server04 Microsoft Windows Server 2016 Standard 30/03/2018 18:15:43 64 bits
Server05 Microsoft Windows Server 2016 Standard 08/01/2019 17:19:49 64-bit
Si vous rencontrez cette erreur…
Get-CimInstance : Le client WinRM ne peut pas traiter la demande car le nom du serveur ne peut pas être résolu.
Au caractère Ligne:1 : 130
… rty Name | % { Get-CimInstance -ComputerName $_.Name -ClassName Win32_OperatingS …CategoryInfo : ConnectionError: (root\cimv2:Win32_OperatingSystem:String) [Get-CimInstance], CimException
FullyQualifiedErrorId : HRESULT 0x803381b9,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand
PSComputerName : Server06
C’est que WinRM n’a pas pu joindre la machine donc un des prérequis cités plus haut n’a pas été validés donc soit
- La machine est éteinte
- La machine n’est pas sous Windows
- Elle n’est pas joignable depuis votre réseau (tentez un ping (si c’est ouvert en cas de réussite passez au point suivants)
- WinRM n’est pas configuré
- Vous n’avez pas les droits sur la machine
Je vous avoue que ce n’est pas très beau, mais nous verrons dans un autre article comment gérer les erreurs ou exceptions dans Powershell là l’idée était de faire ça rapidement en quelques lignes.
En attendant vous pouvez voir le nom du compte AD qui pose problème à la fin du message d’erreur grâce à PSComputername qui est remonté.
Voilà désormais vous savez comment utiliser Get-CimInstance pour retrouver des versions de Windows.
Commentaires récents