5
 DEV DEV eloping Soft ware Solu tions — n. 117 — aprile 2004 WSH - Amministriamo gli utenti in un dominio Windows  parte 9 di Antonio Cisternin o, 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 In- formatica, lavora presso il Dipartimento di Infor- matica dell’Universit ` a di Pisa. Si occupa di me- taprogrammazione 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 Diparti mento di Informatica dell’Univer - sit ` a di Pisa. Si occupa dell’amministrazione del dominio Windows e di sviluppo soluzioni per l’amministrazione di reti eterogenee.

Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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

Page 1: Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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.

Page 2: Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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

Page 3: Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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 <<

Page 4: Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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

Page 5: Windows Scripting Host - Amministriamo gli utenti in un dominio Windows (parte 9)

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