19

Jan

Creazione, modifica e gestione degli oggetti Active Directory da riga di comando

Active Directory offre da sempre il famoso snap-in Active Directory Users and Computers (Utenti e Computer di Active Directory) per gestire gli oggetti e le permission; ciò che non è previsto da questo snap-in può essere facilmente superato con ADSI Edit che permette di modificare direttamente il database LDAP su cui si basa ADDS.

Può accadere tuttavia, ed a me è capitato ultimamente più del solito, di dover automatizzare delle operazioni ripetitive di creazione o modifica degli oggetti.

Installando il ruolo di Active Directory Domain Services vengono installati numerosi tools a riga di comando, in particolare abbiamo i Directory Service command-line tools:

  • Dsadd – aggiunge oggetti.
  • Dsget – visualizza oggetti.
  • Dsmod – modifica oggetti.
  • Dsmove – sposta oggetti.
  • Dsquery – trova oggetti con particolari criteri.
  • Dsrm – cancella oggetti.

Ciascuno di questi tool, che essendo a riga di comando sono disponibili anche su installazioni di Server Core, supporta svariati tipi di oggetti differenti da comando a comando; il comando Dsadd, ad esempio:

C:\>dsadd /?

Description: This tool's commands add specific types of objects to the

directory. The dsadd commands:

dsadd computer - adds a computer to the directory.

dsadd contact - adds a contact to the directory.

dsadd group - adds a group to the directory.

dsadd ou - adds an organizational unit to the directory.

dsadd user - adds a user to the directory.

dsadd quota - adds a quota specification to a directory partition.

For help on a specific command, type "dsadd /?" where

is one of the supported object types shown above.

For example, dsadd ou /?.

Supporta quindi oggetti Computer, Contatti, Gruppi, Organizational Unit, Utente, Quote.

Ogni oggetto ha un numero enorme di proprietà, definibili in fase di creazione, alcune fondamentali alla creazione stessa dell’oggetto; è ad esempio solitamente abbastanza inutile creare un oggetto Utente senza inserire nome, cognome o password.

Si supponga di voler creare un account per l’utente Mario Rossi, la quantità di parametri e il percorso in formato LDAP rendono il comando un po’ ostico ad una prima lettura:

dsadd user "CN=Mario Rossi,OU=Users,OU=Milano,DC=nwtraders,DC=msft" -fn "Mario" -ln "Rossi" -pwd Pa$$w0rd -mustchpwd yes -upn mario.rossi@nwtraders.msft -display "Mario Rossi" -samid mario.rossi

in particolare, nel comando sopra abbiamo il parametro User che indica il tipo di oggetto da creare, segue, tra doppi apici, il percorso dell’oggetto; -fn indica il FirstName, -ln indica il LastName, -pwd indica la password (in questo caso Pa$$w0rd), -mustchpwd impostato a yes indica che l’utente dovrà cambiare la password al primo logon, -upn indica lo User Principal Name, -display indica il nome comune da visualizzare, -samid indica il nome utente per i client Pre-Windows 2000.

In realtà fra tutti questi parametri il solo indispensabile per la creazione di un oggetto User è la stringa LDAP. Per chi non avesse familiarità con questo formato vediamo di fare un po’ di chiarezza.

Si tratta di una forma che identifica l’oggetto all’interno di AD in modo molto preciso, parte dal Common Name dell’oggetto stesso (CN=Mario Rossi) e prosegue indicando dove questo oggetto sia contenuto, ovvero nell’Organizational Unit chiamata Users (OU=Users) che a sua volta è contenuta nella Organizational Unit chiamata Milano (OU=Milano); questa OU si trova nel dominio nwtraders (DC=nwtraders) che si trova nella forest msft (DC=msft). In altre parole si passa dal particolare al generale, dal contenuto al contenitore.

Risulta evidente che automatizzare il comando direttamente con questa sintassi potrebbe rivelarsi un po’ complicato; è possibile semplificare notevolmente stabilendo quali siano i parametri standard degli utenti da creare.

Diciamo quindi che gli utenti saranno tutti nel dominio nwtraders.msft ed all’interno dell’organizational unit Users; il formato degli utenti sarà nome.cognome ed avranno quindi UPN nome.cognome@nwtraders.msft; di default gli utenti avranno inoltre la password Pr0vv1s0r14 che dovranno cambiare al primo logon. Potremmo creare uno script simile al seguente CreaUtenti.bat:

@echo off

FOR /F "tokens=1,2" %%A IN (lista.txt) DO (dsadd user "CN=%%A %%B,OU=Users,DC=nwtraders,DC=msft" -fn "%%A" -ln "%%B" -pwd Pr0vv1s0r14 -mustchpwd yes -upn %%A.%%B@%userdnsdomain% -display "%%A %%B" -samid %%A.%%B)

Contrariamente alla sua leggibilità il funzionamento è molto semplice: lo script va a leggere il file lista.txt che conterrà la lista degli utenti e creerà un account per ciascun nominativo trovato. Per semplicità è possibile inserire %1 al posto del nome del file in modo da poterlo inserire al momento dell’esecuzione dello script, che funzionerà come segue.

C:\scripts>CreaUtenti.bat lista.txt

dsadd succeeded:CN=Giuseppe Garibaldi,OU=Users,DC=nwtraders,DC=msft

dsadd succeeded:CN=Alessandro Volta,OU=Users,DC=nwtraders,DC=msft

dsadd succeeded:CN=Dante Alighieri,OU=Users,DC=nwtraders,DC=msft

dsadd succeeded:CN=Carlo Levi,OU=Users,DC=nwtraders,DC=msft

dsadd succeeded:CN=Leonardo Sciascia,OU=Users,DC=nwtraders,DC=msft

Il file lista.txt non è altro che una lista:

Giuseppe Garibaldi

Alessandro Volta

Dante Alighieri

Carlo Levi

Leonardo Sciascia

Per verificare la creazione degli oggetti possiamo usare dsget:

C:\>dsget user "cn=Alessandro Volta,ou=users,dc=nwtraders,dc=msft"

cn=Alessandro Volta,ou=users,ou=milano,dc=corp,dc=nwtraders,dc=msft

Alessandro.Volta

dsget succeeded

e magari l’elenco dei gruppi ai quali questo utente appartiene:

C:\>dsget user "cn=Alessandro Volta,ou=users,dc=nwtraders,dc=msft" -memberof

"CN=Domain Users,CN=Users,DC=corp,DC=nwtraders,DC=msft"

Oppure possiamo usare dsquery per la lista di tutti gli del dominio:

C:\>dsquery user domainroot

"CN=Administrator,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=Guest,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=krbtgt,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=DEVDIV$,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=Giuseppe Garibaldi,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

"CN=Alessandro Volta,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

"CN=Dante Alighieri,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

"CN=Carlo Levi,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

"CN=Leonardo Sciascia,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

"CN=Mario Rossi,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

Oppure la lista di tutti gli utenti disabilitati dell’intera forest:

C:\>dsquery user forestroot -disabled

"CN=Guest,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=krbtgt,CN=Users,DC=corp,DC=nwtraders,DC=msft"

"CN=Guest,CN=Users,DC=devdiv,DC=nwtraders,DC=msft"

"CN=krbtgt,CN=Users,DC=devdiv,DC=nwtraders,DC=msft"

"CN=Mario Rossi,OU=Users,OU=Milano,DC=corp,DC=nwtraders,DC=msft"

E’ anche possibile passare il risultato di una dsquery al comando dsget per ottenere informazioni specifiche, ad esempio l’elenco degli utenti disabilitati con relativo reparto:

C:\>dsquery user -disabled | dsget user -ln -fn -office –disabled

fn ln office disabled

Giuseppe Garibaldi Riscossione contenziosi yes

Dante Alighieri Frode yes

Mario Rossi yes

dsget succeeded

by Francesco V. Buccoli on 1/19/2011
Post archive