Hey, Scripting Guy!Antwort auf Ihre Fragen zur Organisationseinheit...für nur 5 Cent

Die Scripting Guys von Microsoft

Laden Sie den Code für diesen Artikel herunter: HeyScriptingGuy2007_03.exe (151KB)

F: Wie kann ich ein Dialogfeld anzeigen lassen, das mir ermöglicht, eine Organisationseinheit aus Active Directory auszuwählen?

SIE WISSEN JA, wenn wir Scripting Guys jedes Mal, wenn uns diese Frage gestellt wird, fünf Cent bekämen, hätten wir -- na, gut, es liefe eigentlich doch nur auf €37,20 hinaus, nicht wahr? Ok, aber wenn wir fünf Cent für jeden Benutzer bekommen hätten, der uns diese Frage stellen wollte, es aber nur nie tatsächlich geschafft hat, dann hätten wir -- na gut, der Betrag spielt keine Rolle. Schließlich sind wir nicht wegen des Geldes Scripting Guys geworden. Wir sind Scripting Guys geworden, weil es eine befriedigende Aufgabe ist, Benutzern zu helfen, ihre Systemverwaltungsaufgaben schneller und leichter durchzuführen.

Anmerkung. O.k., damit sind wir, technisch gesehen, doch wegen des Geldes Scripting Guys geworden. Aber dann hat unser Manager zu uns gesagt: „Ihr wisst ja, ihr könnt erfolgreich sein und viel Geld machen, aber nur, wenn ihr bereit seid, wirklich hart zu arbeiten und nur qualitativ Hochwertiges zu produzieren“. Da war es für uns klar, dass Geld nicht alles ist.

Was soll's. Der Punkt ist doch: Viele Leute möchten wissen, wie ein Dialogfeld angezeigt wird, das ihnen ermöglichen würde, eine Organisationseinheit auszuwählen, und dann, durch Erweiterung, eine Verbindung zu dieser Organisationseinheit herzustellen, indem sie ein Skript verwenden. „Sie haben uns gezeigt, wie ein Dialogfeld angezeigt wird, das uns Ordner auswählen lässt“, stand neulich in einer E-Mail, „und Sie haben uns gezeigt, wie ein Dialogfeld angezeigt wird, das uns Dateien auswählen lässt. Warum haben Sie bisher nie gezeigt, wie ein Dialogfeld angezeigt wird, das uns eine Organisationseinheit von Active Directory® auswählen lässt?“

Zunächst einmal, ja, wir haben wirklich gezeigt, wie ein Dialogfeld angezeigt wird, das Benutzern ermöglicht, einen Ordner auszuwählen, und Sie finden ein Beispiel dafür genau hier. Wir haben auch allen gezeigt, wie ein Dialogfeld angezeigt wird, das es ermöglicht, Dateien auszuwählen; prüfen Sie es hier nach microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx, wenn Sie uns nicht glauben. Beide Artikel wurden gut aufgenommen, und wir wissen, dass Benutzer die Verfahren in ihren Skripts anwenden. Warum haben wir den Leuten dann also nicht gezeigt, wie ein Dialogfeld anzuzeigen ist, das ihnen ermöglicht, Organisationseinheiten vom Active Directory auszuwählen? Ist dies eine Art Microsoft-Verschwörung, oder was?

Selbstverständlich nicht. (Aber, Moment mal: Das ist doch genau das, was jemand sagen würde, der in eine Verschwörung verwickelt ist, oder?) Die Wahrheit ist, dass wir Ihnen tatsächlich aus gutem Grund nicht gezeigt haben, wie ein Dialogfeld anzuzeigen ist, das Ihnen ermöglicht, Organisationseinheiten vom Active Directory auszuwählen: Ein solches Dialogfeld existiert nicht. Wie es beim Baseball heißt, man kann nicht treffen, was man nicht sehen kann. Und wie wir beim Scripting sagen, man kann nicht anzeigen, was nicht existiert.

Also, denken wir, war es das dann wohl für diesen Monatsartikel. Dann bis zum nächsten Mal.

Zu früh gefreut! Nach den Herausgebern von TechNet Magazin war es das noch nicht für diesen Monat. „Wenn ein solches Dialogfeld nicht existiert, na und?“ haben sie gesagt. „Ihr seid schließlich die Scripting Guys, um Petes willen. Könnt Ihr nicht einfach ein Dialogfeld erstellen, um das in Ordnung zu bringen? Wir haben gedacht, Ihr Kerle könntet alles zustande bringen, wenn es um Scripting geht“.

Selbstverständlich sind die Herausgeber von TechNet Magazin völlig falsch informiert worden. Alles zustande bringen, wenn es um Scripting geht? Nicht so ganz. In Wirklichkeit können wir Scripting Guys eigentlich nur eine Sache, wenn es um Scripting geht.

Allerdings ist glücklicherweise gerade diese eine Sache das Erstellen eines Dialogfelds, das Ihnen ermöglicht, eine Organisationseinheit vom Active Directory auszuwählen. Sehen Sie sich Abbildung 1 an.

Ja, dies ist ein ganz schön langes Skript, nicht wahr? Aber wie man so sagt: Es lässt sich kein Omelett machen, ohne ein paar Eier aufzuschlagen. Ebenso wenig lässt sich ein benutzerdefiniertes Dialogfeld erstellen, ohne auch ein paar Eier aufzuschlagen, (wir sind auf halber Strecke durch diesen Artikel hungrig geworden, und mussten für einen Imbiss unterbrechen). Jetzt, nachdem der Hunger gestillt ist, wollen wir sehen, ob wir erklären können, wie das Ganze funktioniert.

Was wir mit dem Skript machen, ist Folgendes: Wir verwenden das Internet Explorer®-Objektmodell, um ein Pseudo-Dialogfeld zu erstellen. Wir erstellen eine Instanz von Internet Explorer, nehmen eine Sammlung von Organisationseinheiten aus dem Active Directory, und zeigen dann die Organisationseinheiten in einem Listenfeld in einem Internet Explorer-Fenster an. Wir warten, bis der Benutzer eine Organisationseinheit auswählt, nehmen dann den ADsPath des ausgewählten Elements, heben das „Dialogfeld“ auf, und gehen dann von dort aus weiter.

Anmerkung. Wird das nicht der raffinierteste und hübscheste Dialog, der je erstellt wurde? Ja, wenn Sie unter „raffiniertest und hübschest“ eine aufs Äußerste reduzierte Angelegenheit verstehen, die nicht einmal eine Schaltfläche für OK oder Abbrechen hat. Aber zu unserer Verteidigung sei gesagt: Die Idee ist hier einfach, Ihnen das grundlegende Gerüst zu geben. Wenn Sie das Dialogfeld verschönern oder ändern wollen, sind Sie auf sich selbst gestellt.

(Junge, Junge, wenn wir für jedes Mal, wenn wir sagen „Tut uns leid, Sie sind auf sich selbst gestellt“, 5 Cent bekämen, dann wären wir wirklich reich. Spenden sind erbeten an Scripting Guys c/o TechNet Magazin.)

Um die Erklärung unseres Verfahrens in den uns zugeteilten Artikelumfang einzupassen, werden wir ein paar Dinge nur streifen können. Z. B. alles, was wir über den folgenden Codeblock sagen, ist, dass er eine Instanz von Internet Explorer erstellt, die 350 Pixel mal 400 Pixel umfasst, und dabei solche Dinge wie die Adressleiste und die Statusleiste ausblendet:

Set objExplorer = CreateObject( _
    "InternetExplorer.Application")

objExplorer.Navigate "about:blank"   
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width= 350
objExplorer.Height = 400 
objExplorer.Left = 400
objExplorer.Top = 400
objExplorer.Visible = 1             

Selbstverständlich kommt dabei nur ein leeres Internet Explorer-Fenster heraus. Um die Liste von Organisationseinheiten in unserer Domäne abzurufen, muss das Active Directory durchsucht werden. Wir können die Einzelheiten der Durchsuchung des Active Directory heute nicht erklären; werfen Sie für weitere Informationen einen Blick in unsere zweiteilige Serie im Script Center (microsoft.com/technet/scriptcenter/resources/tales/sg0405.mspx). Wir können Ihnen nur sagen, dass dies der Code ist, den wir verwenden, um den Namen und den ADsPath für jede Organisationseinheit in der Domäne fabrikam.com abzurufen:

objCommand.CommandText = _
    "SELECT Name, ADsPath FROM 'LDAP://DC=fabrikam,DC=com' WHERE objectCategory=
    'organizationalUnit' ORDER BY Name"

Ach ja, und um Ihnen die Sache zu erleichtern, haben wir für Sie die Organisationseinheiten auch alphabetisch nach Namen sortiert. Dafür ist die Klausel SORTIEREN NACH Namen da: (Keine Ursache; schließlich sind wir nur zu Ihren Diensten da).

Beim Aufrufen der Execute-Methode erhalten wir eine Satzgruppe, die aus allen Organisationseinheiten besteht, die in fabrikam.com gefunden wurden. Das bedeutet, dass der nächste Schritt darin besteht, jede der Organisationseinheiten in einem Listenfeld anzuzeigen.

Wie wird das also gemacht? Nun, zuerst muss das ganze Listenfeld im Speicher erstellt werden. Das bedeutet für den Anfang das Verwenden dieser Codezeile, um das Tag <AUSWÄHLEN> in einer Variablen mit dem Namen strHTML zu speichern.

strHTML = "<select size = '20' name='OUList' style='width:300px'>"

Was wird mit dieser Codezeile gemacht? Nun, es wird einfach ein Standard-HTML-Listenfeld erstellt (etwas, das Sie mithilfe des Tag <AUSWÄHLEN> machen). Dabei erhält das Listenfeld den Namen OUList und wird konfiguriert, 20 Elemente auf einmal anzuzeigen und 300 Pixel (300px) breit zu sein. Wenn Sie sich etwas in HTML auskennen, dürfte der vorherige Code recht vertraut aussehen.

Als Nächstes müssen dem Listenfeld einige Elemente hinzugefügt werden (das heißt, einige Organisationseinheiten). Durch einen erstaunlichen Zufall besteht unsere Satzgruppe aus Informationen zu jeder der Organisationseinheiten in unserer Domäne. Deswegen können wir eine Do Until-Schleife einrichten, welche die ganze Satzgruppe durchläuft, die Informationen aufnimmt, und dann dem Listenfeld jede Organisationseinheit hinzufügt. Innerhalb dieser Schleife wird der folgende Code verwendet (wieder Standard-HTML, um einem Listenfeld Elemente hinzuzufügen), um jede Organisationseinheit hinzuzufügen. Dabei wird das Element so konfiguriert, dass der Name der Organisationseinheit in der Liste angezeigt wird, und, wenn Sie auf diese Organisationseinheit im Listenfeld klicken, der ADsPath dem Skript übergeben wird:

strHTML = strHTML & "<option value= " & _
    Chr(34) & objRecordSet.Fields
    ("AdsPath").Value & Chr(34)
strHTML = strHTML & ">" & objRecordSet.
    Fields("Name").Value

Warum soll der ADsPath dem Skript übergeben werden? Die Antwort ist ganz einfach: Angenommen, der Name der Organisationseinheit wäre stattdessen übergeben worden. Wenn der Name, sagen wir, „Finanz“ ist, wird es schwierig, ihn an diese Organisationseinheit zu binden; schließlich ist „Finanz“ allein keine gültige ADSI-Bindungszeichenfolge. Wenn wir jedoch wieder den ADsPath aufrufen (LDAP://ou=Finance,dc=fabrikam,dc=com), dann ist Bindung ein Klacks. Das kommt daher, dass der ADsPath genau das ist, was benötigt wird, um eine Verbindung zu einem Objekt in Active Directory zu ermitteln und herzustellen.

Übrigens wird der Name im Listenfeld angezeigt, weil wir annehmen, dass Ihre Organisationseinheiten einmalige Namen haben. Das könnte auch anders sein; z. B., die Organisationseinheiten Nordamerika\Forschung und Europa\Forschung haben den gleichen Namen (Forschung). Wenn Ihre Organisationseinheiten doppelte Namen haben, könnten Sie stattdessen vielleicht eine andere Eigenschaft, etwa ADsPath oder distinguishedName, im Listenfeld verwenden wollen. Das müssen Sie alleine entscheiden. (Klingeling! Schon wieder ein Fünf-Cent-Stück!)

Übrigens, beachten Sie, dass wir das Listenfeld immer noch im Speicher erstellen: Jedes dem Feld hinzugefügte Element wird der Variablen strHTML hinzugefügt. Das ist alles Teil des Plans: Wir speichern den ganzen Code für das Listenfeld in der Variablen strHTML, verwenden dann den Wert dieser Variablen, um unserer Instanz des Internet Explorer das Listenfeld tatsächlich hinzuzufügen.

Nachdem alle Organisationseinheiten hinzugefügt worden sind, wird diese Codezeile verwendet, um das Ende des Listenfelds zu bezeichnen.

strHTML = strHTML & "</select>"

Jetzt enthält strHTML alle erforderlichen HTML-Tags, um ein Listenfeld zu erstellen, und zwar, was das Beste daran ist, ein Listenfeld, in dem jedes Element eine Organisationseinheit in Active Directory vertritt. Das bedeutet, dass jetzt der Wert von strHTML der Eigenschaft der InnerHTML unseres Internet Explorer-Dokuments zugewiesen werden kann:

objExplorer.Document.Body.InnerHTML = strHTML

Dies wiederum ergibt ein Listenfeld, das alle Organisationseinheiten in einer Domäne anzeigt.

Aber halt, nicht weggehen; wir sind noch nicht ganz fertig. Z. B. brauchen wir noch einen Code, der es ermöglicht, unser Skript anzuhalten, bis der Benutzer eine Organisationseinheit im Dialogfeld ausgewählt hat. Ohne diesen würde das Listenfeld zwar angezeigt werden, aber das Skript würde weiter ausgeführt, ohne Rücksicht darauf, ob der Benutzer eine Auswahl trifft. Au weia! Um dieses Szenario zu verhindern, wird folgender Codeblock verwendet:

Do While objExplorer.Document.Body.All.OUList.Value = ""
    Wscript.Sleep 300
Loop

Was hier geschieht, ist eine wiederholte Überprüfung des Werts unseres Listenfelds (das wir, wie Sie sich vielleicht erinnern, OUList genannt haben, mit dem gleichen Namen, den einer der Scripting Guys seiner Tochter gegeben hat). Wenn der Wert eine leere Zeichenfolge ist (das heißt, dass kein Element ausgewählt worden ist), wird einfach das Skript für 300 Millisekunden angehalten, dann eine Schleife durchlaufen, und die Überprüfung wiederholt. Dies geht weiter: a) ewig; b) bis der Benutzer ein Element im Listenfeld auswählt; oder c) bis der Benutzer das Internet Explorer-Fenster schließt.

Angenommen, der Benutzer wählt eine Organisationseinheit im Listenfeld aus. In diesem Fall nehmen wir den Wert (der, wie Sie sich erinnern, der ADsPath der Organisationseinheit ist) und weisen ihn einer Variablen mit dem Namen strTargetOU zu:

strTargetOU = objExplorer.Document.Body.All.OUList.Value

Wir verwenden dann die Methode zum Beenden, um unsere Instanz des Internet Explorer, wie unten gezeigt, aufzuheben:

objExplorer.Quit

Jetzt sind wir fast fertig. Wir prüfen zuerst, ob strTargetOU gleich einer leeren Zeichenfolge ist:

If strTargetOU = "" Then
    Wscript.Quit
End If

Wenn ja, bedeutet das, dass der Benutzer den Internet Explorer geschlossen hat, ohne eine Organisationseinheit auszuwählen; wir wiederum verwenden die Wscript.Quit-Methode, um das Skript zu beenden. (Wir machen die Annahme: Wenn der Benutzer keine Organisationseinheit gewählt hat, dann ist er oder sie nicht wirklich am Ausführen des Skripts interessiert). Wenn aber strTargetOU nicht gleich einer leeren Zeichenfolge ist, dann geben wir den Wert der Variablen wieder:

Wscript.Echo strTargetOU

Natürlich, in einem wirklichen Skript würden Sie wahrscheinlich weiter gehen, und an diese Organisationseinheit in Active Directory anbinden, statt einfach den ADsPath wiederzugeben. Aber Sie wissen was man so sagt -- oder wenigstens was wir sagen: Dabei sind Sie auf sich gestellt.

Wie wir erwähnt haben, und wie Sie in Abbildung 2 sehen können, ist es nicht das raffinierteste je erstellte Dialogfeld, aber es funktioniert, und es ist viel leichter, als einen ADsPath eintippen zu müssen (vorausgesetzt, dass Sie den ADsPath überhaupt kennen). Außerdem gibt es Ihnen die Chance, den Code und das Dialogfeld anzupassen, sodass sie Ihren Bedürfnissen entsprechen.

Abbildung 2 Ein einfacher Skriptdialog

Abbildung 2** Ein einfacher Skriptdialog **

Ach ja, wenn wir doch nur ein Fünf-Cent-Stück für jeden Artikel bekommen hätten, den wir je über das Anzeigen eines Dialogfelds geschrieben haben, das Ihnen ermöglicht, eine Organisationseinheit vom Active Directory auszuwählen. Immerhin würde das für uns fünf Cent mehr ergeben, als TechNet Magazin uns gewöhnlich bezahlt.

Aber wir wollen uns ja nicht beschweren.

Die Scripting Guys von Microsoft arbeiten für (und sind Angestellte von) Microsoft. Wenn sie nicht gerade ihrem Hobby, dem Baseball (oder verschiedenen anderen Aktivitäten) nachgehen, betreiben sie das TechNet Script Center. Besuchen Sie es unter www.scriptingguys.com.

© 2008 Microsoft Corporation und CMP Media, LLC. Alle Rechte vorbehalten. Die nicht genehmigte teilweise oder vollständige Vervielfältigung ist nicht zulässig.