Hey, Scripting Guy!Risposte alle domande sull'unità organizzativa...per soli 5 centesimi

Gli Scripting Guys di Microsoft

Scarica il codice per questo articolo: HeyScriptingGuy2007_03.exe (151KB)

D Come posso visualizzare una finestra di dialogo che mi consenta di selezionare una OU da Active Directory?

Di certo, se noi Scripting Guys avessimo ricevuto un nichelino per ogni volta che ci è stata posta quella domanda avremmo guadagnato solo $37,15. Ma se guadagnassimo un nichelino per ogni persona che volesse rivolgerci questa domanda, senza aver mai trovato il tempo di farla effettivamente, saremmo ricchi. Dopotutto, non siamo diventati Scripting Guys per denaro, ma per la soddisfazione di aiutare le persone a svolgere le loro attività di amministrazione del sistema in modo più semplice e veloce.

Nota: dal punto di vista tecnico siamo diventati Scripting Guys per denaro. Ma poi il nostro manager ci ha detto, "Voi ragazzi potete guadagnare molto denaro, ma solo se siete disposti a lavorare sodo e a produrre soltanto software di qualità superiore". Quello è stato il momento in cui abbiamo deciso che il denaro non era tutto.

Non importa. Il punto è che molte persone vorrebbero sapere come visualizzare una finestra di dialogo che consenta loro di scegliere una OU e, per estensione, eseguire la connessione a tale OU utilizzando uno script. In un recente messaggio di posta elettronica era scritto "È stato illustrato come visualizzare una finestra di dialogo che ci consenta di scegliere delle cartelle e dei file. Perché non è stato illustrato come visualizzare una finestra di dialogo che consenta di scegliere una OU da Active Directory®?"

Bene, tanto per cominciare, è vero che abbiamo illustrato come visualizzare una finestra di dialogo che consenta di scegliere una cartella ed è possibile trovare un esempio proprio qui. Abbiamo anche illustrato come visualizzare una finestra di dialogo che consenta di scegliere i file; in caso di dubbi consultare microsoft.com/technet/scriptcenter/resources/qanda/jan05/hey0128.mspx. Entrambi gli articoli appena indicati sono stati ricevuti correttamente e gli utenti stanno utilizzando tali tecniche nei loro script. Quindi, per quale motivo non abbiamo illustrato come visualizzare una finestra di dialogo che consenta la selezione di una OU da Active Directory? Esiste una cospirazione da parte di Microsoft o c'è un altro motivo?

No di certo. Un momento: è esattamente quello che direbbe qualcuno coinvolto in una cospirazione. La verità è che esiste effettivamente una buona ragione perché non abbiamo illustrato come visualizzare una finestra di dialogo che consente di scegliere una OU da Active Directory: non esiste alcuna finestra di dialogo. Come si dice nel baseball, non si può colpire ciò che non si può vedere. E come diciamo nello script, non è possibile visualizzare ciò che non esiste.

Pertanto riteniamo che sia così per l'articolo di questo mese. Alla prossima.

Che fortuna! Secondo gli editor di TechNet Magazine, non è così per questo mese. "Allora cosa possiamo fare se non esiste una finestra di dialogo come questa"? hanno detto. "Voi siete gli Scripting Guys, perbacco. Non potete creare una finestra di dialogo proprio per risolvere questo problema? Noi pensavamo che voi ragazzi poteste fare qualunque cosa relativa allo script".

Inutile dirlo, gli editor alla TechNet Magazine sono stati mal informati. Vi occupate di tutto ciò che si riferisce allo script? Non esattamente. La verità è che noi Scripting Guys, quando si tratta dello script, sappiamo come fare solo una cosa.

Fortunatamente, tuttavia, quella cosa consiste nel creare una finestra di dialogo che consente di scegliere una OU da Active Directory. Date un'occhiata alla Figura 1.

Si tratta di un tipo di script lungo, vero? Come si dice: non si può fare un'omelette senza rompere delle uova. Analogamente, non si può costruire una finestra di dialogo personalizzata senza rompere delle uova (abbiamo avuto fame a metà strada durante la stesura di questo articolo e dovevamo fermarci per fare uno spuntino). Adesso siamo sazi e vedremo se possiamo spiegare come funziona questa operazione.

Stiamo cercando di utilizzare il modello a oggetti di Internet Explorer® per creare una pseudo finestra di dialogo. L'intento è quello di creare un’istanza di Internet Explorer, raccogliere delle OU da Active Directory e visualizzare tali OU in una casella di riepilogo all’interno di una finestra di Internet Explorer. Attenderemo finché l'utente non seleziona una OU, non recupera l'ADsPath dell’elemento selezionato e non chiude "la finestra di dialogo"; a quel punto procederemo con l’operazione.

Nota: questa finestra di dialogo sarà la più elaborata e la più bella mai creata? Sì, se per "più elaborata e più bella" si intende un qualcosa di talmente semplice da non presentare nemmeno un pulsante OK o Annulla. Ma, a nostra difesa, l'idea è di fornire semplicemente il framework di base. Se si vuole abbellire o modificare la finestra di dialogo, lo si può fare autonomamente.

Se avessimo avuto un nichelino per ogni volta che abbiamo detto "Spiacente, dovete cavarvela da soli," saremmo ricchi. Inviate le donazioni a The Scripting Guys c/o TechNet Magazine.

Per far rientrare la spiegazione relativa alla nostra tecnica nello spazio assegnatoci, dovremo sorvolare su alcune cose. Ad esempio, tutto ciò che diremo sul seguente blocco di codice è che questo crea un’istanza di Internet Explorer di 350-400 pixel e, di conseguenza, nasconde ad esempio la barra degli indirizzi e la barra di stato:

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             

Naturalmente, in questo modo otterremo una finestra di Internet Explorer vuota. Per ottenere l'elenco delle OU nel nostro dominio, è necessario effettuare una ricerca di Active Directory. Non è possibile spiegare i pro e i contro della ricerca di Active Directory; per informazioni, dare un'occhiata alla serie in due parti nello Script Center (microsoft.com/technet/scriptcenter/resources/tales/sg0405.mspx). Quello che possiamo fare è indicare il codice da utilizzare per recuperare il Nome e l’ADsPath per ogni OU nel dominio fabrikam.com:

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

E proprio per semplificare le cose, abbiamo anche sistemato in ordine alfabetico le OU in base al nome. Si tratta della clausola ORDER BY Name (Ordina per nome). (Nessun problema; dopotutto, questo è il nostro compito.)

Quando viene richiamato il metodo Execute, viene restituito un recordset composto da tutte le OU trovate in fabrikam.com. Il passaggio successivo consiste nel visualizzare ciascuna di quelle OU in una casella di riepilogo.

Dunque come viene eseguita questa operazione? Innanzitutto, è necessario creare l’intera casella di riepilogo in memoria. Per chi comincia, ciò significa utilizzare questa riga di codice per memorizzare il tag <SELECT> in una variabile denominata strHTML:

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

Cosa facciamo con questa riga di codice? Creiamo semplicemente una casella di riepilogo HTML standard (operazione eseguibile con il tag <SELECT>). Durante l’operazione, alla casella di riepilogo viene assegnato il nome OUList e viene configurata con una larghezza di 300 pixel (300px) per visualizzare 20 elementi alla volta. Se si conosce il codice HTML, il codice su indicato dovrebbe risultare familiare.

Successivamente, è necessario aggiungere alcuni elementi (ossia, alcune OU) alla casella di riepilogo. Per fortunata coincidenza, il nostro recordset contiene informazioni su ciascuna OU nel dominio. Per questo motivo, è possibile impostare un ciclo Do Until che scorre in ciclo l’intero recordset, recupera le informazioni e aggiunge ciascuna OU alla casella di riepilogo. All’interno del ciclo, viene utilizzato il seguente codice (si tratta sempre del codice HTML standard per l'aggiunta di elementi a una casella di riepilogo) per aggiungere ciascuna OU, configurando l'elemento in modo che il nome della OU sia visualizzato nell'elenco e, se si fa clic su quella OU nella casella di riepilogo, l'ADsPath venga inviato allo script:

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

Perché inviare l'ADsPath allo script? È facile. Supponiamo invece di aver inviato il nome della OU. Se il Nome è, per esempio, Finanza, sarà difficile associarla a quella OU; dopotutto, "Finanza" non è una stringa di associazione ADSI (Active Directory Services Interface) valida. Tuttavia, se viene restituito ADsPath (LDAP://ou=Finance,dc=fabrikam,dc=com), l’associazione diventa facile. Questo perché l'ADsPath è esattamente ciò di cui abbiamo bisogno per individuare ed effettuare una connessione a un oggetto in Active Directory.

Casualmente, viene visualizzato il Nome nella casella di riepilogo perché si presuppone che le OU selezionate abbiano nomi unici. Potrebbe non essere questo il caso; ad esempio, le OU Nord America\Ricerca ed Europa\Ricerca hanno lo stesso nome (Ricerca). Se le OU selezionate hanno nomi duplicati, nella casella di riepilogo si potrebbe utilizzare una proprietà differente, ADsPath o distinguishedName. È una decisione da prendere in autonomia. (Ecco un altro nichelino!)

Comunque, si noti che stiamo ancora creando la casella di riepilogo nella memoria: ogni elemento aggiunto alla casella viene aggiunto alla variabile strHTML. Rientra tutto nel progetto: l’intero codice per la casella di riepilogo viene salvato nella variabile strHTML, il valore di tale variabile viene utilizzato per aggiungere effettivamente la casella di riepilogo alla nostra istanza di Internet Explorer.

Dopo aver aggiunto tutte le OU, si utilizza questa riga di codice per indicare la fine della casella di riepilogo:

strHTML = strHTML & "</select>"

A questo punto, la variabile strHTML contiene tutta la codifica HTML richiesta per creare una casella di riepilogo e, meglio ancora, una casella di riepilogo in cui ogni elemento rappresenta una OU in Active Directory. Ciò significa che ora è possibile assegnare il valore di strHTML alla proprietà InnerHTML del nostro documento di Internet Explorer:

objExplorer.Document.Body.InnerHTML = strHTML

L’operazione fornisce una casella di riepilogo che visualizza tutte le OU in un dominio.

Ma aspettate, non abbiamo ancora finito. È necessario, ad esempio, un codice che consenta di sospendere lo script fino a quando l'utente non avrà selezionato una OU nella finestra di dialogo; senza di essa, la casella di riepilogo può essere visualizzata e lo script continua l’esecuzione indipendentemente dal fatto che l'utente effettui o meno una selezione. Attenzione! Per evitare che si verifichi uno scenario di questo tipo, utilizzare questo blocco di codice:

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

In pratica, il nostro lavoro consiste nel controllare il valore della casella di riepilogo (che, come si può ricordare, è stato denominato OUList, lo stesso nome che uno degli Scripting Guys ha dato a sua figlia). Se il valore è una stringa vuota (cioè se non è stato selezionato alcun elemento), si sospende semplicemente lo script per 300 millisecondi poi il ciclo prosegue e si effettua nuovamente il controllo. Questa operazione continua: a) per sempre; b) finché l'utente seleziona un elemento nella lista di controllo; c) finché l'utente chiude la finestra di Internet Explorer.

Si supponga che l'utente selezioni una OU nella casella di controllo. In tal caso, prendere il Valore (ossia ADsPath della OU) e assegnarlo a una variabile denominata strTargetOU:

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

Utilizzare poi il metodo Quit per eliminare l'istanza di Internet Explorer come mostrato di seguito:

objExplorer.Quit

A questo punto, l'operazione è quasi terminata. Controllare innanzitutto se strTargetOU è uguale a una stringa vuota:

If strTargetOU = "" Then
    Wscript.Quit
End If

Se così fosse, significa che l’utente ha chiuso Internet Explorer senza selezionare una OU; quindi, utilizzare il metodo Wscript.Quit per terminare lo script. (Se l'utente non ha selezionato alcuna OU si presuppone che non sia realmente interessato a eseguire lo script.) Se strTargetOU non è uguale a una stringa vuota, tuttavia, è sufficiente restituire il valore della variabile:

Wscript.Echo strTargetOU

Naturalmente, in uno script reale è possibile proseguire ed eseguire l’associazione alla OU in Active Directory invece di restituire semplicemente ADsPath. Il senso è chiaro: devi cavartela da solo.

Come indicato e come si può vedere nella Figura 2, non è la finestra di dialogo più elegante, ma funziona ed è più facile che dover digitare un ADsPath (supponendo che si conosca anche l'ADsPath). Inoltre, consente di personalizzare il codice e la finestra di dialogo in modo da adattarli alle esigenze personali.

Figura 2 Una semplice finestra di dialogo di script

Figura 2** Una semplice finestra di dialogo di script **

A questo punto, se avessimo un nichelino per ogni articolo scritto sulla visualizzazione di una finestra di dialogo che consente di selezionare una OU da Active Directory guadagneremmo 5 centesimi in più rispetto a quanto percepito generalmente da TechNet Magazine.

Ma attenzione, non ci lamentiamo.

Gli Scripting Guys di Microsoft lavorano o, per meglio dire, sono stipendiati da Microsoft. Quando non si dedicano al baseball (o a varie altre attività) da giocatori, allenatori o semplici spettatori essi gestiscono il TechNet Script Center. Consultare la pagina www.scriptingguys.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.