Viele Serveradministratoren verwenden PowerShell. Natürlich, Eine der am häufigsten verwendeten Aufgaben ist die Möglichkeit, Skripte und Funktionen zu erstellen, um Ihre Server zu inventarisieren und zu verstehen, was Ihre Umgebung hat.
Auch wenn es viele Alternativen gibt, dies zu erreichen, mit unterschiedlicher Komplexität, Wir werden in diesem Beitrag einen ziemlich einfachen, aber effektiven Windows Server-Inventarbericht erstellen.
Voraussetzungen
Dieser Beitrag wird praktisch sein. Wenn Sie beabsichtigen, weiterzumachen, Stellen Sie zunächst sicher, dass Sie die folgenden Voraussetzungen erfüllen:
- Auf einem Windows-PC arbeiten 10 einer Active Directory-Domäne beigetreten (ANZEIGE)
- Lassen Sie das ActiveDirectory PowerShell-Modul vom RSAT-Toolkit.
- Berechtigung zum Anzeigen von AD-Computerkonten haben
- Kann WMI-Abfragen ausführen / Remote-CIMs auf Remote-Computern
- Ich habe PowerShell-Remoting auf Remote-Computern verfügbar
Wiederherstellen von Servern
Grundlegend für das Skript, das wir erstellen, sind die Server selbst. Sie können sie einzeln in eine Textdatei schreiben, die gelesen wird, oder in einem Array innerhalb des Skripts selbst, aber mit PowerShell können wir es besser machen. Damit das Skript dynamischer wird und wir es nicht jedes Mal ändern müssen, wenn ein neuer Server hinzugefügt wird, wir können Active Directory verwenden (ANZEIGE) die Liste der Computerobjekte in einer Organisationseinheit extrahieren (WO) bestimmt.
Nächste, wir benutzen die ActiveDirectory
Modul, erhältlich im RSAT-Toolkit, konsultieren Servers
OU und holen Sie dort alle Computerobjekte über Get-ADComputer
.
Import-Module ActiveDirectory
$OU = 'OU=Servers,DC=domain,DC=local'
$Params = @{
"SearchBase" = $OU
"Filter" = '*'
}
$Servers = Get-ADComputer @Params
In diesem Punkt, wir hätten einfach die name-Eigenschaft filtern können, um die zu vervollständigen $servers
Variable, aber es ist oft sehr nützlich, das gesamte Objekt zur späteren Verwendung zurückzugeben.
Bestimmung der zu erhebenden Daten
Jetzt haben wir unsere Server, wir müssen herausfinden, was genau wir von jedem Server sammeln sollen. Ein Grund, warum es wichtig sein kann, das gesamte AD-Objekt beizubehalten, besteht darin, diese Daten mit den Daten direkt vom Server zu kombinieren, um ein größeres Bild Ihrer Umgebung zu erhalten.
In der Praxis, Wie sieht sowas aus? Wir werden einige der Eigenschaften auflisten, deren Kenntnis sehr nützlich wäre.
Server Einstellungen
- Server-Hostname
- Freier Speicherplatz
- Speicher
- Netzwerkverbindungen
Die Werte von AD
- Letzte Passworteinstellung
- Letzte Anmeldung
- DNS-Hostname
Informationen vom Server abrufen
Wie sammeln wir diese Informationen in unserer Liste der zurückgegebenen Server?? Da wir eine Liste von Servern haben, wir müssen es durcharbeiten $Servers
Objekt und Abfrage. Beginnend mit einem einfachen Foreach-Object
Schleife unten, Wir können ein benutzerdefiniertes Objekt erstellen, um unsere Werte beizubehalten.
$Servers | Foreach-Object {
[PSCustomObject]@{
"ServerHostName" = $_.Name
"Description" = $_.Description
"FreeDiskSpace" = $Null
"TotalMemory" = $Null
"NetworkConnections" = $Null
"PasswordLastSet" = $_.pwdLastSet
"LastLogon" = $_.lastLogon
"DNSHostName" = $_.DNSHostName
"CreationDate" = $_.WhenCreated
}
}
Wie du siehst, beim Speichern des gesamten Active Directory-Objekts bei der ersten Wiederherstellung von Computern, ermöglicht es uns, eine breite Palette von Informationen zu vervollständigen. bedauerlicherweise, Das sind nicht alle Informationen, die wir brauchen.
Um die Informationen jedes Servers zu erhalten, wir werden eine Schnittstelle verwenden, die vielen Serveradministratoren vertraut ist, Was ist die Windows Administration Instrumentation-Schnittstelle? (WMI). Sie können sehen, dass die unten verwendeten Cmdlets von der Common Information Model-Schnittstelle stammen (CIM), davon ist WMI die Microsoft-Implementierung dieses Standards.
Holen Sie sich freien Speicherplatz
Verwenden der WMI-Klasse verfügbar von Win32_LogicalDisk
, wir können alle verfügbaren Festplatten und ihren freien Speicherplatz erhalten. Wenn wir den Befehl zum ersten Mal ausführen, Get-CimInstance -ClassName Win32_LogicalDisk
, Sie werden vielleicht feststellen, dass es in seiner Standardausgabe nicht genau lesbar ist.
Das zweite Problem hier ist, dass wir mehr als eine Einheit zurückgegeben haben. Ich würde gerne mehr über jedes dieser Laufwerke wissen und wissen, wie viel freier Speicherplatz in GB zur Verfügung steht. Lassen Sie uns den Code ändern, um einige Transformationen durchzuführen und ihn zu verbessern.
$Disks = Get-CimInstance -ClassName Win32_LogicalDisk
$DisksResult = $Disks | Foreach-Object {
[PSCustomObject]@{
"Drive" = $_.DeviceID
"FreeSpace" = [Math]::Round(($_.FreeSpace / 1GB),2)
}
}
$DisksResult
Nach dem Ausführen der Befehle, unsere Ausgabe ist viel sauberer und kann jetzt in unserem Skript verwendet werden.
Aber, Was wäre, wenn wir über einen geringen Speicherplatz warnen möchten?? Es wäre schön, dies ein wenig zu erweitern, um in jeder Einheit ein Flag zu bestimmen, das diese Bedingung erfüllt. Vergleich des freien Speicherplatzes mit dem gesamten verfügbaren Speicherplatz, Wir können sehen, ob es unter dem ist 10% Ö 10 GB. Der Grund für die -or
Voraussetzung ist, dass auf sehr großen Discs, das 10% kann immer noch sehr großzügig sein, eine absolute Grenze zu bestimmen hilft also.
$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
Wie ihr jetzt sehen könnt, Wir haben eine große Anzahl von Informationen, die auf unseren Servern gespeichert werden müssen.

Verfügbaren Speicher abrufen
Es ist nützlich zu wissen, wie viel RAM jedem Server zugewiesen ist, insbesondere in einer virtuellen Maschinenumgebung. Wenn Sie feststellen, dass einige überproportioniert sind, Sie können wertvolle Ressourcen sparen, indem Sie die richtige Größe der Server anpassen. Glücklicherweise, das ist viel einfacher zu erholen.
Verwendung der Win32_PhysicalMemory
WMI-Klasse, wir können alle zurückgegebenen hinzufügen Capacity
Eigenschaften, um den Gesamtspeicher zu erhalten.
(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB
Holen Sie sich alle Netzwerkverbindungen
Abschließend, wir wollen alle Netzwerkverbindungen gemeinsam wiederherstellen. Dies ist nützlich, um zu wissen, ob ein bestimmter Server mehrere Schnittstellen hat, um die Sie sich kümmern müssen. Diesmal mit einem etwas anderen Mechanismus, wir benutzen die Get-NetAdapter
Cmdlet, aber da dieser keine hat ComputerName
, Wir werden PS Remoting verwenden, um es lokal auf dem Zielserver aufzurufen und die Ergebnisse an unser Skript zurückzugeben.
$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock Select-Object Name, Status, LinkSpeed
Unsere Ausgabe sieht ähnlich aus wie unten und dann können wir dies in unserem Skript speichern.
Bitte beachten Sie, dass für Invoke-Command
Damit es funktioniert, es ist notwendig, PS Remoting auf den Zielservern zu konfigurieren.
Alles zusammenfügen
Jetzt haben wir alle Teile, lass uns das alles zusammenstellen. Das letzte Skript ist unten und kombiniert den gesamten Code, um ein benutzerdefiniertes Ausgabeobjekt mit dem zu erstellen, was wir melden möchten.
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
}
Fazit
Was wir hier gezeigt haben, ist nur die Spitze des Eisbergs in Bezug darauf, was für einen Inventarbericht gebaut werden kann.. Es gibt viele weitere nützliche Eigenschaften, die Sie diesem Bericht hinzufügen können. Das weiterführen, Sie können es in eine HTML-Seite einbauen, Planen Sie eine wöchentliche Ausführung einer Aufgabe oder integrieren Sie sie in andere Tools wie Ansible.
PowerShell macht es ganz einfach, alle benötigten Informationen an einem Ort zu sammeln. Sobald Sie Ihre Umgebung analysiert und festgestellt haben, was Sie wissen müssen, Erstellen Sie den Bericht in PowerShell, um Ihre Fähigkeit für die zukünftige Prüfung Ihrer Umgebung vorzubereiten.