Zielsucher
Seite 3: Active Directory auswerten
Active Directory auswerten
Falls Sie eine Windows-Domäne mit Active Directory betreiben, sind Sie nicht auf den hakeligen Computersuchdienst angewiesen. Jeder Mitgliedsrechner einer Domäne hat ein eigenes Anmeldekonto. Daher ist es viel effizienter, die Datenbank des Active Directory auszulesen. Ein universelles Werkzeug, mit dem Sie das in allen Domänen ab Windows 2000 erledigen können, hat der amerikanische Active-Directory-Spezialist Joe Richards mit dem Namen AdFind kostenlos zur Verfügung gestellt. Sie rufen es auf der Kommandozeile auf und hängen einige Parameter an, um Ihre Suchanfrage festzulegen.
Über den Schalter "-b" nimmt AdFind den Startpunkt der Recherche entgegen, also den Container, der durchsucht werden soll. Das kann die gesamte Domäne, aber auch eine untergeordnete Organisationseinheit sein. Der Name ist in LDAP-Notation anzugeben, etwa OU=Benutzer,DC=contoso,DC=com. Der Schalter "-f" gibt den Suchfilter an, der ebenfalls in LDAP-Schreibweise erwartet wird. Da in diesem Fall nur Computerobjekte interessieren, lautet der Filter objectClass=computer. Sie können aber auch weitere Kriterien ergänzen, um die Auswahl einzuschränken. Als Letztes geben Sie nun eine Liste der Attribute an, die Sie interessieren. Für eine Auflistung aller Computernamen reicht das Feld "name" aus. Um das Ergebnis für WMI-Skripte gut verdaulich zu halten, kann es mit dem Kommando "find" auf die relevanten Zeilen eingedampft werden, denn sonst enthält die AdFind-Ausgabe einige unnötige Informationen. Ein vollständiges Kommando, mit dem alle Computerkonten der Domäne "contoso.com" in die Datei "C:\Daten\AdFind_Ausgabe.txt" geschrieben werden, sieht so aus:
AdFind.exe -b dc=contoso,dc=com -f "objectCategory=computer" name | ^
find /I ">name:" >C:\Daten\AdFind_Ausgabe.txt
Die Verarbeitung der Ergebnisliste in einem WMI-Skript funktioniert fast genauso wie im net view-Beispiel. Auch hier wird die Liste zeilenweise durchlaufen, der Computername separiert und in ein Array geschrieben:
Dim arrComputer()
strPfad = "C:\Daten\AdFind_Ausgabe.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDatei = objFSO.OpenTextFile(strPfad)
intZahl = 0
Do Until objDatei.AtEndOfStream
strZeile = objDatei.ReadLine
If Left(strZeile, 6) = ">name:" Then
'wir haben eine Zeile mit Computernamen vor uns
' Zähler erhöhen und Array vergrößern
ReDim Preserve arrComputer(intZahl)
' Computernamen isolieren und ins Array einfĂĽgen
arrComputer(intZahl) = Mid(strZeile, 8)
intZahl = intZahl + 1
End If
Loop
' Array durchlaufen
For Each strComputer In arrComputer
WScript.Echo "WMI-Aufruf an '" & strComputer & "'"
Next
Das Einfügen der eigentlichen WMI-Logik geschieht auch hier wie im ersten Skript: Ersetzen Sie die Zeile mit "WScript.Echo" durch den gewünschten Code. Da AdFind durchaus auch komplexere Abfragen zulässt, haben Sie auf diese Weise ein sehr leistungsfähiges Werkzeug, um gezielt bestimmte Computer anzusprechen.
Domänen-Abfrage mit Bordmitteln
Windows Server 2003 enthält bereits in seinem Lieferumfang ein Tool zur Abfrage des Active Directory. Genau genommen handelt es sich um eine ganze Reihe von Tools, deren Namen alle mit den Buchstaben "ds" beginnen und die daher unter dem Titel "ds-Tools" bekannt sind. Neben dem hier genutzten "dsquery" zum Lesen in der Datenbank und dem verwandten "dsget", das Detailinformationen abfragt, stehen mit "dsadd", "dsmod", "dsmove" und "dsrm" vier Kommandos zur Manipulation der Daten zur Verfügung. Nähere Informationen finden Sie in der Online-Hilfe von Windows Server 2003 unter dem Stichwort "Verzeichnisdienst-Befehlszeilenprogramme".
Im Unterschied zu AdFind erlaubt dsquery keine freie Auswahl der zurückzugebenden Attribute: Sie können nur wählen zwischen dem vollständigen Objektnamen (im LDAP-Jargon "distinguishedName" oder kurz "dn"), dem Kurznamen ohne Containerangabe ("Relative Distinguished Name" oder "rdn") und dem Windows-Computernamen ("samid"). Eine Computerliste erzeugen Sie mit dsquery computer, gefolgt von dem zu durchsuchenden Ordner in LDAP-Schreibweise. Wollen Sie die ganze Domäne durchsuchen, nutzen Sie vereinfachend "domainroot", bei einem kompletten Active-Directory-Forest aus mehreren Domänen "forestroot".
Auch die Filtermöglichkeiten von dsquery sind weniger vielfältig als bei AdFind: Sie können nach Teilen des Namens suchen ("-name" oder "-samid"), die Beschreibung heranziehen ("-desc") oder nach inaktiven Objekten forschen ("-inactive", "-disabled" oder "-stalepwd"). In großen Umgebungen sollten Sie den Schalter "-limit" nicht vergessen, denn ohne ihn gibt dsquery maximal 100 Zeilen zurück. Eine Abfrage von bis zu 500 Computern der ganzen Domäne erzeugt:
dsquery computer -o rdn -limit 500 %gt;C:\Daten\dsquery-liste.txt
Hierbei wird der Kurzname zurückgegeben und in die angegebene Datei gespeichert. Anders als bei den ersten beiden Beispielen enthält die so erzeugte Textdatei ausschließlich die Computernamen in Anführungsstrichen, sodass die Verarbeitung einfacher ausfällt:
strPfad = "C:\Daten\dsquery-liste.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objDatei = objFSO.OpenTextFile(strPfad)
intZahl = 0
Do Until objDatei.AtEndOfStream
strZeile = objDatei.ReadLine
If Left(strZeile, 1) = Chr(34) Then
'wir haben eine Zeile mit Computernamen vor uns
' Zähler erhöhen und Array vergrößern
ReDim Preserve arrComputer(intZahl)
' Computernamen isolieren und ins Array einfĂĽgen
arrComputer(intZahl) = Replace(strZeile, Chr(34), "")
intZahl = intZahl + 1
End If
Loop
' Array durchlaufen
For Each strComputer In arrComputer
WScript.Echo "WMI-Aufruf an '" & strComputer & "'"
Next
Auch hier folgt das Skript-GerĂĽst demselben Aufbau wie in den ersten beiden Beispielen. Sie haben also einen recht universellen Werkzeugsatz vor sich.