script ad powershell

SCRIPT AD POWERSHELL – CRÉER DES UTILISATEURS EN MASSE DANS L’AD À PARTIR D’UN CSV

Dans la cadre de mes études chez Openclassrooms, j’ai du créer un script ad qui s’intitule « Créer des utilisateurs en masse dans l’AD à partir d’un CSV via un script AD » pour l’ajout d’utilisateurs dans l’active directory avec Powershell ISE à partir d’un fichier csv.

Mon script est en anglais, il fonctionne très bien sur windows server en Français, rassurez-vous. Vous pourrez selon vos besoin ajouter des options au besoin, ici c’est le script de base pour l’ajout des users, le mappage sur un lecteur pour chaque utilisateur.

Attention avant de commencer

Le site Go4IT est un blog collaboratif, veuillez toujours signaler les erreurs dans les commentaires et si le script a bien fonctionné et sans erreurs sinon veuillez nous le faire part dans  les commentaires en bas de l’article. L’objectif étant d’avoir un script propre et fonctionnel.

L’objectif du script powershell :

  • Créer le fichier csv
  • Créer le script ad
  • Integrer un mappage lecteur pour l’utilisateur (facultatif pour vous)
  • Intégration des options du profil de l’AD
  • Bien créer les UO « Unité d’organisation » et les groupes de sécurité au préalable
  • Lancer le script sur Powershell ISE en mode administrateur
  • Mission terminée
  • Création du fichier CSV

La première étape est la création d’un fichier CSV

qui comportera les options du profil de l’AD comme le nom, prénom, intitulé du poste, email avec votre domaine, le groupe de sécurité, l’unité d’organisation etc.

Prénom,Nom,Titre du poste,Téléphone de bureau,ID d’employé,Adresse e-mail,Description,Unité organisationnelle,AddToGroups(csv),password

Exemple :

Ce qui donne dans votre fichier .CSV

First Name,Last Name,Job Title,Email Address,Organizational Unit,Add Groups (csv),Employee ID,Password
Nicolas,Dupont,Technicien informatique,n.dupont@go4it.loc,"OU=Informatique,OU=Services,DC=go4it,DC=loc",Grp_Informatique,01,P@$$w0rd

Dans le CSV, j’utilise Password car nous avons un protocole dans le script pour créer le password selon ce que demande le script.

 

Création et exemple script powershell Active Directory

Pour commencer, nous devons importer le module Active Directory et charger les formulaires Windows. Nous utiliserons une boîte de dialogue d’ouverture de fichier pour spécifier le chemin d’accès au fichier CSV contenant les utilisateurs. C’est beaucoup plus facile pour l’utilisateur final que de taper le chemin complet. Vous remarquerez que nous utilisons out-null, ce qui signifie simplement que nous ne voulons pas afficher le résultat de la commande.

# Import Active Directory module
Import-Module ActiveDirectory

# Open file dialog
# Load Windows Forms
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null

 

Créer la boîte de dialogue Ouvrir un fichier

Créons la boîte de dialogue d’ouverture de fichier. Vous pouvez également utiliser cet extrait pour d’autres types de fichiers – il vous suffit de modifier le filtre de la ligne 4 pour inclure le type de fichier souhaité. Ne changez rien si vous êtes sur votre .CSV !

# Create and show open file dialog
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.InitialDirectory = "C:\"
$dialog.Filter = "CSV (*.csv)| *.csv"
$dialog.ShowDialog() | Out-Null
# Get file path
$CSVFile = $dialog.FileName

 

Une fois que nous avons sélectionné un fichier dans la boîte de dialogue de fichier, il peut être référencé en appelant la variable $dialog.FileName que nous stockerons dans une variable appelée CSVFile . Voici à quoi ressemblera la boîte de dialogue d’ouverture de fichier :

Importer le contenu du fichier CSV

Nous avons trouvé le chemin du fichier, mais nous n’avons pas encore importé les données. Nous allons d’abord nous assurer que nous avons un chemin de fichier valide. Si le chemin est valide, nous importerons le fichier CSV dans la variable $CSV avec la commande Import-CSV. Si le chemin du fichier n’est pas valide, nous quitterons le script afin qu’il n’essaie pas de créer d’utilisateurs AD.

# Import file into variable
# Lets make sure the file path was valid
# If the file path is not valid, then exit the script
if ([System.IO.File]::Exists($CSVFile)) {
Write-Host "Importing CSV..."
$CSV = Import-Csv -LiteralPath "$CSVFile"
} else {
Write-Host "File path specified was not valid"
Exit
}

Itération sur les colonnes et les lignes

Nous sommes maintenant prêts à commencer à parcourir chaque ligne du fichier CSV. Pour ce faire, nous utiliserons une boucle ForEach , qui lira le CSV comme un tableau d’objets que nous utilisons pour accéder à chaque colonne de chaque ligne.

Dans cette boucle for, nous définirons chaque ligne comme « $user ». Par exemple, pour accéder à la colonne « Organizational Unit », nous y accéderions en appelant $user.’Organizational Unit’.

# Lets iterate over each line in the CSV file
foreach($user in $CSV) {
# Lets do cool stuff in this for loop
}

 

Lorsqu’il s’agit de formater plusieurs colonnes ensemble, nous pouvons envelopper des variables à l’intérieur de l’opérateur de sous-expression « $() » entre parenthèses. Par exemple, nous pourrions combiner le prénom et le nom de famille en une seule variable comme ceci :
$PrenomEtNom = « $($utilisateur.’Prénom’) $($utilisateur.’Nom’) »

Nous allons utiliser cette logique pour créer un nom d’utilisateur au format first.last basé sur les colonnes first et last name de notre CSV :
Ensuite, abordons la possibilité d’avoir un nom contenant un espace. Par exemple, « Dennis Smith JR » ou « Joe Friday III ». Ce que nous allons faire, c’est créer une variable pour contenir le prénom et le nom, puis supprimer tous les espaces avec la commande « remplacer »:
$Username = $Username.Replace( » « , «  »)

Maintenant, générons un mot de passe sécurisé BASÉ sur les informations que nous avons dans la feuille de calcul. Par exemple, créons-en un au format suivant :

[Initiale du prénom] + [Nom de famille] + [ID d’employé] + [Caractères spéciaux]

Pour les caractères spéciaux, nous pouvons simplement les définir comme « !@# ». Nous avons déjà les autres informations stockées dans notre feuille de calcul, alors générons ce mot de passe ! Pour créer un mot de passe utilisateur AD, nous devons utiliser la commande « ConvertTo-SecureString ». À l’intérieur de cela, nous allons utiliser des opérateurs de sous-expression pour combiner les différentes colonnes du fichier CSV comme ceci :

[Prénom initial] = $user.’Prénom'[0]

[Nom] = $user.’Nom’

[Identifiant de l’employé] = $user.’Identifiant de l’employé’

[Caractères spéciaux] = !@#

Puisque nous allons envelopper cela dans une citation, nous devrons utiliser un opérateur de sous-expression pour nous assurer que nous analysons correctement les données… Cela ressemblera donc à ceci :

<code# Password
$SecurePassword = ConvertTo-SecureString "$($user.'First Name'[0])$($user.'Last Name')$($user.'Employee ID')!@#" -AsPlainText -Force

Parfois, cela peut être une bonne idée de tester lorsque vous assemblez une chaîne compliquée comme celle-là. Nous pouvons tester ce code dans la console PowerShell en remplaçant « $user » par « $CSV[0] » pour référencer la première ligne de notre CSV comme indiqué ci-dessous :

<codeWrite-Host "$($CSV[0].'First Name'[0])$($CSV[0].'Last Name')$($CSV[0].'Employee ID')!@#"

Qui sort :

Phill558739!@#

C’est exactement le format dans lequel nous voulons générer le mot de passe, donc c’est bon.

Créer l’utilisateur AD

Il est maintenant temps d’exécuter la commande New-ADUser et de créer le nouveau compte utilisateur. Cela peut être une commande TRÈS longue, nous allons donc utiliser le backtick (`) pour envelopper notre commande.

# Create new user
New-ADUser -Name "$($user.'First Name') $($user.'Last Name')" `
-GivenName $user.'First Name' `
-Surname $user.'Last Name' `
-UserPrincipalName $Username `
-SamAccountName $Username `
-EmailAddress $user.'Email Address' `
-Description $user.Description `
-OfficePhone $user.'Office Phone' `
-Path "$($user.'Organizational Unit')" `
-ChangePasswordAtLogon $true `
-AccountPassword $SecurePassword `
-Enabled $true

# Write to host that we created a new user
Write-Host "Created $Username / $($user.'Email Address')"

Il ne nous reste plus qu'à ajouter une logique pour ajouter l'utilisateur à chaque groupe de s écuritéque nous avons spécifié dans le CSV. Nous pouvons le faire en divisant la colonne de groupe, puis en itérant avec une autre boucle foreach sur chaque valeur fractionnée :

# If groups is not null... then iterate over groups (if any were specified) and add user to groups
if ($User.'Add Groups (csv)' -ne "") {
$User.'Add Groups (csv)'.Split(",") | ForEach {
Add-ADGroupMember -Identity $_ -Members "$Username"
Write-Host "Added $Username to $_ group" # Log to console
}
}

 

À ce stade, nous avons juste besoin de fermer la boucle foreach, d’ajouter une invite pour mettre le script en pause avant de fermer la fenêtre (à des fins de dépannage) et nous avons terminé :

}
Read-Host -Prompt « Script complete… Press enter to exit. »

Voici le script de base, le minimum pour l’ajout en masse des utilisateurs dans votre Active Directory mais il manque quelques informations notamment le Try/Catch.

Grâce à un bloc d’instruction Try-Catch, vous allez pouvoir gérer les erreurs proprement dans vos scripts PowerShell.

Vous pouvez aller lire l’article sur It-connect sur le sujet du « Try/Catch.

Mon script ad powershell – Création d’utilisateurs, Mappage sur un lecteur pour l’utilisateur « Z »


# Import Active Directory module
Import-Module ActiveDirectory
# Open file dialog
# Load Windows Forms
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null
# Create and show open file dialog
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.InitialDirectory = $StartDir
$dialog.Filter = "CSV (*.csv)| *.csv"
$dialog.ShowDialog() | Out-Null
# Get file path
$CSVFile = $dialog.FileName
# Import file into variable
# Lets make sure the file path was valid
# If the file path is not valid, then exit the script
if ([System.IO.File]::Exists($CSVFile)) {
Write-Host "Importing CSV..."
$CSV = Import-Csv -LiteralPath "$CSVFile"
} else {
Write-Host "File path specified was not valid"
Exit
}

foreach($user in $CSV) {

try
{
$EtatService = Get-Service -Name $NomService -ErrorAction Stop
Write-Host -ForegroundColor Green "Etat du service correctement récupéré !"

# Password
$SecurePassword = ConvertTo-SecureString "$($user.'First Name'[0])$($user.'Last Name')$($user.'Employee ID')!@#" -AsPlainText -Force

# Format their username
$Username = "$($user.'First Name').$($user.'Last Name')"
$Username = $Username.Replace(" ", "")

# Create new user

New-ADUser -Name "$($user.'First Name') $($user.'Last Name')" `
-GivenName $user.'First Name' `
-Surname $user.'Last Name' `
-UserPrincipalName $Username `
-SamAccountName $Username `
-EmailAddress $user.'Email Address' `
-Description $user.Description `
-OfficePhone $user.'Office Phone' `
-Path "$($user.'Organizational Unit')" `
-ChangePasswordAtLogon $true `
-AccountPassword $SecurePassword `
-Enabled $true
# Write to host that we created a new user
Write-Host "Created $Username / $($user.'Email Address')"

}
catch
{
Write-Host $_.Exception.Message -ForegroundColor Red
}
finally
{
$Error.Clear()
}

Write-Host "Contenu des erreurs : $Error"

#Partage dossier
$share = "\\SERVADAXEPLANE\Partage perso utilisateurs\$Username"
# Home de l'utilisateur dans le profil AD

set-aduser $Username -HomeDrive "Z:" -HomeDirectory $share

# If groups is not null... then iterate over groups (if any were specified) and add user to groups
if ($User.'Add Groups (csv)' -ne "") {
$User.'Add Groups (csv)'.Split(",") | ForEach {
Add-ADGroupMember -Identity $_ -Members "$($user.'First Name').$($user.'Last Name')"
Write-Host "Added $Username to $_ group" # Log to console
}
}

# Write to host that we created the user
Write-Host "Created user $Username with groups $($User.'Add Groups (csv)')"
}
Read-Host -Prompt "Script complete... Press enter to exit."

 

N’oubliez pas d’aller lire mes articles sur Active Directory