Tags: Active Directory, PowerShell, Inventarisierung
Das Cmdlet Get-ADComputer kann Computer-Objekte aus dem Directory auslesen. Dabei gibt es eine Fülle von Attributen zurück, die Rückschlüsse auf die Ausstattung und Nutzung der Rechner zulassen. Damit kann man Inventarlisten nach verschiedenen Kriterien anfertigen.
In der einfachsten Form nutzt man Get-ADComputer, um die Namen der Computer im AD zu ermitteln. Dabei kann man den Bereich mit Hilfe des Parameters SearchBase auf bestimmte Gruppen oder OUs einschränken (siehe dazu: Get-ADComputer: Computer in OU oder AD-Gruppe anzeigen mit PowerShell).
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 Betriebssystem 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 Vergleichsausdruck bei Bedarf anpassen muss.
Die im AD abgelegten Daten zum Betriebssystem 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.
Zu beachten ist hierbei, dass Get-ADComputer mit dem Parameter
-Properties *
aufgerufen wird. Andernfalls würde die Abfrage keine Werte für OperatingSystem oder OperatingSystemServicePack 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.
Für diesen Zweck kann man auf das Attribut LastLogonDate zurückgreifen und es mit einem beliebigen Datum in der Vergangenheit 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.
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ückgegebenen 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.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
- Security- und Health-Checks für Active Directory mit PowerShell-Scripts
- Split-brain DNS in Active Directory einrichten
- AD-Konten mit DES- und RC4-Algorithmus für Kerberos-Verschlüsselung finden
- UserAccountControl: Sicherheitseinstellungen für AD-Konten prüfen und ändern
- Gruppen in Azure Active Directory mit PowerShell verwalten
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.
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.