Upload
infomedia-editori-coop
View
122
Download
0
Embed Size (px)
DESCRIPTION
DEV — n. 117 — aprile 2004 - Windows Scripting Host - 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
Citation preview
5/10/2018 Windows Scripting Host - Amministriamo gli utenti in un dominio Windows ...
http://slidepdf.com/reader/full/windows-scripting-host-amministriamo-gli-utenti-in-un-dominio
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 pergestire gli account in un dominio Windows (2000 e 2003) utilizzando ADSI
Antonio Cisternino edottore di ricerca in In-formatica, lavora pressoil Dipartimento di Infor-matica dell’Universita diPisa. Si occupa di me-taprogrammazione eprogrammazione multi-
stage. E uno sviluppa-
tore GNU. E autore delRoboMon un monitorVRML per visualizzarepartite di RoboCup. Direcente si occupa digenerazione di codicea runtime per .NET eCLR. Ruggero Giordanoe system administratorpresso il Dipartimento diInformatica dell’Univer-sita di Pisa. Si occupadell’amministrazionedel dominio Windowse di sviluppo soluzioniper l’amministrazionedi reti eterogenee.
5/10/2018 Windows Scripting Host - Amministriamo gli utenti in un dominio Windows ...
http://slidepdf.com/reader/full/windows-scripting-host-amministriamo-gli-utenti-in-un-dominio
pubblicato su
WWW.INFOMEDIA.IT
stampa digitale da
Lulu Enterprises Inc.
stores.lulu.com / infomedia
Infomedia
Infomedia e l’impresa editoriale che da quasi venti an-
ni ha raccolto la voce dei programmatori, dei sistemi-
sti, dei professionisti, degli studenti, dei ricercatori e dei
professori d’informatica italiani.
Sono piu di 800 gli autori che hanno realizzato per le te-
state Computer Programming, Dev, Login, Visual Basic
Journal e Java Journal, molte migliaia di articoli tecnici,
presentazioni di prodotti, tecnologie, protocolli, strumen-ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-
tagemmi. Oltre 6 milioni di copie distribuite, trentamila
pagine stampate, fanno di questa impresa la piu grande ed
influente realta dell’editoria specializzata nel campo della
programmazione e della sistemistica.
In tutti questi anni le riviste Infomedia hanno vissuto del-
la passione di quanti vedono nella programmazione non
solo la propria professione ma un’attivita vitale e un vero
divertimento.
Nel 2009, Infomedia e cambiata radicalmente adottando
un nuovo modello aziendale ed editoriale e si e organiz-
zata attorno ad una idea di Impresa Sociale di Comunita,
partecipata da programmatori e sistemisti, separando le
attivita di gestione dell’informazione gestite da un board
comunitario professionale e quelle di produzione gesti-
te da una impresa strumentale. Questo assetto e in linea
con le migliori esperienze internazionali e rende Infome-
dia ancora di piu parte della Comunita nazionale degli
sviluppatori di software.
Infomedia e media-partner di manifestazioni ed eventi in
ambito informatico, collabora con molti dei pi u impor-tanti editori informatici italiani come partner editoriale e
fornitore di servizi di localizzazione in italiano di testi in
lingua inglese.
L’impaginazione 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 ar-
ticle 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 so-
no riportate nella sezione “Copyright” alla fine di cia-
scun 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 con-
tenuto 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 tota-
le dei testi e delle immagini per scopo didattico purch´ e
vengano integralmente citati gli autori e la completa
identificazione della testata.
Manoscritti e foto originali, anche se non pubblicati, non
si restituiscono.
Contenuto pubblicitario inferiore al 45%.
La biografia dell’autore riportata nell’articolo e sul
sito www.infomedia.it e di norma quella disponibi-
le nella stampa dell’articolo o aggiornata a cu-
ra dell’autore stesso. Per aggiornarla scrivere a
[email protected] o farlo in autonomia all’indirizzo
http: // mags.programmers.net / moduli / biografia
5/10/2018 Windows Scripting Host - Amministriamo gli utenti in un dominio Windows ...
http://slidepdf.com/reader/full/windows-scripting-host-amministriamo-gli-utenti-in-un-dominio
Nella puntata precedente abbia-
mo introdotto Active Directory
e la sua struttura. Abbiamo
anche visto semplici esempi di
uso di ADSI, la libreria di com-
ponenti COM per accedere
l’Active Directory .
Ci proponiamo ora di scrivere una libreria
WSH (che chiameremo accountlib ) per
amministrare gli account di un dominio
Windows.
Il problema
Abbiamo visto che la gestione degli accountpuò essere un problema complesso in una
rete. Le operazioni più frequenti in questo
processo sono:
• Creazione di account utente o grup-
po.
• 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
all’interno di prodotti commerciali rivolti
all’amministrazione di rete. Con WSH pos-
siamo 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 prece-denti, il primo passo per utilizzare una
libreria di componenti COM è capire il
modello che questa adotta per risolvere un
problema.
ADSICon questa interfaccia Microsoft si propone
di astrarre il processo per accedere ad un
directory di informazioni.
Il modello quindi prevede l’accesso ad una
sorta di file system in cui ci sono conteni-
tori 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.
Nella guida di riferimento [1] troviamo le
definizioni delle interfacce degli oggetti
che la libreria mette a disposizione. In par-
ticolare le funzioni dei contenitori sono
definite nella sezione Core sotto
Interfaces, mentre in Persistent Objects
troviamo le inter facce degli oggetti rappre-sentanti 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 sup-
porta le informazioni sui tipi, e quindi nean-
che la funzione describe della Object Shell
ci aiuta in questo frangente.
Fortunatamente è facile conoscere il tipo
degli oggetti poiché tutti implementano l’in-
terfaccia IADS tra le cui proprietà annovera
Class che consente di sapere di che classe
è un oggetto.
L’architettura della libreriaLa libreria ha una struttura piuttosto stan-
dard: una funzione per ogni operazione
richiesta. Come abbiamo però osservato
nella definizione del problema, ci farebbe
PARTE 9
In questoappuntamentoinizieremo losviluppo di unalibreria in Jscriptper gestire gliaccount in un
dominio Windows(2000 e 2003)utilizzando ADSI
Windows Scripting HostAmministriamo gli utentiin un dominio Windowsdi Antonio Cisternino > [email protected] e Ruggero Giordano > [email protected]
WSH (a partire dalla
versione 2.0) offre la
possibilità di annotare
script con tag XML
DEV > n. 117 aprile 2004 69 <<
5/10/2018 Windows Scripting Host - Amministriamo gli utenti in un dominio Windows ...
http://slidepdf.com/reader/full/windows-scripting-host-amministriamo-gli-utenti-in-un-dominio
70 DEV > n. 117 aprile 2004>>
Intermediate
piacere essere in grado di eseguire la stessa operazione su
una classe di oggetti. Ad esempio se si vogliono preimpo-
stare le password di tutti gli utenti di un dominio, come si
fa?
La soluzione più semplice è quella di scrivere un program-
ma WSH che chiama la funzione di cambio password navi-
gando nei contenitori del directory a caccia di oggetti uten-
te.
Per fortuna sappiamo che Jscript è un linguaggio funziona-
le , e quindi abbiamo un modo per evitarci la fatica di scri-
vere sempre lo stesso codice di visita dell’albero. In
aggiunta alle operazioni di base abbiamo quindi operazioni
che prendono tra gli argomenti una funzione che verrà invo-
cata al suo interno. Ad esempio la funzione mapUsers ha il
seguente prototipo:
function mapUsers(path, fun)
Il suo compito è quello di applicare a tutti gli oggetti del
directory nel sottoalbero specificato da path la funzione
fun.
Nel Listato 1 troviamo il codice che usa mapUsers per
stampare il distinguished name degli utenti. La funzioneprintdn non fa altro che stampare uno dei campi dell’og-
getto user ; il ciclo che scorre questi oggetti (e che aveva-
mo visto la volta scorsa) è astratto nella funzione
mapUsers.
Le funzioni offerte dalla nostra libreria saranno le seguen-
ti:
• adduser (username , fullname , home , pwd )
• deluser (user )
• addUserToGroup (user , group )
• setPassword (user , pwd )
• findUser (user )
• findGroup (group )
• connect (ldappath, user , pwd )• cd (ldappath)
Perché siano flessibili, consentiremo il passaggio alle
nostre funzioni sia di stringhe che di oggetti ADSI. Nel caso
di una stringa saranno le funzioni a recuperare l’oggetto
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 .
Caricare la libreriaPurtroppo JScript non prevede nessun meccanismo per
includere script presenti in altri file. Il meccanismo è forni-
to da WSH (a partire dalla versione 2.0) che offre la possi-
bilità 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 l’attri-
buto src .
Supponiamo di voler includere la libreria accountlib.js in
uno script che vuole cancellare l’utente 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 l’interprete JScript segnalerebbe un
errore tentando di interpretare i tag XML. I tag che posso-no essere utilizzati in un file WSF sono elencati nella docu-
mentazione [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 1Esempio di uso della funzione mapUsers.Osserviamo come le due chiamate allafunzione siano equivalenti: nella secondala funzione argomento è però definita sulposto e non riferita
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);} );
LISTATO 2La funzione connect per connettersiall’Active Directory. La funzione è in gradodi usare, se specificate, credenziali diverseda quelle dell’utente corrente
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));
var ldap = GetObject(“LDAP:”);
return (_ _conn = ldap.OpenDSObject(ldappath, user, password,
0x201));
}
LISTATO 3Esempio di file WSF che include la nostralibreria e poi la usa. Questi sono file XMLche WSH interpreta e possono essereusati per coordinare l’esecuzione di script,anche in più linguaggi
<job>
<script Language=”JScript” src=”accountlib.js”></script><script Language=”JScript”>
delUser(“giovanni”);
</script>
</job>
Jscript è un linguaggio funzionale
e quindi possiamo definire funzioni,
come mapUsers, che visitano
il directory e applicano altre funzioni
passate come argomento
JScript non prevede nessun
meccanismo per includere script
presenti in altri file
5/10/2018 Windows Scripting Host - Amministriamo gli utenti in un dominio Windows ...
http://slidepdf.com/reader/full/windows-scripting-host-amministriamo-gli-utenti-in-un-dominio
DEV > n. 117 aprile 2004 71 <<
Intermediate
quando si ha fretta). Un’alternativa per includere un fileJScript da JScript stesso è fare uso della funzioneloadLibrary riportata nel Listato 4. Questa funzione leggeun file e lo restituisce in una stringa, di cui va fatto l’eval (purtroppo non si può fare eval dentro la funzione stessa).In questo caso la cancellazione di Giovanni sarà la seguen-te:
eval(loadLibrary(“accountlib.js”));
delUser(“giovanni”);
nell’ipotesi di aver copiato nel file (normalmente alla fine)la funzione loadLibrary del Listato 3.
Questa soluzione funziona anche con WSH 1.0 (ancorautilizzato su vecchie installazioni) ed ha il vantaggio diassomigliare alla cara vecchia include del C.
Connettiamoci al directory
La connessione ad un Active Directory merita qualchecommento in più: negli esempi visti finora abbiamo usatola funzione GetObject , che ci fornisce direttamente l’og-getto ADSI corrispondente alla stringa passata come argo-mento.Purtroppo questo approccio non consente di specificarele credenziali dell’utente che si collega al directory (nellaconnessione vengono specificate quelle dell’utente cor-rente).È però possibile specificare le credenziali usando la fun-zione OpenDSObject .La funzione connect (Listato 2) verifica i parametri e deci-de se usare il metodo semplice oppure quello con le cre-denziali.
L’ultimo parametro della chiamata a OpenDSObject è unacombinazione di due flag come indicato nella documenta-zione [2].Se stiamo quindi scrivendo uno script sul server possia-mo connetterci con la seguente chiamata:
connect(“miodominio.it”, “server.miodominio.it”);
Altrimenti possiamo specificare le credenziali e connettersianche da un client Windows 2000/XP che non faccia partedel dominio:
connect(“miodominio.it”, “server.miodominio.it”,
“nomeUtente”, “LamiaPwd”);
La funzione, a partire dal dominio, costruisce la stringaottenuta sostituendo al “.” la stringa “,dc=” e premetten-do “dc=”.Ad esempio miodominio.it viene trasformato in dc=miodo- minio ,dc=it . Nell’Active Directory questa stringa è la radicedel directory, e l’oggetto ADSI consente di ottenere ogget-ti con percorsi ad esso relativi attraverso l’uso del metodoGetObject .Nelle altre chiamate faremo uso dell’oggetto __conn perottenere gli altri oggetti del dominio senza dover specifica-re ogni volta le credenziali.
ConclusioniIn questo articolo abbiamo analizzato i requisiti di unalibreria per gestire l’accounting in un dominio Windowsmediante WSH e ADSI.Nel prossimo appuntamento concluderemo lo sviluppodella libreria fornendo la definizione dei metodi che abbia-mo individuato.Grazie alle astrazioni fornite da ADSI sarà anche possibileusare la libreria per amministrare account su macchineWindows singole non incluse in un dominio.
Bibliografia[1] Reference ADSI, http://msdn.microsoft.com/library/
default.asp?url=/library/en-us/adsi/adsi/adsi_referen-ce.asp?frame=true
[2] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/adsi/adsi/iadsopendsobject_opendsob-
ject.asp[3] http://msdn.microsoft.com/library/default.asp?url=
/library/en-us/script56/html/wsorixmlelements.asp
È dottore di ricerca in Informatica, lavora presso il Dipar- timento di Informatica dell’Università di Pisa. Si occupa di
metaprogrammazione e programmazione multi-stage. È uno sviluppatore GNU. È autore del RoboMon un monitor VRMLper visualizzare partite di RoboCup. Di recente si occupa di generazione di codice a runtime per .NET e CLR.
È system administrator presso il Dipartimento di Informatica dell’Università di Pisa. Si occupa dell’amministrazione del dominio Windows e di sviluppo soluzioni per l’amministrazio- ne di reti eterogenee.
Antonio Cisternino
Ruggero Giordano
Download del progetto
Scarica il progetto completo di questo articolo all’indirizzo:ftp://ftp.infomedia.it/pub/DEV./Listati/Dev117/ps-wsh-9.zip
LISTATO 4 Inclusione di un file JScript da un altro file.In questo caso niente XML, riportandoquesta funzione nel sorgente è possibileincludere altri file
/////////////////////////////////////////////////////////////////
// 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;
}
Grazie ad ADSI si potrà usarela libreria per amministrare
account su macchine non inclusein un dominio