Computer im Active Directory filtern und inventarisieren mit PowerShell

    Active Directory StrukturDas Cmdlet Get-ADComputer kann Computer-Objekte aus dem Directory aus­lesen. Dabei gibt es eine Fülle von Attri­buten zurück, die Rück­schlüsse auf die Aus­stattung und Nutzung der Rechner zulassen. Damit kann man Inventar­listen nach ver­schiedenen Kriterien anfer­tigen.

    In der ein­fachsten Form nutzt man Get-ADComputer, um die Namen der Computer im AD zu ermitteln. Dabei kann man den Bereich mit Hilfe des Para­meters SearchBase auf bestimmte Gruppen oder OUs einschränken (siehe dazu: Get-ADComputer: Computer in OU oder AD-Gruppe an­zeigen mit Power­Shell).

    Informationen zum Betriebssystem auswerten

    Das Active Directory speichert in diversen Attributen zahlreiche Informationen zu den jeweiligen Rechnern, so dass sich für Get-ADComputer mehr Anwendungen anbieten als das Erstellen einer einfachen Liste von Rechnernamen.

    So enthält es ausführliche Angaben zum installierten Betriebs­system und eventuellen Service Packs. Diese Information ließe sich etwa nutzen, um etwa eine Liste aller Server abzurufen:

    Get-ADComputer -Filter "OperatingSystem -like '*Server*'" | select DNSHostName

    Dieser Aufruf gibt die Namen aller Rechner zurück, deren Attribut OperatingSystem die Zeichenkette "Server" enthält. Das können neben Windows Server auch Hyper-V Server sein, so dass man den Vergleichs­ausdruck bei Bedarf anpassen muss.

    Alle Server im Active Directory ermitteln mit Get-ADComputer

    Die im AD abgelegten Daten zum Betriebs­system könnte man etwa auch nutzen, um jene Versionen des OS abzufragen, für die ein Service Pack erschienen ist, und prüfen, ob es installiert wurde:

    Get-ADComputer -Filter "OperatingSystem -like 'Windows 7*' `
    -and OperatingSystemServicePack -notlike '*Pack*'" -Properties *|
    select DNSHostName, OperatingSystem, OperatingSystemServicePack

    Dieses Kommando sollte alle Computer-Objekte zurückgeben, die Windows 7 als OS ausweisen und die kein Service Pack installiert haben.

    Installierte Service Packs von Rechnern mit Windows 7 anzeigen

    Zu beachten ist hierbei, dass Get-ADComputer mit dem Parameter -Properties * aufgerufen wird. Andernfalls würde die Abfrage keine Werte für OperatingSystem oder OperatingSystem­ServicePack zurückgeben.

    Inaktive Konten aufspüren

    Eine weitere Anwendung der von Get-ADComputer gelieferten Daten bestünde darin, solche Rechner zu finden, die sich schon seit längerer Zeit nicht mehr am AD angemeldet haben (siehe dazu: Alte Computer-Konten aus dem Active Directory entfernen). Dabei könnte es sich um ausgemusterte Computer oder um ungenutzte virtuelle Maschinen handeln, die als Objekte noch im Active Directory verblieben sind.

    Über das letzte Anmeldedatum lassen sich inaktive Computer aufspüren

    Für diesen Zweck kann man auf das Attribut LastLogonDate zurückgreifen und es mit einem beliebigen Datum in der Vergangen­heit vergleichen. Dieses speichert man zuerst in einer Variablen ab, in unserem Fall wäre das heute vor 100 Tagen:

    $d = (Get-Date).addDays(-100)

    Anschließend schaut man, bei welchen Computern das letzte Anmeldedatum kleiner ist als dieses Datum:

    Get-ADComputer -Property LastLogonDate -Filter {lastLogonDate -lt $d} |
    select DNSHostName, LastLogonDate

    Im Unterschied zum oberen Befehl ruft dieser über den Parameter Properties gezielt nur das Attribut lastLogonDate ab, weil dieses im Gegensatz zu DNSHostName standardmäßig nicht im Output enthalten ist.

    Zahl der Anmeldungen anzeigen

    Wenn sich ein Computer aber noch nie angemeldet hat, dann taucht er in diesem Ergebnis nicht auf. Das kann etwa durch ein Prestaging passieren, wenn dem Objekt dann nachher kein Rechner zugeordnet wird. In diesem Fall hilft die Abfrage des Attributs LogonCount, das dann der Wert 0 hat:

    Get-ADComputer -Filter "LogonCount -eq '0'" -Property *|
    select name, LogonCount, LastLogonDate

    Interessant ist diese Eigenschaft auch deshalb, weil es zeigt, welche Computer sich besonders selten oder häufig anmelden.

    Computer-Objekte anzeigen, die sich noch nie angemeldet haben.

    Prüfen, ob Computer online sind

    Obwohl das AD einige Informationen über die Computer-Objekte preisgibt, wird man für die Inventarisierung meist mehr Daten brauchen, die man etwa über WMI direkt von den betreffenden Maschinen abrufen muss. Das könnte etwa die Ausstattung der Hardware betreffen oder die genaue Version von Windows 10.

    In diesem Fall muss man jedoch vorher sicherstellen, dass die betreffenden Rechner online sind. Dazu übergibt man die von Get-ADComputer zurück­gegebenen Namen der Computer in einer Schleife an Test-Connection:

    Get-ADComputer -Filter "OperatingSystem -like 'Windows Server*'" -Property *|
    %{ if(Test-Connection -ComputerName $_.DNSHostName -Quiet)
    {MyWMIfunction($_.DNSHostName)}}

    Dieses Beispiel ruft alle Computer ab, deren Attribut OperatingSystem die Zeichenkette "Windows Server" enthält. Test-Connection prüft mit dem Parameter Quiet nur, ob der Zielrechner reagiert und verzichtet auf die üblichen 4 Versuche und eine Fehlermeldung, falls der Host nicht erreichbar ist. Wenn diese Bedingung erfüllt ist, kommt die Beispielfunktion MyWMIfunction zum Zug, um Daten über WMI abzufragen.

    1 Kommentar

    Bild von kortex
    kortex sagt:
    7. Juli 2017 - 21:04

    Seit wann gibt es den -quiet switch für test-connection? Ich mach da seit Jahren mit einer Funktion rum, wenn ich nur $true oder $false zurückbekommen will... verrückt.