Comment créer un rapport d'inventaire Windows Server gratuitement avec PowerShell

0
160

PowerShell est utilisé par de nombreux administrateurs de serveur. Naturellement, l'une des tâches les plus utilisées est la capacité de créer des scripts et des fonctions pour inventorier vos serveurs et comprendre ce que votre environnement a.

Bien qu'il existe de nombreuses façons d'y parvenir, avec différents niveaux de complexité, nous allons créer un rapport d'inventaire Windows Server assez simple mais efficace dans cet article.

Prérequis

Cet article sera pratique. Si vous avez l'intention de suivre, assurez-vous d'abord que les conditions préalables suivantes sont en place :

  • Travailler sur un PC Windows 10 appartenant à Active Directory (AD)
  • Avoir le module ActiveDirectory PowerShell installé à partir de la boîte à outils RSAT.
  • Avoir l'autorisation d'interroger des comptes d'ordinateur AD
  • Peut exécuter des requêtes WMI/CIM à distance sur des ordinateurs distants
  • Avoir PowerShell Remoting disponible sur les ordinateurs distants

Récupération de serveurs

Les serveurs eux-mêmes sont à la base du script que nous construisons. Vous pouvez les écrire individuellement dans un fichier texte lu ou dans un tableau dans le script lui-même, mais en utilisant PowerShell, nous pouvons faire mieux. Pour rendre le script plus dynamique et ne pas nous obliger à le modifier à chaque fois qu'un nouveau serveur est ajouté, nous pouvons utiliser Active Directory (AD) pour extraire la liste des objets informatiques dans une unité organisationnelle (OU) donnée.

< p>Ci-dessous, nous utilisons le module ActiveDirectory, disponible dans la boîte à outils RSAT, pour interroger l'unité d'organisation des serveurs et récupérer tous les objets informatiques via Get-ADComputer.

Import-Module ActiveDirectory $OU = 'OU=Servers,DC= domain,DC=local' $Params = @{ “SearchBase” = $OU “Filter” = '*' } $Servers = Get-ADComputer @Params Advertisement

À ce stade, nous aurions pu filtrer juste la propriété name pour remplir la variable $servers, mais il est souvent très utile d'avoir l'intégralité de l'objet renvoyé à utiliser plus tard.

Détermination des données à collecter

Maintenant que nous avons nos serveurs, nous devons déterminer ce que nous devons exactement collecter sur chaque serveur. L'une des raisons pour lesquelles il peut être important de conserver l'objet AD complet est de combiner ces données avec des données provenant directement du serveur lui-même pour obtenir une image plus large de votre environnement.

En pratique, à quoi ressemble quelque chose comme ça ? Énumérons certaines des propriétés qu'il serait très utile de connaître.

Valeurs du serveur

  • Nom d'hôte du serveur
  • Espace disque libre
  • Mémoire
  • Connexions réseau

Valeurs AD

  • Dernier mot de passe défini
  • Dernière connexion
  • Nom d'hôte DNS

Récupération des informations du serveur

< p>Comment procédons-nous pour collecter ces informations sur notre liste de serveurs renvoyés ? Puisque nous avons une liste de serveurs, nous devrons parcourir l'objet $Servers et interroger. En commençant par une simple boucle Foreach-Object ci-dessous, nous pouvons créer un objet personnalisé pour contenir nos valeurs.

$Servers | Foreach-Object { [PSCustomObject]@{ “ServerHostName” = $_.Name “Description” = $_.Description “FreeDiskSpace” = $Null “TotalMemory” = $Null “NetworkConnections” = $Null “PasswordLastSet” = $_. pwdLastSet “LastLogon” = $_.lastLogon “DNSHostName” = $_.DNSHostName “CreationDate” = $_.WhenCreated } }

Comme vous pouvez le constater, en enregistrant l'objet complet à partir d'Active Directory lorsque nous avons récupéré les ordinateurs pour la première fois, nous permet de remplir un large éventail d'informations. Malheureusement, ce ne sont pas toutes les informations dont nous avons besoin.

Pour obtenir les informations de chaque serveur, nous utiliserons une interface familière à de nombreux administrateurs de serveur, qui est l'interface Windows Management Instrumentation (WMI). Vous remarquerez peut-être que les applets de commande utilisées ci-dessous proviennent de l'interface Common Information Model (CIM), dont WMI est l'implémentation Microsoft de cette norme.

Obtenir l'espace disque libre

En utilisant la classe WMI disponible de Win32_LogicalDisk, nous pouvons obtenir tous les disques disponibles et leur espace libre. Lorsque nous exécutons la commande Get-CimInstance -ClassName Win32_LogicalDisk pour la première fois, vous remarquerez peut-être qu'elle n'est pas exactement lisible dans sa sortie par défaut.

Publicité

Le deuxième problème ici est que plusieurs disques sont renvoyés. Je voudrais savoir sur chacun de ces disques et combien d'espace libre est disponible en Go. Modifions le code pour effectuer quelques transformations et l'améliorer.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk $DisksResult = $Disks | Foreach-Object { [PSCustomObject]@{ “Drive” = $_.DeviceID “FreeSpace” = [Math]::Round(($_.FreeSpace/1GB),2) } } $DisksResult

Après avoir exécuté le commandes, notre sortie est beaucoup plus propre et peut maintenant être utilisée dans notre script.

Mais que se passe-t-il si nous voulons alerter sur une condition d'espace disque faible ? Ce serait bien d'étendre légèrement cela pour définir un indicateur sur chaque lecteur qui remplit cette condition. En comparant l'espace libre à l'espace total disponible, nous pouvons voir s'il est inférieur à 10 % ou à 10 Go. La raison de la condition -or est que sur les très gros disques, 10 % peuvent encore être très généreux, donc définir une limite absolue aide.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk $DisksResult = $Disks | Foreach-Object { $FreeSpace = [Math]::Round(($_.FreeSpace/1GB),2) $TotalSpace = [Math]::Round(($_.Size/1GB),2) Si ( ($ FreeSpace/$TotalSpace -LT 0.10) -Or $FreeSpace -LT 10 ) { $LowDiskSpace = $True } Else { $LowDiskSpace = $False } [PSCustomObject]@{ “Drive” = $_.DeviceID “FreeSpace” = $FreeSpace “LowDiskSpace” = $LowDiskSpace } } $DisksResult

Comme vous pouvez le constater maintenant, nous avons un grand nombre d'informations à enregistrer avec nos serveurs.

Comment%20to%20Build%20a%20Windows%20Server%20Inventory%20Report%20for/Untitled%202.png?trim=1,1&bg-color=000&pad=1,1

Obtenir la mémoire disponible

Il est pratique de connaître la quantité de RAM allouée à chaque serveur, en particulier dans un environnement de machine virtuelle. Si vous constatez que certains sont surprovisionnés, vous pouvez économiser des ressources précieuses en dimensionnant correctement les serveurs. Heureusement, c'est beaucoup plus simple à récupérer.

Publicité

En utilisant la classe WMI Win32_PhysicalMemory, nous pouvons additionner toutes les propriétés de capacité renvoyées pour obtenir la mémoire totale.

(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum/1 Go

Obtenir toutes les connexions réseau

Enfin, nous voulons récupérer toutes les connexions réseau ensemble. Ceci est utile pour savoir si un certain serveur a plusieurs interfaces dont il faut s'inquiéter. En utilisant un mécanisme légèrement différent cette fois, nous utilisons l'applet de commande Get-NetAdapter, mais comme celle-ci n'a pas de paramètre ComputerName, nous utiliserons PS Remoting pour l'invoquer localement sur le serveur cible et renvoyer les résultats à notre script.

$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock { Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed ​​}

Notre sortie ressemblera à celle ci-dessous et nous pourrons ensuite l'enregistrer dans notre script.

Gardez à l'esprit que pour que Invoke-Command fonctionne, PS Remoting devra être configuré sur les serveurs cibles.

Rassembler tout cela

Maintenant que nous avons toutes les pièces, assemblons tout cela. Le script final est ci-dessous et combine tout le code pour créer un objet de sortie personnalisé avec exactement ce sur quoi nous voulons faire rapport.

Import-Module ActiveDirectory $OU = 'OU=Servers,DC=domain,DC=local' $Params = @{ “SearchBase” = $OU “Filter” = '*' } $Servers = Get-ADComputer @Params $Servers | Foreach-Object { $Disks = Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_LogicalDisk $DisksResult = $Disks | Foreach-Object { [PSCustomObject]@{ “Drive” = $_.DeviceID “FreeSpace” = [Math]::Round(($_.FreeSpace/1GB),2) } } $NetworkConnections = Invoke-Command -ComputerName $ _.DnsHostName -ScriptBlock { Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed ​​} [PSCustomObject]@{ “ServerHostName” = $_.Name “Description” = $_.Description “FreeDiskSpace” = $DisksResult “TotalMemory” = ((Get-CimInstance -ComputerName $_. DnsHostName -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum/1GB) “NetworkConnections” = $NetworkConnections “PasswordLastSet” = $_.pwdLastSet “LastLogon” = $_.lastLogon “DNSHostName” = $_.DNSHostName ” CreationDate” = $_.WhenCreated } }

Conclusion

Ce que nous avons démontré ici n'est que la pointe de l'iceberg en termes de ce qui peut être construit pour un rapport d'inventaire. Il existe de nombreuses autres propriétés utiles que vous pouvez ajouter à ce rapport. En allant plus loin, vous pouvez l'intégrer dans une page HTML, planifier une tâche pour l'exécuter chaque semaine ou même l'encapsuler dans d'autres outils tels qu'Ansible.

Publicité

PowerShell le rend trivialement facile à obtenir toutes les informations dont vous avez besoin pour rassembler en un seul endroit. Une fois que vous avez analysé votre environnement et déterminé ce que vous devez savoir, créez le rapport dans PowerShell pour vous aider à pérenniser votre capacité à auditer votre environnement.