Zielsucher

Seite 4: Active Directory direkt abfragen

Inhaltsverzeichnis

Während die vorangegangenen Beispiele stets eine Liste von Computern erzeugen und diese auswerten, geht der vierte Ansatz eleganter vor. Wenn sowieso geskriptet wird, was liegt dann näher, als Active Directory direkt per Skript abzufragen und die Ergebnisse ohne Umweg zu verarbeiten?

Viele Administratoren scheuen sich vor der unmittelbaren Ansprache des Active Directory, obwohl Microsoft es gerade Skriptentwicklern sehr einfach gemacht hat. Der Windows-Verzeichnisdienst bringt nämlich auch eine Datenbankschnittstelle mit, durch die er genauso genutzt werden kann wie eine "richtige" Datenbank unter Access oder SQL Server. Hierbei setzt er auf die "ActiveX Database Objects" oder kurz "ADO", die dem Entwickler eine einheitliche Arbeitsweise ermöglichen, auch wenn er mit unterschiedlichen Datenbanken zu tun hat.

Anders als relationale Datenbanken versteht Active Directory zwei Abfragesprachen: Neben dem bereits erwähnten LDAP können Sie Suchaufträge auch in SQL formulieren. Beides sind sicher nicht gerade die bevorzugten Umgangssprachen eines Windows-Admins, aber das Nötige haben Sie sich schnell angeeignet. Hier ein Beispielskript:

strSQL = "SELECT name " _
& "FROM 'LDAP://DC=contoso,DC=com' " _
& "WHERE objectClass='computer' "

' ADO-Verbindung herstellen
Set objDom = CreateObject("ADODB.Connection")
objDom.Open "Provider=ADsDSOObject;"

' Suche ausfĂĽhren
Set objRS = objDom.Execute(strSQL)

objRS.MoveFirst
Do Until objRS.EOF
WScript.Echo "WMI-Aufruf an '" & objRS("name") & "'"
objRS.MoveNext
Loop

Das ist schon alles. Der Einfachheit halber beginnt die Analyse dieses Skripts am Ende: Auch hier finden Sie eine WScript.Echo-Zeile, die Sie durch Ihren WMI-Code ersetzen können. Das funktioniert also wie gehabt. Anders als bei den drei ersten Beispielen ist die Schleife hier allerdings nicht mit For Each … Next aufgebaut, und es gibt noch das zusätzliche Kommando objRS.MoveNext. Denn die Computernamen liegen hier nicht in einem Array, sondern in einem Recordset, also einer Datenbanktabelle. Diese wird vorher in drei Schritten erzeugt: Zuerst definiert das Skript ein SQL-Kommando. Dies ist hier einfach gehalten und sucht alle Objekte der Klasse "computer" aus der Domäne "contoso.com". Wer SQL schon einmal genutzt hat, wird das Wesentliche erkennen – die Besonderheit liegt hier darin, dass anstelle einer Datenbanktabelle einfach der LDAP-Name der Domäne angegeben wird.

Der zweite Schritt öffnet eine Datenbankverbindung mit Active Directory, indem die Datenbankschnittstelle ADODB über den Provider "ADsDSOObject" angesprochen wird. Hinter diesem verbirgt sich Active Directory. Der dritte Schritt schickt die SQL-Abfrage an die Datenbank und nimmt das Ergebnis als Recordset entgegen.

Der eleganteste Weg: Über die Datenbankschnittstelle ADO kann Active Directory genutzt werden wie eine richtige Datenbank. Die nötigen SQL-Kommandos lassen sich mit dem freien Tool „Carmen.hta“ bequem aufbauen.

Der große Vorteil dieser Technik besteht gar nicht einmal darin, dass Sie den Umweg über eine Textdatei einsparen. Richtig interessant ist hier, dass Sie mit Hilfe von recht einfachen SQL-Kommandos die Suchanfrage an den Verzeichnisdienst nach Gusto aufbauen und stets aktuell beantworten lassen können.

Mein kleines Werkzeug Carmen hilft Ihnen beim Aufbau von SQL-Anfragen an Active Directory. Alle Computer aus der OU "Workstations/Notebooks", die Windows XP mit Service Pack 2 installiert haben, findet etwa das Statement:

SELECT name FROM 'LDAP://OU=Notebooks, OU=Workstations, DC=contoso,DC=com' WHERE objectClass='computer' and operatingSystem='Windows XP*' and operatingSystemVersion='Service Pack 2'

Experimentieren Sie mit verschiedenen AusdrĂĽcken und ĂĽbertragen Sie den fĂĽr gut befundenen Abfragestring dann in Ihr universelles WMI-Skript. Eine Ăśbersicht ĂĽber die wichtigsten Feldnamen des Active Directory zur Verwendung in Abfragen bietet eine Seite im faq-o-matic.net.