lunedì 27 agosto 2018

Creare molti utenti di dominio in una volta sola da un elenco CSV / Excel


Talvolta mi trovo a dover creare o modificare molti utenti in una sola volta e… lo sapete come sono fatto: mi piace farlo con uno script.

Powershell (il modulo activedirectory di amministrazione) offre moltissimi comandi utili e pronti da usare, oltre alla sua sintassi veramente semplice…

Ecco quindi di seguito come creare un set di utenti in un unico comando, partendo da un elenco CSV che potete facilmente creare da un Excel xlsx oppure da un elenco di nomi e cognomi che magari avete ricevuto via mail.

Riassumo la metodologia utilizzata
  1. Creare un file CSV degli utenti con i dettagli.
  2. Creare un file CSV con nome utente e nuova password
  3. Utilizzare powershell per importare i files CSV in oggetti
  4. Lanciare lo script per creare le utenze
  5. Lanciare lo script per cambiare le password e riabilitare le utenze
...e cosa impareremo leggendo questo articolo:
  1. Creare una serie di utenti di dominio da un elenco CSV (comma separated values)
  2. Cambiare la password a più utenti Active Directory da un elenco CSV
  3. Importare un elenco CSV in una variabile Powershell
  4. Importare il modulo di amministrazione di Active Directory in Powershell
  5. Alcune regular expression con Notepad++


... ed ora spiego tutto:

1.    Creare un file CSV degli utenti con i dettagli

Partiamo dalla “base dati”: avremo bisogno di un elenco che ci dica al minimo nome, cognome e nome utente da creare…
cognome;nome;nomeSAM;descrizione
Rossi;Mario;MarioR_cons;"Questo testo sarà in descrizione";
Bianchi;Guido;GuidoB_cons;"Questo testo sarà in descrizione";
Verdi;Giovanni;GiovanniV_cons;"Questo testo sarà in descrizione";
Castelli;Diego;DiegoC_cons;"Questo testo sarà in descrizione";
Pompilio;Numa;NumaP_cons;"Questo testo sarà in descrizione";
Stilio;Tullio;TullioS_cons;"Questo testo sarà in descrizione";
Marzio;Anco;AncoM_cons;"Questo testo sarà in descrizione";
Prisco;Tarquinio;TarquinioP_cons;"Questo testo sarà in descrizione";
Tullio;Servio;ServioT_cons;"Questo testo sarà in descrizione";
Superbo;Tarquinio;TarquinioS_cons;"Questo testo sarà in descrizione";


Come creare un file CSV da un semplice elenco di nomi e cognomi (una mail)

Se avete ricevuto una mail con un elenco di nomi e cognomi è possibile arrivare velocemente ad un file CSV con delle regular expressions con notepad++
Ecco la regular expression da inserire nel campo “Trova” e la stringa da inserire nel campo “Sostituisci con” :

Trova:                 ^([^\s]*)[\s]([\w]{1})([^\s]*)
Sostituisci con:   \2\3;\1;\1\2_cons;"Questo testo sarà in descrizione"

Qui sotto un paio di foto che mostrano come si trasforma l’elenco con questa semplice regexp




NOTA: Per gli utenti che ho dovuto creare io, la nomenclatura del nome utente doveva essere:
_cons
Ad esempio: MarioR_cons
Sicchè ho creato la regular expression perché ci desse in output un elenco CSV con le colonne giuste.


2.    Creare un file CSV con nome utente e nuova password

Qui le ho messe con gli asterischi...

nomeSAM;password
MarioR_cons;**************
GuidoB_cons;**************
GiovanniV_cons;**************
DiegoC_cons;**************
NumaP_cons;**************
TullioS_cons;**************
AncoM_cons;**************
TarquinioP_cons;**************
ServioT_cons;**************
TarquinioS_cons;**************


Ma perché un CSV diverso?

Il motivo è molto semplice: nel mio esempio ho fatto generare le password ad un programma (Keepass) ed ho quindi ottenuto, infine, un CSV con le password generate secondo la mia regola personalizzata (magari scriverò un articolo su come si fa).

Inoltre, così ho l’opportunità anche di spiegare come si cambiano le password a molti utenti in una volta sola con uno script!

Se invece avete un elenco che già contiene anche le password, vi basterà ignorare questo passaggio ed agguingere, al primo comando (New-AdUser), in fondo:
-AccountPassword (convertto-securestring -asPlainText $_.password -Force)
Sempre che la colonna del vostro CSV contenente la password si chiami, appunto “password”


3.    Utilizzare powershell per importare i files CSV in oggetti

In powershell è possibile ottenere una variabile “oggetto” da un file CSV in modo molto semplice.
Apriamo direttamente la powershell (non è necessario scomodare un file .ps1 per operazioni semplici…)
“Carichiamo” quindi i nostri dati dai nostri files così:

$a = import-csv ".csv" -Delimiter ";"
$b = import-csv ".csv" -Delimiter ";"

Dove ovviamente sostituirete con i percorsi completi dei vostri 2 file.
Importiamo anche una semplice variabile di testo che contiene il nome del nostro dominio, ci verrà utile in seguito:

$domainName = "miodominio.local"

… inoltre, SE VOGLIAMO specificare il percorso della OU nella quale creare le utenze in Active Directory, possiamo specificarlo con

$OUpath = "CN=nomeOU,DC=miodominio,DC=local"
Dove, ovviamente, il valore va sostituito con il DistinguishedName della OU in Active Directory (potete recuperare il valore da “Utenti e Computer di Active Directory” (dsa.msc) abilitando la visualizzazione avanzata e visualizzando la scheda “Editor Attributi” nelle proprietà della OU.

IMPORTANTE: prima di procedere ad operare su Active Directory da Powershell (oltre ovviamente alle raccomandazioni di fare attenzione e che lo fate a vostro rischio e pericolo, che sono d’obbligo) è necessario importare il corretto modulo di amministrazione dentro la sessione powershell.
Se state lanciando powershell dal Domain controller, non avrete nessun problema.
Se state lanciando powershell dal vostro PC, dovreste aver già installato i “Remote Server Administration Tools” di Microsoft: una serie di strumenti di base per amministrare la vostra infrastruttura server (DHCP, DNS, Active Directory, ….) direttamente dal vostro PC.
Inoltre dovreste aver lanciato la powershell con un account che ha i diritti di amministratore di dominio (o al minimo i diritti che servono per creare utenze).
Per importare il modulo di amministrazione Active Directory, lanciate quindi il comando:
import-module activedirectory


4.    Lanciare lo script per creare le utenze

Una volta importato il modulo activedirectory avremo a disposizione i comandi che ci servono. Lanciamo quindi (anche copiando e incollando):

$a | foreach {
    New-ADUser -Name ($_.cognome + " " + $_.nome ) -GivenName $_.nome -Surname $_.cognome -SamAccountName $_.nomeSAM -UserPrincipalName ($_.nomeSAM+"@"+$domainName) -Path $OUpath -Description (""+$_.description)
}

Lo script creerà le utenze DISATTIVATE nella OU di destinazione, senza specificare una password.

Varianti

Se avete già specificato la password in una colonna “password” del primo elenco CSV

Aggiungete la parte

-AccountPassword (convertto-securestring -asPlainText $_.password -Force) -Enabled $true

Così:

$a | foreach {
    New-ADUser -Name ($_.cognome + " " + $_.nome ) -GivenName $_.nome -Surname $_.cognome -SamAccountName $_.nomeSAM -UserPrincipalName ($_.nomeSAM+"@"+$domainName) -Path $OUpath -Description (""+$_.description) -AccountPassword (convertto-securestring -asPlainText $_.password -Force) -Enabled $true
}

In questo caso, non avrete bisogno della parte 5.

Se NON volete specificare la OU in cui creare le utenze

Rimuovete -Path $OUpath

$a | foreach {
    New-ADUser -Name ($_.cognome + " " + $_.nome ) -GivenName $_.nome -Surname $_.cognome -SamAccountName $_.nomeSAM -UserPrincipalName ($_.nomeSAM+"@"+$domainName) -Description (""+$_.description)
}


5.    Lanciare lo script per cambiare le password e riabilitare le utenze

Ora vediamo anche come cambiare la password a più utenti contemporaneamente partendo da un elenco CSV.
Nell’elenco numero 2, ci sono solo 2 colonne: nome utente e nuova password da impostare. Il nome utente è quello che ci permette di capire a quale utente cambiare la password, ovviamente.
Lanciamo quindi il comando:
$b | foreach{
    Set-ADAccountPassword $_.nomeSAM -newPassword (convertto-securestring -asPlainText $_.password -Force)
    set-AdUser $_.nomeSAM -Enabled $true
}

La prima riga è per cambiare la password, la seconda per riabilitare l’utente (inizialmente creato disabilitato)


6.    Ricapitoliamo

  • Abbiamo creato dei files CSV contenenti uno i dettagli dell’utente da creare, l’altro la corrispondenza username - nuovapassword.
  • Li abbiamo importati in due variabili powershell e abbiamo anche definito 2 variabili “stringa” per alcuni dettagli comuni
  • Abbiamo importato il modulo di amministrazione AD in powershell
  • Abbiamo creato le utenze senza password
  • Abbiamo cambiato la password e abilitato le utenze

7.    Script completo

Una volta che avete i due files CSV potete anche copiare e incollare questo script (ricordandovi di cambiare i percorsi dei files) dentro una powershell…
… o metterlo in un file .ps1 e farlo girare

$a = import-csv ".csv" -Delimiter ";"
$b = import-csv ".csv" -Delimiter ";"
import-module activedirectory
$domainName = "miodominio.local"
$OUpath = "CN=OUName,DC=miodominio,DC=local"
# creiamo gli utenti dal file (colonne cognome;nome;nomeSAM;descrizione)
$a | foreach {
    New-ADUser -Name ($_.cognome + " " + $_.nome ) -GivenName $_.nome -Surname $_.cognome -SamAccountName $_.nomeSAM -UserPrincipalName ($_.nomeSAM+"@"+$domainName) -Path $OUpath -Description (""+$_.description)
}
# Cambiamo le pw e riabilitiamo (colonne nomeSAM;password)
$b | foreach{
    Set-ADAccountPassword $_.nomeSAM -newPassword (convertto-securestring -asPlainText $_.password -Force)
    set-AdUser $_.nomeSAM -Enabled $true
}

BUONO SCRIPTING A TUTTI!!!