Zum Inhalt springen

Hardwareinventarisierung mit Powershell

Im Zuge der heurigen Inventarisierung habe ich nach einer Möglichkeit gesucht, einen Teil des Prozesses ohne Zusatzsoftware automatisieren zu können, und die Hardware der Mehrheit der Clients automatisch auszulesen und in einer CSV-Datei zu sammeln, die ich später in Excel weiterverarbeiten kann.

Bei meiner Ideensuche bin ich im Internet auf ein Skript gestoßen, das ich verändert bzw. erweitert habe.

Um nicht die Hardware jedes Clients einzeln auslesen zu müssen, habe ich mich für eine geskriptete Mischung aus Wake-on-LAN und WMI-Abfrage entschieden. Das untenstehende Powershell Skript liest NetBios-Namen und MAC-Adressen aus einer CSV-Datei ein und startet die Rechner der Reihe nach. Anschließend werden per Remote WMI die gewünschten Werte ausgelesen und in einer CSV-Datei gespeichert.

Wenn gewünscht, ließe sich der Prozess deutlich beschleunigen, indem die Clients nicht sequentiell abgearbeitet werden, sondern parallel, z.B. mit Hilfe eines Workflows. Bitte beachten Sie, dass ein Nutzer zur erfolgreichen Verwendung des Powershell Commandlets Get-WMIObject entsprechende Rechte auf dem abgefragten Client haben muss.

<#

Remote-Inventory WMI-Abfrage

#>

### Gesamtliste der Clients mittels CSV-Datei laden, bei Timeout weitergehen

Write-Host "Lese CSV-Datei mit NetBios-Namen und MAC-Adressen ein."
$csv = Import-Csv "P:\fad\zur.csv"

$exportLocation = "P:\fad\zum\Inventarverzeichnis.csv"

### Per WOL-Funktion einzeln booten und per WMI relevante Hardware auslesen und als CSV-Datei speichern

# Hersteller
# Motherboard
# Festplattengröße
# Prozessor
# RAM

foreach ($line in $csv) {

# Test, ob der Rechner erreichbar ist und gegebenenfalls neustarten.
Write-Host "Überprüfe ob der Client $($line.NetBios) erreichbar ist."

# WOL-Paket schicken

Write-Host "Schicke Magic Paket an $($line.NetBios)."

    $MacByteArray = $($line.MAC) -split "[:-]" | ForEach-Object { [Byte] "0x$_"}
    [Byte[]] $MagicPacket = (,0xFF * 6) + ($MacByteArray  * 16)
    $UdpClient = New-Object System.Net.Sockets.UdpClient
    $UdpClient.Connect(([System.Net.IPAddress]::Broadcast),7)
    $UdpClient.Send($MagicPacket,$MagicPacket.Length)
    $UdpClient.Close()

# Auf erfolgreichen Ping warten

$timer = [Diagnostics.Stopwatch]::StartNew()

# Loopen, bis der PC erreichbar ist.

Write-Host "Warte auf Rechner $($line.NetBios)."

while (-not (Test-Connection -ComputerName $($line.NetBios) -Quiet -Count 1))
{  
    if ($timer.Elapsed.TotalSeconds -ge 300)
    {
       break -and Write-Host "Host $($line.NetBios) ist nicht erreichbar." -ForegroundColor Red
    }
        Start-Sleep -Seconds 15
}

# Timer nach den Beenden stoppen.

$timer.Stop()
$timer.Reset()

if ((Test-Connection -ComputerName $($line.NetBios) -quiet) -eq 'Success') {

Write-Host "Client $($line.NetBios) ist erreichbar, Inventarisierung wird gestartet."

# Auslesen

$NetBiosName = (Get-WmiObject win32_Computersystem -Computername $($line.NetBios)).Name
$Hersteller = (Get-WmiObject win32_Baseboard -Computername $($line.NetBios)).Manufacturer
$Motherboard = (Get-WmiObject win32_Baseboard -Computername $($line.NetBios)).Product
$Prozessor = (Get-WmiObject Win32_Processor  -Computername $($line.NetBios)).Name
$RAM = (get-wmiobject Win32_physicalmemory -ComputerName $($line.NetBios)).Capacity[0] / 1GB
$Festplattengroesse = (Get-WmiObject Win32_Volume -Computername $($line.NetBios)).Capacity[0] / 1GB 
$MacAdresse = (Get-wmiobject Win32_NetworkAdapterConfiguration -ComputerName $($line.NetBios) | Where-Object {$_.IPEnabled}).MacAddress   

$OutputObj  = New-Object -Type PSObject
$OutputObj | Add-Member -MemberType NoteProperty -Name NetBios -Value $NetBiosName
$OutputObj | Add-Member -MemberType NoteProperty -Name Hersteller -Value $Hersteller
$OutputObj | Add-Member -MemberType NoteProperty -Name Motherboard -Value $Motherboard
$OutputObj | Add-Member -MemberType NoteProperty -Name Prozessor -Value $Prozessor
$OutputObj | Add-Member -MemberType NoteProperty -Name RAM -Value $RAM
$OutputObj | Add-Member -MemberType NoteProperty -Name Festplattengroesse -Value $Festplattengroesse
$OutputObj | Add-Member -MemberType NoteProperty -Name MacAdresse -Value $MacAdresse

# In CSV-Datei speichern

$OutputObj | Export-Csv $exportLocation -Append -NoTypeInformation
}

# Rechner herunterfahren.

Write-Host Fahre $($line.NetBios) herunter.
stop-computer -ComputerName $($line.NetBios) -force

}

### Skript beenden

Exit

Damit die Clients durch ein WOL Paket „geweckt“ werden können, müssen die MAC-Adressen in der CSV-Datei entsprechend formatiert sein, wobei die Kopfzeile mit den Spaltennamen NetBios und MAC nicht weggelassen werden darf.

NetBios,MAC
PC-XY,60:2C:35:98:1A:D5

Anmerkungen sind herzlich willkommen und das Skript darf gerne – auf eigene Verantwortung – verwendet und kopiert werden!

Mit freundlichen Grüßen,

Martin Stolzlechner

 

 

Sei der Erste der einen Kommentar abgibt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

siebzehn − vier =