Anda di halaman 1dari 5

DEV DEVeloping Software Solutions n.

117 aprile 2004

WSH - Amministriamo gli utenti in un dominio Windows


parte 9

di Antonio Cisternino, Ruggero Giordano


In questo appuntamento inizieremo lo sviluppo di una libreria in Jscript per gestire gli account in un dominio Windows (2000 e 2003) utilizzando ADSI

` Antonio Cisternino e dottore di ricerca in Informatica, lavora presso il Dipartimento di Infor` matica dellUniversita di Pisa. Si occupa di metaprogrammazione e programmazione multi` stage. E uno sviluppa` tore GNU. E autore del RoboMon un monitor VRML per visualizzare partite di RoboCup. Di recente si occupa di generazione di codice a runtime per .NET e CLR. Ruggero Giordano ` e system administrator presso il Dipartimento di Informatica dellUniver` sita di Pisa. Si occupa dellamministrazione del dominio Windows e di sviluppo soluzioni per lamministrazione di reti eterogenee.

pubblicato su WWW.INFOMEDIA.IT stampa digitale da Lulu Enterprises Inc. stores.lulu.com/infomedia


Infomedia
` Infomedia e limpresa editoriale che da quasi venti anni ha raccolto la voce dei programmatori, dei sistemisti, dei professionisti, degli studenti, dei ricercatori e dei professori dinformatica italiani. Sono pi` di 800 gli autori che hanno realizzato per le teu state Computer Programming, Dev, Login, Visual Basic Journal e Java Journal, molte migliaia di articoli tecnici, presentazioni di prodotti, tecnologie, protocolli, strumenti di lavoro, tecniche di sviluppo e semplici trucchi e stratagemmi. Oltre 6 milioni di copie distribuite, trentamila pagine stampate, fanno di questa impresa la pi` grande ed u inuente realt` delleditoria specializzata nel campo della a programmazione e della sistemistica. In tutti questi anni le riviste Infomedia hanno vissuto della passione di quanti vedono nella programmazione non solo la propria professione ma unattivit` vitale e un vero a divertimento. ` Nel 2009, Infomedia e cambiata radicalmente adottando ` un nuovo modello aziendale ed editoriale e si e organizzata attorno ad una idea di Impresa Sociale di Comunit` , a partecipata da programmatori e sistemisti, separando le attivit` di gestione dellinformazione gestite da un board a comunitario professionale e quelle di produzione gesti` te da una impresa strumentale. Questo assetto e in linea con le migliori esperienze internazionali e rende Infomedia ancora di pi` parte della Comunit` nazionale degli u a sviluppatori di software. ` Infomedia e media-partner di manifestazioni ed eventi in ambito informatico, collabora con molti dei pi` imporu tanti editori informatici italiani come partner editoriale e fornitore di servizi di localizzazione in italiano di testi in lingua inglese.

Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH

For copyright information about the contents of DEV, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2004 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2004 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di DEV sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2004 Infomedia e rilasciato ` con Licenza Creative Commons 2.5 BY-NC-ND. Il contenuto Turing Club e 2004 Turing Club e rilasciato ` con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa

Windows Scripting Host Amministriamo gli utenti in un dominio Windows


di

Antonio Cisternino > cisternino@infomedia.it e Ruggero Giordano > rgiordano@infomedia.it

ella puntata precedente abbiamo introdotto Active Directory e la sua struttura. Abbiamo anche visto semplici esempi di uso di ADSI, la libreria di componenti COM per accedere lActive Directory. Ci proponiamo ora di scrivere una libreria WSH (che chiameremo accountlib) per amministrare gli account di un dominio Windows.

ADSI
Con questa interfaccia Microsoft si propone di astrarre il processo per accedere ad un directory di informazioni. Il modello quindi prevede laccesso ad una sorta di file system in cui ci sono contenitori che possono contenere oggetti di vario tipo. In questo contesto gli oggetti sono insiemi di coppie (nome, valore); quindi la libreria consente di navigare i contenitori e accedere alle propriet di ogni singolo oggetto.

PARTE 9 In questo appuntamento inizieremo lo sviluppo di una libreria in Jscript per gestire gli account in un dominio Windows (2000 e 2003) utilizzando ADSI

Il problema
Abbiamo visto che la gestione degli account pu essere un problema complesso in una rete. Le operazioni pi frequenti in questo processo sono: Creazione di account utente o gruppo. Accesso ed aggiornamento delle informazioni associate agli account. Associazione di utenti a gruppi. Cancellazione di account. Reimpostazione della password. Esecuzione aggregata di procedure su utenti e gruppi. Queste funzionalit sono spesso disponibili allinterno di prodotti commerciali rivolti allamministrazione di rete. Con WSH possiamo per ritagliare con poco sforzo un sottoinsieme di funzioni adattandole alla nostra rete. Inoltre la comprensione dei meccanismi di base, ci aiuter anche ad usare meglio questo tipo di prodotti che comunque si poggiano sullo stesso insieme di primitive. Quali funzioni della libreria ADSI possono essere utilizzate in accountlib per realizzare le funzioni che ci interessano? Come abbiamo visto nelle puntate precedenti, il primo passo per utilizzare una libreria di componenti COM capire il modello che questa adotta per risolvere un problema.
DEV > n. 117 aprile 2004

WSH (a partire dalla versione 2.0) offre la possibilit di annotare script con tag XML
Nella guida di riferimento [1] troviamo le definizioni delle inter facce degli oggetti che la libreria mette a disposizione. In particolare le funzioni dei contenitori sono definite nella sezione Core sotto Inter faces, mentre in Persistent Objects troviamo le inter facce degli oggetti rappresentanti gruppi e utenti. Il problema che si pone usando ADSI via WSH che non si sa che interfacce espone un oggetto; purtroppo la libreria non supporta le informazioni sui tipi, e quindi neanche la funzione describe della Object Shell ci aiuta in questo frangente. Fortunatamente facile conoscere il tipo degli oggetti poich tutti implementano linterfaccia IADS tra le cui propriet annovera Class che consente di sapere di che classe un oggetto.

Larchitettura della libreria


La libreria ha una struttura piuttosto standard: una funzione per ogni operazione richiesta. Come abbiamo per osservato nella definizione del problema, ci farebbe
69 <<

Intermediate

LISTATO 1

Esempio di uso della funzione mapUsers. Osserviamo come le due chiamate alla funzione siano equivalenti: nella seconda la funzione argomento per definita sul posto e non riferita

LISTATO 2

La funzione connect per connettersi allActive Directory. La funzione in grado di usare, se specificate, credenziali diverse da quelle dellutente corrente

function printdn(u) { WScript.Echo(u.distinguishedName); } mapUsers(LDAP://cn=Users,dc=miodominio,dc=it, printdn); mapUsers(LDAP://cn=Users,dc=miodominio,dc=it, function(u) {WScript.Echo(u.distinguishedName);} );

var _ _cd = null; var _ _conn = null; function connect(domain, server, user, password) { var root = dc= + domain.split(.).join(,dc=); var ldappath = LDAP://; if (server) ldappath += server + /; ldappath += root; if (!user) return (_ _conn = GetObject(ldappath));

piacere essere in grado di eseguire la stessa operazione su una classe di oggetti. Ad esempio se si vogliono preimpostare le password di tutti gli utenti di un dominio, come si fa? La soluzione pi semplice quella di scrivere un programma WSH che chiama la funzione di cambio password navigando nei contenitori del directory a caccia di oggetti utente. Per fortuna sappiamo che Jscript un linguaggio funzionale, e quindi abbiamo un modo per evitarci la fatica di scrivere sempre lo stesso codice di visita dellalbero. In aggiunta alle operazioni di base abbiamo quindi operazioni che prendono tra gli argomenti una funzione che verr invocata al suo interno. Ad esempio la funzione mapUsers ha il seguente prototipo:
function mapUsers(path, fun)

var ldap = GetObject(LDAP:); return (_ _conn = ldap.OpenDSObject(ldappath, user, password, 0x201)); }

di una stringa saranno le funzioni a recuperare loggetto ADSI corrispondente (gruppo o utente). Inoltre per evitare di dover specificare sempre i path LDAP introduciamo un contenitore corrente che viene specificato al momento della connessione e pu essere cambiato con la funzione cd.

Il suo compito quello di applicare a tutti gli oggetti del directory nel sottoalbero specificato da path la funzione fun.

JScript non prevede nessun meccanismo per includere script presenti in altri file
Caricare la libreria

Jscript un linguaggio funzionale e quindi possiamo definire funzioni, come mapUsers, che visitano il directory e applicano altre funzioni passate come argomento
Nel Listato 1 troviamo il codice che usa mapUsers per stampare il distinguished name degli utenti. La funzione printdn non fa altro che stampare uno dei campi delloggetto user; il ciclo che scorre questi oggetti (e che avevamo visto la volta scorsa) astratto nella funzione mapUsers. Le funzioni offerte dalla nostra libreria saranno le seguenti: adduser(username, fullname, home, pwd) deluser(user) addUserToGroup(user, group) setPassword(user, pwd) findUser(user) findGroup(group) connect(ldappath, user, pwd) cd(ldappath)

Purtroppo JScript non prevede nessun meccanismo per includere script presenti in altri file. Il meccanismo fornito da WSH (a partire dalla versione 2.0) che offre la possibilit di annotare script (anche in linguaggi differenti) con tag XML. Uno dei tag script che, come nel caso di pagine HTML, consente di includere un altro file mediante lattributo src. Supponiamo di voler includere la libreria accountlib.js in uno script che vuole cancellare lutente giovanni; possiamo usare la funzione deluser come mostrato nel Listato 3. Bisogna fare attenzione a salvare il file con estensione .wsf e non .js: altrimenti linterprete JScript segnalerebbe un errore tentando di interpretare i tag XML. I tag che possono essere utilizzati in un file WSF sono elencati nella documentazione [3]. Sebbene sia possibile sviluppare script JScript e includerli in file WSF, riteniamo che la notazione XML a volte renda pi difficile da leggere i propri script (ed tediosa da usare

LISTATO 3

Esempio di file WSF che include la nostra libreria e poi la usa. Questi sono file XML che WSH interpreta e possono essere usati per coordinare lesecuzione di script, anche in pi linguaggi

Perch siano flessibili, consentiremo il passaggio alle nostre funzioni sia di stringhe che di oggetti ADSI. Nel caso
>> 70

<job> <script Language=JScript src=accountlib.js></script> <script Language=JScript> delUser(giovanni); </script> </job>

DEV > n. 117 aprile 2004

Intermediate

LISTATO 4

Inclusione di un file JScript da un altro file. In questo caso niente XML, riportando questa funzione nel sorgente possibile includere altri file

connect(miodominio.it, server.miodominio.it);

///////////////////////////////////////////////////////////////// // Import library /** * @PARAM fname File name of the library * @RETURN The text of the library: you must use eval!!! */ function loadLibrary(fname) { var fs = WScript.CreateObject(Scripting.FileSystemObject); var f = fs.OpenTextFile(fname, 1); var ret = f.ReadAll(); f.Close(); fs = 0; return ret; }

Altrimenti possiamo specificare le credenziali e connettersi anche da un client Windows 2000/XP che non faccia parte del dominio:
connect(miodominio.it, server.miodominio.it, nomeUtente, LamiaPwd);

quando si ha fretta). Unalternativa per includere un file JScript da JScript stesso fare uso della funzione loadLibrary riportata nel Listato 4. Questa funzione legge un file e lo restituisce in una stringa, di cui va fatto leval (purtroppo non si pu fare eval dentro la funzione stessa). In questo caso la cancellazione di Giovanni sar la seguente:
eval(loadLibrary(accountlib.js)); delUser(giovanni);

La funzione, a partire dal dominio, costruisce la stringa ottenuta sostituendo al . la stringa ,dc= e premettendo dc=. Ad esempio miodominio.it viene trasformato in dc=miodominio,dc=it. NellActive Directory questa stringa la radice del directory, e loggetto ADSI consente di ottenere oggetti con percorsi ad esso relativi attraverso luso del metodo GetObject. Nelle altre chiamate faremo uso delloggetto _ _conn per ottenere gli altri oggetti del dominio senza dover specificare ogni volta le credenziali.

Conclusioni
In questo articolo abbiamo analizzato i requisiti di una libreria per gestire laccounting in un dominio Windows mediante WSH e ADSI. Nel prossimo appuntamento concluderemo lo sviluppo della libreria fornendo la definizione dei metodi che abbiamo individuato. Grazie alle astrazioni fornite da ADSI sar anche possibile usare la libreria per amministrare account su macchine Windows singole non incluse in un dominio.

nellipotesi di aver copiato nel file (normalmente alla fine) la funzione loadLibrar y del Listato 3.

Bibliografia

Grazie ad ADSI si potr usare la libreria per amministrare account su macchine non incluse in un dominio
Questa soluzione funziona anche con WSH 1.0 (ancora utilizzato su vecchie installazioni) ed ha il vantaggio di assomigliare alla cara vecchia include del C.

[1] Reference ADSI, http://msdn.microsoft.com/library/ default.asp?url=/library/en-us/adsi/adsi/adsi_reference.asp?frame=true [2] http://msdn.microsoft.com/librar y/default.asp?url=/ librar y/en-us/adsi/adsi/iadsopendsobject_opendsobject.asp [3] http://msdn.microsoft.com/librar y/default.asp?url= /library/en-us/script56/html/wsorixmlelements.asp

Antonio Cisternino
dottore di ricerca in Informatica, lavora presso il Dipartimento di Informatica dellUniversit di Pisa. Si occupa di metaprogrammazione e programmazione multi-stage. uno sviluppatore GNU. autore del RoboMon un monitor VRML per visualizzare partite di RoboCup. Di recente si occupa di generazione di codice a runtime per .NET e CLR.

Connettiamoci al directory
La connessione ad un Active Director y merita qualche commento in pi: negli esempi visti finora abbiamo usato la funzione GetObject, che ci fornisce direttamente loggetto ADSI corrispondente alla stringa passata come argomento. Pur troppo questo approccio non consente di specificare le credenziali dellutente che si collega al director y (nella connessione vengono specificate quelle dellutente corrente). per possibile specificare le credenziali usando la funzione OpenDSObject. La funzione connect (Listato 2) verifica i parametri e decide se usare il metodo semplice oppure quello con le credenziali. Lultimo parametro della chiamata a OpenDSObject una combinazione di due flag come indicato nella documentazione [2]. Se stiamo quindi scrivendo uno script sul ser ver possiamo connetterci con la seguente chiamata:
DEV > n. 117 aprile 2004

Ruggero Giordano
system administrator presso il Dipartimento di Informatica dellUniversit di Pisa. Si occupa dellamministrazione del dominio Windows e di sviluppo soluzioni per lamministrazione di reti eterogenee.

Download del progetto


Scarica il progetto completo di questo articolo allindirizzo: ftp://ftp.infomedia.it/pub/DEV./Listati/Dev117/ps-wsh-9.zip

71 <<

Anda mungkin juga menyukai