So erstellen Sie mit PowerShell kostenlos einen Windows Server-Inventarbericht

Inhalt

Powershell-Logo

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.

How% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / Ohne Titel% 202.png? Trimmen = 1,1 & bg-Farbe = 000 & Pad = 1,1

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.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.