Abschlussprojekt: Server-Inventar
Schreibe ein Skript C:\Kurs\Skripte\Get-ServerInventar.ps1, das für eine Liste von Rechnern ein Inventar erstellt.
Anforderungen
- Parameter
-ComputerName(mehrere Rechner, Standard:PSLAB-01,PSLAB-02,PSLAB-03) und-Pfadfür die CSV-Ausgabe (StandardC:\Kurs\Ausgabe\Inventar.csv). - Pro Rechner ein Objekt mit:
Computer,Betriebssystem,LetzterStart,FreiGB(Laufwerk C:),Spooler(Status des DienstesSpooler). - Erreichbarkeit zuerst mit
Test-WSManprüfen. Rechner, bei denen etwas schiefgeht, erscheinen mitComputerund einerFehler-Spalte, das Skript läuft aber weiter. Teste das mit einem nicht existierenden Namen und mitDC01: Dort hast du als Kursteilnehmer keine Administratorrechte, die CIM-Abfrage schlägt also fehl. - Fehler werden mit
try/catchabgefangen und mitWrite-Warninggemeldet. - Am Ende: CSV schreiben, Anzahl der erfolgreichen und fehlgeschlagenen Rechner ausgeben.
- Das Skript schreibt ein Transcript nach
C:\Kurs\Logs.
Bonus
- Lege mit
Register-ScheduledTaskeine Aufgabe an, die das Skript täglich um 07:00 startet. - Füge Kommentarkopf mit
.SYNOPSIS,.PARAMETERund.EXAMPLEhinzu.
Hinweis: Du darfst jede Hilfe nutzen, die du auch im Alltag hättest: Get-Help, die Kursseiten, Kollegen.
Musterlösung anzeigen
<#.SYNOPSIS Erstellt ein Inventar für eine Liste von Rechnern..PARAMETER ComputerName Zielrechner..PARAMETER Pfad CSV-Ausgabedatei..EXAMPLE .\Get-ServerInventar.ps1 -ComputerName PSLAB-02, DC01, GIBTSNICHT#>param( [string[]]$ComputerName = @('PSLAB-01', 'PSLAB-02', 'PSLAB-03'), [string]$Pfad = 'C:\Kurs\Ausgabe\Inventar.csv')
Start-Transcript -Path "C:\Kurs\Logs\Inventar-$(Get-Date -Format 'yyyyMMdd-HHmmss').log" | Out-Null
$ergebnis = foreach ($rechner in $ComputerName) { try { Test-WSMan -ComputerName $rechner -ErrorAction Stop | Out-Null
$os = Get-CimInstance Win32_OperatingSystem -ComputerName $rechner -ErrorAction Stop $disk = Get-CimInstance Win32_LogicalDisk -ComputerName $rechner -Filter "DeviceID = 'C:'" -ErrorAction Stop $svc = Invoke-Command -ComputerName $rechner -ErrorAction Stop ` -ScriptBlock { (Get-Service -Name Spooler -ErrorAction SilentlyContinue).Status }
[PSCustomObject]@{ Computer = $rechner Betriebssystem = $os.Caption LetzterStart = $os.LastBootUpTime FreiGB = [math]::Round($disk.FreeSpace / 1GB, 1) Spooler = "$svc" Fehler = '' } } catch { Write-Warning "$rechner : $($_.Exception.Message)" [PSCustomObject]@{ Computer = $rechner Betriebssystem = '' LetzterStart = '' FreiGB = '' Spooler = '' Fehler = $_.Exception.Message } }}
$ergebnis | Export-Csv -Path $Pfad$fehler = @($ergebnis | Where-Object Fehler -ne '').CountWrite-Output "Fertig: $(@($ergebnis).Count - $fehler) erfolgreich, $fehler fehlgeschlagen. Datei: $Pfad"
Stop-Transcript | Out-NullZeitplan (Bonus):
$aktion = New-ScheduledTaskAction -Execute 'C:\Program Files\PowerShell\7\pwsh.exe' ` -Argument '-NoProfile -File "C:\Kurs\Skripte\Get-ServerInventar.ps1"'$trigger = New-ScheduledTaskTrigger -Daily -At 07:00Register-ScheduledTask -TaskName 'Kurs-Inventar' -Action $aktion -Trigger $trigger