Computer im Active Directory filtern und inventarisieren mit PowerShell


    Tags: , ,

    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 Beispiel­funktion MyWMIfunction zum Zug, um Daten über WMI abzufragen.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links

    4 Kommentare

    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.

    Ich glaube in der folgenden Query ist ein Fehler:
    Get-ADComputer -Filter "OperatingSystem -like 'Windows 7*' `
    -and OperatingSystemServicePack -notlike '*Pack*'" -Properties *|
    select DNSHostName, OperatingSystem, OperatingSystemServicePack

    Laut Definition sollten die Systeme ohne ServicePack ausgegeben werden.
    Die Liste zeigt aber Systeme mit ServicePack.

    Ich bin auf der Suche nach Filtern auf dieses Beispiel gestoßen, weil ich das gleiche Problem habe.

    Bild von Wolfgang Sommergut

    Hallo Markus, ich habe die Abfrage nochmal geprüft, bei mir funktioniert sie einwandfrei. Eine Möglichkeit wäre, das Kommando ohne den Vergleich mit '*Pack*' abzusetzen. Dann sieht man ja, welchen Wert die Eigenschaft OperatingSystemServicePack tatsächlich hat:

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

    For LogonCount:

    MS Docs: This attribute is not replicated and is maintained on each domain controller in the domain. To get an accurate value for the user's total number of successful logon attempts in the domain, each domain controller in the domain must be queried and the sum of the values should be used. Keep in mind that the attribute is not replicated, therefore domain controllers that are retired may have counted logons for the user as well, and these will be missing from the count.