Hé, vous le scripteur !Nous répondons à vos questions sur UO...pour 5 centimes seulement

Les scripteurs Microsoft

Télécharger le code de cet article: HeyScriptingGuy2007_03.exe (151KB)

Q Comment faire pour afficher une boîte de dialogue me permettant de sélectionner une UO d’Active Directory ?

VOUS SAVEZ, si les scripteurs recevaient 5 centimes d’euro à chaque fois qu’on leur a posé cette question... euh, ils auraient environ trois euros cinquante. Mais s’ils recevaient 5 centimes pour chaque personne qui voulait poser cette question mais qui ne l’a jamais fait, ils auraient... bref, peu importe. Après tout, on n’est pas devenus scripteurs pour l’argent. Nous sommes devenus scripteurs pour la satisfaction ressentie lorsque nous aidons des gens à exécuter leurs tâches d’administration système plus rapidement et avec une plus grande facilité.

Remarque. Ok, techniquement, on est devenus scripteurs pour l’argent. Mais ensuite notre responsable nous a dit : « Vous savez, si vous voulez vous faire beaucoup d’argent, il va falloir que vous travailliez dur et que vous ne produisiez que de la qualité ». C’est là qu’on s’est dit que l’argent, c’était pas tout finalement.

Bref. En fait, beaucoup de gens aimeraient savoir comment faire pour afficher une boîte de dialogue leur permettant de sélectionner une UO et donc de se connecter à cette UO à l’aide d’un script. « Vous nous avez montré comment faire pour afficher une boîte de dialogue nous permettant de choisir des dossiers », nous a-t-on dit récemment, « et vous nous avez montré comment faire pour afficher une boîte de dialogue nous permettant de choisir des fichiers. Pourquoi ne nous avez-vous jamais montré comment faire pour afficher une boîte de dialogue nous permettant de choisir une UO dans Active Directory® ? »

Pour commencer, oui, c’est vrai, nous avons montré aux gens comment faire pour afficher une boîte de dialogue leur permettant de sélectionner un dossier ; vous en trouverez des exemples ici. Nous avons également montré à tout le monde comment afficher une boîte de dialogue permettant de sélectionner des fichiers ; aller voir microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx si vous ne nous croyez pas. Ceux deux articles ont été bien reçus, et nous savons que les gens emploient ces techniques dans leurs scripts. Alors pourquoi donc n’avons-nous pas montré aux gens comment afficher une boîte de dialogue leur permettant de sélectionner des UO dans Active Directory ? C’est une conspiration de Microsoft ou quoi ?

Absolument pas. (Attendez un peu... c’est exactement ce que dirait quelqu’un impliqué dans une conspiration, non ?) En fait, nous avons une bonne raison : la boîte de dialogue en question n’existe pas. Comme on le dit parfois au base-ball, on ne peut pas tirer sur ce qu’on ne voit pas. Et comme on dit dans le métier, on ne peut pas afficher ce qui n’existe pas.

Donc voilà, c’est tout pour ce mois-ci, on dirait. À la prochaine fois.

Ah, ce serait bien. Selon les éditeurs de Technet Magazine, ce n’est pas tout pour ce mois-ci. « Cette boîte de dialogue n’existe pas, et alors ? » nous ont-il dit. « C’est vous qui écrivez les scripts, bon sang. Vous ne pouvez pas créer cette boîte de dialogue ? On pensait que vous pouviez faire n’importe quoi en matière de scripts. »

Inutile de préciser que les éditeurs de Technet Magazine se font vraiment des illusions. Faire n’importe quoi en matière de scripts ? Euh, pas vraiment. En fait, les scripteurs ne savent faire qu’une chose en matière de scripts.

Coup de chance, la seule chose qu’ils sachent faire, c’est créer une boîte de dialogue vous permettant de sélectionner une UO d’Active Directory. Jetez un coup d’œil à la figure 1.

Long script, hein ? Mais vous savez ce qu’on dit : on ne peut pas faire une omelette sans casser d’œufs. De la même manière, on ne peut pas construire une boîte de dialogue personnalisée sans casser quelques œufs (on a dû faire une pause en cours de rédaction de ce document, on avait faim). Maintenant qu’on est rassasiés, on va essayer de vous expliquer comment ça fonctionne.

En fait, nous utilisons le modèle d’objet Internet Explorer® pour construire une pseudo boîte de dialogue. Nous créons ainsi une instance d’Internet Explorer, récupérons quelques UO d’Active Directory, puis les affichons sous la forme d’une liste dans une fenêtre Internet Explorer. Nous attendons que l’utilisateur sélectionne une UO, puis récupérons l’ADsPath de l’élément sélectionné, éliminons la pseudo boîte de dialogue et continuons à partir de là.

Remarque. Est-ce que ça va être la boîte de dialogue la plus jolie jamais crée ? Oui, si par « la plus jolie » vous voulez dire une boîte ultra simpliste ne comportant même pas de bouton OK ou Annuler. Mais, pour notre défense, l’idée est simplement de vous donner la base. Si vous voulez rendre la boîte de dialogue plus jolie, débrouillez-vous tous seuls.

(Si on avait 5 centimes pour toutes les fois où on a dit « débrouillez-vous tous seuls », on serait vraiment riches. Envoyez vos dons aux Scripteurs c/o Technet Magazine.)

Afin que l’explication de notre technique tienne dans l’espace qui nous a été attribué, nous allons devoir faire quelques raccourcis. Par exemple, nous nous contenterons de dire que le bloc de code suivant crée une instance d’Internet Explorer de 350 pixels par 400, et masque ainsi la barre d’adresse et la barre d’état par exemple ;

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             

en fait, ça nous donne une fenêtre Internet Explorer vierge. Afin d’obtenir la liste d’UO dans notre domaine, il faut réaliser une recherche dans Active Directory. Nous ne pouvons pas rentrer dans les détails concernant les recherches dans Active Directory aujourd’hui ; pour plus d’informations à ce sujet, jetez un coup d’œil à notre série en deux parties dans le Script Center (microsoft.com/technet/scriptcenter/resources/tales/sg0405). Ce que nous pouvons faire, c’est vous dire que le code que nous utilisons pour récupérer le Nom et l’ADsPath de chaque UO dans le domaine fabrikam.com est le suivant :

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

Oh, et pour vous rendre les choses plus faciles, nous avons aussi trié les UO alphabétiquement par nom. C’est à ça que sert la clause ORDER BY Name (Trier par nom). (À votre service).

Lorsque nous appelons la méthode Exécuter, nous récupérons une liste de toutes les UO trouvées sur fabrikam.com. Cela signifie que la prochaine étape consiste à afficher chacune de ces UO dans une zone de liste.

Comment procédons-nous ? Il faut tout d’abord créer la zone de liste entière dans la mémoire. Pour commencer, cela signifie utiliser cette ligne de code pour enregistrer la balise <SELECT> dans une variable nommée strHTML :

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

Que faisons-nous avec cette ligne de code ? Nous construisons tout simplement une zone de liste HTML standard (oui, c’est une chose que l’on fait à l’aide de la balise <SELECT>). En chemin, nous donnons à la zone de liste le nom ListeUO et nous la configurons pour afficher 20 éléments à la fois dans un cadre de 300 pixels (300px) de large. Si vous connaissez un peu l’HTML, le code précédent devrait vous paraître assez familier.

Ensuite, il faut ajouter des éléments (des UO) à la zone de liste. Par une coïncidence incroyable, notre liste est en fait constituée d’informations concernant chacune des UO de notre domaine. Grâce à cela, nous pouvons configurer une boucle Do Until passant en revue la liste entière, récupérant les informations et ajoutant chaque UO à la zone de liste. Dans cette boucle, nous utilisons le code suivant (une nouvelle fois, HTML standard pour ajouter des éléments à une zone de liste) pour ajouter chaque UO, en configurant les éléments de façon à ce que le nom de l’UO soit affiché dans la liste et que, si vous cliquez sur cette UO dans la zone de liste, l’ADsPath soit transmis au script :

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

Pourquoi transmettre l’ADsPath au script ? C’est simple : imaginons que nous transmettions le nom de l’UO à la place. Si le nom est par exemple Finance, il sera difficile d’établir une liaison vers cette UO, étant donné que « Finance » ne constitue pas une chaîne ADSI valide. Mais avec l’ADsPath (LDAP://ou=Finance,dc=fabrikam,dc=com), c’est du gâteau. Parce que l’ADsPath, c’est exactement ce dont nous avons besoin pour localiser un objet dans Active Directory et y établir une connexion.

Incidemment, nous affichons le nom dans la zone de liste parce que nous partons du principe que vos UO ont des noms uniques. Cela pourrait ne pas être le cas ; par exemple, les UO Amérique du nord\Recherche et Europe\Recherche ont le même nom (Recherche). Dans ce cas, il vaudrait sans doute mieux utiliser une propriété différente (ADsPath ou distinguishedName, par exemple) dans la zone de liste. À vous de décider. (Et tac ! Une autre pièce !)

Bon, n’oublions pas que nous sommes toujours en train de construire la zone de liste dans la mémoire : chaque élément ajouté à la zone est ajouté à la variable strHTML. Tout cela fait partie du plan : nous enregistrons le code entier de la zone de liste dans la variable strHTML, puis utilisons la valeur de cette variable pour ajouter la zone de liste à notre instance d’Internet Explorer.

Une fois toutes les UO ajoutées, nous utilisons cette ligne de code pour indiquer la fin de la zone de liste :

strHTML = strHTML & "</select>"

À ce stade, strHTML contient toutes les balises HTML nécessaires pour créer une zone de liste, et (encore mieux) une zone de liste dans laquelle chaque élément représente une UO d’Active Directory. Cela signifie que nous pouvons à présent attribuer la valeur de strHTML à la propriété InnerHTML de notre document Internet Explorer :

objExplorer.Document.Body.InnerHTML = strHTML

En retour, nous obtenons une zone de liste affichant toutes les UO d’un domaine.

Attendez une minute, ce n’est pas fini. Par exemple, nous avons encore besoin de code nous permettant de mettre notre script en pause jusqu’à ce que l’utilisateur ait sélectionné une UO dans la boîte de dialogue ; sans cela, la zone de liste serait affichée mais le script continuerait de s’exécuter, que l’utilisateur ait fait une sélection ou non. Aïe ! Pour éviter que cela ne se produise, nous utilisons ce bloc de code :

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

En fait, nous vérifions de façon répétée la Valeur de notre zone de liste (que nous avons nommée ListeUO, comme vous vous en souvenez peut-être). Si la Valeur est une chaîne vide (ce qui signifie qu’aucun élément n’a été sélectionné), le script est mis en pause pendant 300 millisecondes, puis la boucle est relancée et une nouvelle vérification a lieu. Ceci continue : a) éternellement ; b) jusqu’à ce que l’utilisateur ait sélectionné un élément dans la zone de liste ; ou c) jusqu’à ce que l’utilisateur ait fermé la fenêtre Internet Explorer.

Supposons que l’utilisateur sélectionne une UO dans la zone de liste. Dans ce cas, nous prenons la Valeur (qui est l’ADsPath de l’UO) et l’attribuons à une variable nommée strTargetOU :

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

Nous utilisons ensuite la méthode Quitter pour abandonner notre instance d’Internet Explorer comme illustré ci-dessous :

objExplorer.Quit

À ce stade, nous avons presque terminé. Nous regardons tout d’abord si strTargetOU est égal à une chaîne vide :

If strTargetOU = "" Then
    Wscript.Quit
End If

si c’est le cas, cela signifie que l’utilisateur a fermé Internet Explorer sans sélectionner d’UO ; nous utilisons alors la méthode Wscript.Quit pour arrêter le script. (Nous partons du principe que si l’utilisateur n’a pas sélectionné une UO, c’est qu’il ou elle n’a pas envie d’exécuter le script). Si toutefois strTargetOU n’est pas égal à une chaîne vide, nous renvoyons la valeur de la variable :

Wscript.Echo strTargetOU

Bien sûr, dans un script réel, vous choisiriez sans doute d’établir une liaison vers cette UO dans Active Directory au lieu de renvoyer simplement l’ADsPath. Mais vous savez ce qu’on va vous répondre : débrouillez-vous tous seuls dans ce cas.

Comme nous l’avons mentionné, et comme vous pouvez le voir à la figure 2, ce n’est pas la boîte de dialogue la plus jolie jamais créée, mais elle fonctionne, et c’est bien plus simple que d’avoir à saisir un ADsPath (en supposant que vous le connaissiez). En outre, vous disposez ainsi de l’opportunité de personnaliser le code et la boîte de dialogue comme vous le souhaitez.

Figure 2 Une boîte de dialogue de script simple

Figure 2** Une boîte de dialogue de script simple **

Ah, si on recevait 5 centimes pour chaque document traitant de l’affichage d’une boîte de dialogue permettant de sélectionner une UO d’Active Directory... Après tout, ça ferait 5 centimes de plus que ce que nous paie Technet Magazine.

Non pas qu’on se plaigne, bien sûr !

Les scripteurs Microsofttravaillent pour (enfin, sont employés par) Microsoft. Lorsqu’ils ne sont pas en train de jouer au base-ball, d’entraîner une équipe ou de regarder un match (ou de se livrer à de multiples autres activités), ils dirigent le Script Center TechNet. Vous pouvez le vérifier vous-même sur www.scriptingguys.com.

© 2008 Microsoft Corporation et CMP Media, LLC. Tous droits réservés. Toute reproduction, totale ou partielle, est interdite sans autorisation préalable.