Windows Server 2025 / Server- und Laufwerksinventar als CSV exportieren
Berichte mit durch Kommas getrennten Werten (CSV) erleichtern den Vergleich von Serverprüfungen, wenn ihre Spalten gleich aufgebaut sind. Fragen Sie Betriebssystem, Arbeitsspeicher und Laufwerke mit PowerShell ab und ergänzen Sie Computername und Erfassungszeit, damit sich jedes Ergebnis zuordnen lässt.
Wählen Sie Felder und einen geschützten Ausgabespeicherort
Führen Sie dieses Beispiel mit Windows PowerShell 5.1 lokal auf dem Server aus, dessen Inventar Sie erfassen möchten. Lernen Sie zunächst die Datenerfassung und Dateiausgabe getrennt von der Remoteauthentifizierung. Einheitliche Spaltennamen erleichtern später das Zusammenführen mehrerer Serverberichte.
| Datei | Inhalte |
|---|---|
| server.csv | Computername, Erfassungszeit, Betriebssystem, Version, letzter Start und Arbeitsspeicher |
| disks.csv | Computername, Erfassungszeit, Laufwerk, Kapazität, freier Speicherplatz und freier Anteil |
Jeder Durchlauf erstellt unter C:\LabReports einen neuen Ordner mit Zeitstempel und kurzer Kennung. So bleiben frühere Ergebnisse getrennt erhalten. Servernamen und interne Konfigurationen können sensible Betriebsinformationen sein; legen Sie Zugriffsrechte und Aufbewahrungsdauer für die Berichte fest.
Speichern und führen Sie das vollständige Skript aus
Erstellen Sie zuerst C:\LabScripts und speichern Sie das vollständige Skript als C:\LabScripts\Collect-LabInventory.ps1. Prüfen Sie, dass die Datei nicht auf .ps1.txt endet. Verwenden Sie UTF-8; bei Umlauten oder anderen Nicht-ASCII-Zeichen wählen Sie UTF-8 mit Byte Order Mark (BOM), wie in der Dokumentation zur Zeichenkodierung beschrieben. Öffnen Sie Windows PowerShell auf diesem Server mit „Als Administrator ausführen“; verwendet werden nur mitgelieferte Module von Windows PowerShell 5.1. Verhindert eine Richtlinie die Ausführung, erfüllen Sie die genehmigten Ausführungs- und Signaturanforderungen, statt Schutzmaßnahmen zu deaktivieren.
$runLabel = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + ([guid]::NewGuid().ToString('N').Substring(0,6))
$reportDirectory = Join-Path 'C:\LabReports' $runLabel
New-Item -ItemType Directory -Path $reportDirectory -Force -ErrorAction Stop | Out-Null
$os = Get-CimInstance Win32_OperatingSystem -ErrorAction Stop
$computer = Get-CimInstance Win32_ComputerSystem -ErrorAction Stop
$collectedAt = (Get-Date).ToString('o')
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
CollectedAt = $collectedAt
OS = $os.Caption
Version = $os.Version
LastBoot = $os.LastBootUpTime
MemoryGiB = [math]::Round($computer.TotalPhysicalMemory / 1GB,2)
} | Export-Csv -LiteralPath (Join-Path $reportDirectory 'server.csv') -NoTypeInformation -Encoding UTF8
Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction Stop | ForEach-Object {
[pscustomobject]@{
ComputerName = $env:COMPUTERNAME
CollectedAt = $collectedAt
Drive = $_.DeviceID
SizeGiB = [math]::Round($_.Size / 1GB,2)
FreeGiB = [math]::Round($_.FreeSpace / 1GB,2)
FreePercent = if ($_.Size -gt 0) { [math]::Round(100 * $_.FreeSpace / $_.Size,1) } else { $null }
}
} | Export-Csv -LiteralPath (Join-Path $reportDirectory 'disks.csv') -NoTypeInformation -Encoding UTF8
Write-Output $reportDirectory
Set-Location 'C:\LabScripts'
.\Collect-LabInventory.ps1
Das Common Information Model (CIM) ist ein gemeinsames Informationsmodell für die hier abgefragten Verwaltungsklassen. Microsoft erläutert den Ansatz in den Beispielen zur Erfassung von Computerinformationen. Die binäre Konstante 1GB bedeutet 1.073.741.824 Byte: MemoryGiB, SizeGiB und FreeGiB werden in Gibibyte angegeben, FreePercent als Prozentsatz. Das Skript verändert keine Dienste oder Servereinstellungen, erstellt aber den Ausgabeordner und die CSV-Dateien.
Überprüfen Sie beide erzeugten Dateien
Verwenden Sie den tatsächlichen Ordnerpfad, den Ihr Skriptdurchlauf am Ende ausgibt. Geben Sie ihn bei der Abfrage von Read-Host ohne Anführungszeichen ein. Zeitstempel und Kennung ändern sich bei jedem Durchlauf; übernehmen Sie deshalb keinen Beispielordner aus einem früheren Ergebnis:
$reportPath = Read-Host 'Report directory printed by the script'
Import-Csv -LiteralPath (Join-Path $reportPath 'server.csv') | Format-List
Import-Csv -LiteralPath (Join-Path $reportPath 'disks.csv') | Format-Table
Prüfen Sie, dass server.csv eine Zeile für den abgefragten Server und disks.csv die zugehörigen lokalen logischen Laufwerke enthält. ComputerName und CollectedAt müssen in beiden Dateien zusammenpassen; kontrollieren Sie auch die übrigen Spalten. MemoryGiB basiert auf TotalPhysicalMemory von Win32_ComputerSystem, dem vom abgefragten System gemeldeten Wert. Bei einer VM können dynamischer Arbeitsspeicher und die aktuelle Zuweisung Abweichungen von der vorgesehenen VM-Konfiguration erklären. Der Wert ist weder der gesamte physische Arbeitsspeicher des Hosts noch eine garantiert exakte Messung der eingebauten Speichermodule.
Behandeln Sie CSV als Daten
Export-Csv schreibt Objekteigenschaften in Spalten. Format-Table vor dem Export würde stattdessen Formatierungsobjekte weitergeben; trennen Sie deshalb Objekte, Pipelines und Bildschirmausgabe in PowerShell. -NoTypeInformation unterdrückt die Typkopfzeile, und -Encoding UTF8 erzeugt in Windows PowerShell 5.1 UTF-8 mit BOM.
Import-Csv liefert normalerweise Zeichenfolgen, auch bei scheinbar numerischen Feldern. Wandeln Sie Werte vor numerischen Vergleichen in Zahlen um. Regionseinstellungen der Tabellenkalkulation können Dezimaltrennzeichen oder die Interpretation von Datumswerten verändern. Bewahren Sie die ursprüngliche CSV-Datei auf und wählen Sie Trennzeichen, Kodierung und Datentypen beim Import bewusst. Der folgende Filter setzt gültige numerische Prozentwerte voraus:
Import-Csv -LiteralPath (Join-Path $reportPath 'disks.csv') |
Where-Object { [double]$_.FreePercent -lt 20 } |
Select-Object ComputerName,Drive,FreePercent
Die Grenze von 20 % ist ein Filterbeispiel, keine allgemeine Alarmrichtlinie. Berücksichtigen Sie auch absoluten freien Speicherplatz, Wachstum und Anforderungen der Arbeitslast. Ist FreePercent leer, weil Size ungültig oder nicht größer als null ist, prüfen Sie diese Zeile vor dem Filtern gesondert. Die Umwandlung einer leeren Zeichenfolge in double kann 0 ergeben; das belegt keinen tatsächlichen freien Speicheranteil von 0 %.
Behandeln Sie Teilausfälle und bewahren Sie nützliche Ergebnisse
Schlägt das Erstellen des Ordners oder eine Abfrage fehl, prüfen Sie Berechtigungen, freien Speicherplatz und die Verfügbarkeit der Klasse. Der am Ende ausgegebene Pfad beweist nicht, dass sämtliche Exporte erfolgreich waren. Beide Dateien müssen vorhanden sein und die erwarteten Spalten sowie Daten enthalten; eine einzige Datei ist kein vollständiges Ergebnis.
Wiederholen Sie die Erfassung, ohne den Server dazwischen neu zu starten. CollectedAt muss sich ändern; LastBoot bleibt bei ausbleibendem Neustart gleich. Identifizieren Sie zum Aufräumen genau den Ordner des betreffenden Durchlaufs. Löschen Sie nicht den gesamten LabReports-Verzeichnisbaum oder andere Prüfaufzeichnungen.




