Una delle applicazioni più comuni di PowerShell che vengono utilizzate dai professionisti IT è la sincronizzazione delle informazioni con Active Directory (AD). Sembra che tutti abbiano una fonte di dati esterna correlata ad alcuni dipendenti che bisogna inserire in AD. Ciò è prevedibile perché AD è in genere il servizio IT più utilizzato nelle organizzazioni e fornisce un’eccellente funzionalità non solo come autenticazione, ma anche come archivio di informazioni sui dipendenti.
Anche se i tuoi dati sono archiviati in un database SQL personalizzato o in un sistema HR di ultima generazione, è spiacevole dover verificare due fonti se hai bisogno di informazioni come il dipartimento del dipendente, i gruppi di cui il dipendente dovrebbe far parte e così via. Quando inizi a sincronizzare i dati, il sistema di origine può cambiare schema, API, server e così via, il che comporta una rielaborazione del codice. Per assicurarti che l’origine dei dati da cui stai effettuando la sincronizzazione rimanga sempre la stessa e possa essere facilmente creata da qualsiasi sistema, è opportuno che i dati vengano inseriti in un file CSV.
Un semplice file CSV può essere esportato da qualsiasi software o database e, in questo formato, l’amministratore dispone di una copia che può modificare se necessario, evitando così le richieste di un altro team di modificare un database da qualche parte.
Procediamo con un semplice script che puoi usare oggi per importare gli utenti in Active Directory da un file CSV.
Per cominciare, supponiamo di avere un CSV chiamato C:Employees.csv. Il CSV ha tre colonne: Nome, Cognome e Reparto. Desideri uno script che trovi l’account AD associato a quel nome/cognome e che modifichi il reparto in quello indicato nel CSV.
Questo script, come ogni script di sincronizzazione, sarà composto principalmente da tre “fasi”. Le “fasi” sono la lettura dei dati di origine (CSV in questo esempio), la ricerca dell’ID univoco dei dati di origine di destinazione che corrisponde ai dati di origine (AD samAccountName in questo esempio) e infine la scrittura degli attributi associati legati a quell’account.
Il primo passo è la lettura del file CSV.
$csvUsers = Import-Csv -Path 'C:Employees.csv'
Fatto. La parte successiva consiste nel trovare l’ID univoco da abbinare a ogni riga del file CSV. Poiché non abbiamo l’ID univoco all’interno del CSV, dobbiamo costruirne uno all’istante. Per ottenere questo ID univoco, supporremo che l’iniziale del nome e il cognome di un dipendente corrispondano sempre a un nome di account AD samAccountName. Dovremo creare questa ricerca samAccountName e poi eseguire una query AD per vedere se esiste un account.
Nota: Prima di andare avanti, assicurati di aver scaricato e installato gli Strumenti di amministrazione del server remoto per il tuo sistema operativo. In questo modo otterrai il modulo PowerShell di Active Directory contenente le cmdlet Get-AdUser e Set-AdUser che utilizzeremo.
foreach ($csvUser in $csvUsers) { $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) { ## Il nostro "ID unico" è stato trovato. Procedi alla lettura dei dati CSV e alla scrittura degli attributi } else { Write-Warning -Message 'Corrispondenza utente non trovata' } }
Una volta ottenuto un account AD con cui lavorare, possiamo leggere ogni attributo associato al nome del dipendente nel file CSV e scrivere le informazioni nell’account AD trovato. Di seguito si può notare che si sta definendo la variabile $attributesToSync, per poi leggerla in un secondo momento. In questo modo è possibile aggiungere altri attributi che potrebbero essere presenti nel CSV per sincronizzare anche quelli in futuro. L’esempio seguente verifica innanzitutto se l’attributo è lo stesso. In caso contrario, si utilizza Set-AdUser per cambiarlo.
$attributesToSync = 'Dipartimento' foreach ($csvUser in $csvUsers) { $userName = '{0}{1}' -f $csvUser.FirstName.SubString(0,1),$csvUser.LastName if ($adUser = Get-AdUser -Filter "samAccountName -eq $userName" -Properties $attributesToSync) { foreach ($attr in $attributesToSync) { if ($csvUser.$_ -ne $adUser.$_) { $setParams = @{$_ = $csvUser.$_} $adUser | Set-AdUser @setParams } } } else { Write-Warning -Message 'Corrispondenza utente non trovata' } }
Questo esempio funziona solo con gli attributi che sono valori stringa all’interno di AD. Presta attenzione agli attributi come il gestore, la data di scadenza dell’account e così via. Questi attributi richiedono la costruzione di un oggetto del tipo corretto prima di essere scritti in AD. Ci vorrebbe un’altra serie di articoli per esaminare le complessità della sincronizzazione di AD e del lavoro con i diversi attributi, ma abbiamo creato un PowerShell chiamato PSADSync che ti assisterà in questo senso. Puoi trovarlo estraendolo dalla Galleria PowerShell con Install-Module PSADSync.
Adam Bertram è un MVP di Microsoft Windows Cloud e Datacenter Management ed è autore di vari corsi di formazione, collabora regolarmente a numerose pubblicazioni cartacee e online e presenta a vari gruppi di utenti e conferenze. Puoi trovare Adam all’indirizzo adamtheautomator.com o su Twitter all’indirizzo @adbertram.