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

Contenu

Logo Powershell

De nombreux administrateurs de serveurs utilisent PowerShell. Bien sûr, l'une des tâches les plus utilisées est la possibilité de créer des scripts et des fonctions pour inventorier vos serveurs et comprendre ce que votre environnement a.

Même s'il existe de nombreuses alternatives pour 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.

Conditions préalables

Ce poste sera pratique. Si vous avez l'intention d'aller de l'avant, assurez-vous d'abord que vous remplissez les conditions préalables suivantes:

  • Travailler sur un PC Windows 10 joint à un domaine Active Directory (UN D)
  • Installez le module ActiveDirectory PowerShell à partir du Boîte à outils RSAT.
  • Avoir la permission d'afficher les comptes d'ordinateur AD
  • Peut exécuter des requêtes WMI / CIM distants sur des ordinateurs distants
  • j'ai Télécommande PowerShell disponible sur les ordinateurs distants

Récupération des serveurs

Les serveurs eux-mêmes sont fondamentaux pour le script que nous construisons. Vous pouvez les écrire individuellement dans un fichier texte qui est lu, ou dans un tableau dans le script lui-même, mais avec 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 (UN D) pour extraire la liste des objets informatiques dans une unité organisationnelle (OU) déterminé.

Ensuite, nous utilisons le ActiveDirectory module, disponible dans le Boîte à outils RSAT, de consulter le Servers OU et y 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

En ce point, nous aurions pu simplement filtrer la propriété name pour compléter le $servers variable, mais il est souvent très utile d'avoir l'objet entier retourné pour une utilisation ultérieure.

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'intégralité de l'objet AD est de combiner ces données avec les données directement du serveur pour obtenir une image plus large de votre environnement..

Dans la pratique, À quoi ressemble quelque chose comme ça? Nous allons lister quelques-unes des propriétés qu'il serait très utile de connaître.

Paramètres du serveur

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

Les valeurs d'AD

  • Réglage du dernier mot de passe
  • Dernière connexion
  • Nom d'hôte DNS

Récupérer les informations du serveur

Comment procédons-nous pour collecter ces informations sur notre liste de serveurs renvoyés ?? Puisque nous avons une liste de serveurs, nous devrons l'itérer dessus $Servers objet et requête. Commencer par un simple Foreach-Object boucle ci-dessous, nous pouvons créer un objet personnalisé pour garder 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 tu peux le voir, lors de l'enregistrement de l'intégralité de l'objet Active Directory lors de la première récupération des ordinateurs, nous permet de compléter 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 serveurs, Qu'est-ce que l'interface d'instrumentation d'administration Windows ? (WMI). Vous pouvez voir que les applets de commande utilisées ci-dessous proviennent de l'interface Common Information Model (CIM), dont WMI est la mise en œuvre par Microsoft de cette norme.

Obtenez de l'espace disque libre

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

Le deuxième problème ici est que nous avons plus d'une unité retournée. J'aimerais savoir sur chacun de ces disques et combien d'espace libre est disponible en Go. Modifions le code pour faire 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é les commandes, notre sortie est beaucoup plus propre et peut maintenant être utilisée dans notre script.

Mais, Et si nous voulions alerter sur une condition d'espace disque faible? Ce serait bien de développer un peu cela pour déterminer un indicateur dans chaque unité qui remplit cette condition. Comparer l'espace libre avec l'espace total disponible, on peut voir s'il est en dessous du 10% O 10 FR. La raison de la -or La condition est que sur les très gros disques, les 10% peut encore être très généreux, donc déterminer 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)

  If ( ($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 voir maintenant, nous avons un grand nombre d'informations à stocker sur nos serveurs.

Comment% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / Sans titre% 202.png? Couper = 1,1 & bg-couleur = 000 & tampon = 1,1

Obtenir de la mémoire disponible

Il est utile de savoir combien de RAM est allouée à chaque serveur, surtout dans un environnement de machine virtuelle. Si vous trouvez que certains sont surprovisionnés, vous pouvez économiser des ressources précieuses en ajustant la taille correcte des serveurs. Par chance, c'est beaucoup plus facile à récupérer.

En utilisant le Win32_PhysicalMemory Classe WMI, nous pouvons ajouter tous les retours Capacity propriétés pour obtenir la mémoire totale.

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

Obtenez toutes les connexions réseau

En conclusion, nous voulons récupérer toutes les connexions réseau ensemble. Ceci est utile pour savoir si un certain serveur a plusieurs interfaces à gérer. En utilisant un mécanisme légèrement différent cette fois, nous utilisons le Get-NetAdapter applet de commande, mais comme celui-ci n'a pas de 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  Select-Object Name, Status, LinkSpeed

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

Veuillez noter que pour Invoke-Command Pour que ça marche, il faudra configurer PS Remoting sur les serveurs cibles.

Mettre tous ensemble

Maintenant que nous avons tous les morceaux, mettons tout cela ensemble. Le script final est ci-dessous et combine tout le code pour créer un objet de sortie personnalisé avec ce que nous voulons signaler.

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  Select-Object Name, Status, LinkSpeed
  

    [PSCustomObject]@ Measure-Object -Property Capacity -Sum).Sum / 1GB)
        "NetworkConnections" = $NetworkConnections
        "PasswordLastSet"    = $_.pwdLastSet
        "LastLogon"          = $_.lastLogon
        "DNSHostName"        = $_.DNSHostName
        "CreationDate"       = $_.WhenCreated
    
}

conclusion

Ce que nous avons 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. Aller plus loin, vous pouvez le construire dans une page HTML, planifier une tâche à exécuter chaque semaine ou même l'intégrer dans d'autres outils comme Ansible.

PowerShell facilite l'obtention de toutes les informations dont vous avez besoin en un seul endroit. Une fois que vous avez analysé votre environnement et déterminé ce que vous devez savoir, créer le rapport dans PowerShell pour vous aider à préparer votre capacité à auditer votre environnement à l'avenir.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.