24/11/2024

Active Directory : créer un utilisateur en mode interactif avec PowerShell

I. Présentation

Après avoir vu comment créer des comptes utilisateurs avec New-ADUser, mais aussi comment créer des comptes en masse dans l'Active Directory à partir d'un fichier CSV source, nous allons voir une autre méthode plus interactive. En effet, nous allons réaliser un script qui va permettre de créer un utilisateur dans l'Active Directory en saisissant les informations (nom, prénom, login, mot de passe, etc...) directement dans la console PowerShell.

Nous allons réutiliser les variables du précédent chapitre, sauf que cette fois-ci, les données ne seront pas issues d'un fichier CSV. Ce qui donne :

$UtilisateurPrenom = Prénom
$UtilisateurNom = Nom
$UtilisateurLogin = Identifiant de connexion
$UtilisateurEmail = Adresse e-mail
$UtilisateurMotDePasse = Mot de passe
$UtilisateurFonction = Fonction

En complément, nous allons ajouter deux champs pour mettre de sélectionner de manière interactive :

  • L'unité d'organisation dans laquelle placer cet utilisateur
  • Le ou les groupes de sécurité dans lesquels ajouter ce nouvel utilisateur

II. Créer le formulaire de création d'un compte

Dans notre script, nous allons créer un formulaire de création de compte Active Directory puisque nous allons poser différentes questions afin que des informations soient saisies : nom, prénom, mot de passe, etc...

Commençons par le prénom, le nom et le login. On utilise la méthode "Read-Host" qui autorise la saisie d'informations dans la console PowerShell. Le paramètre "-Prompt" sert à indiquer le texte qui s'affiche dans la console. On aurait pu mettre "Quel est le prénom de l'utilisateur ?", si l'on veut fonctionner par des questions.

$UtilisateurPrenom = Read-Host -Prompt "Prénom"
$UtilisateurNom = Read-Host -Prompt "Nom"
$UtilisateurLogin = Read-Host -Prompt "Identifiant"

Ainsi, la commande "Read-Host -Prompt "Prénom"" va stocker la saisie de l'utilisateur dans la variable "$UtilisateurPrenom". Vous pouvez ajouter autant de variables que nécessaires sur ce principe, selon les champs à compléter dans l'Active Directory. Par exemple, on peut ajouter l'e-mail et la fonction :

$UtilisateurEmail = Read-Host -Prompt "Adresse e-mail"
$UtilisateurFonction = Read-Host -Prompt "Fonction"

Petite particularité avec le mot de passe que l'on va stocker directement sous la forme d'une chaîne sécurisée (SecureString) plutôt que d'effectuer une saisie en clair dans la console. Ainsi, on ajoute le paramètre "-SecureString", comme ceci :

$UtilisateurMotDePasse = Read-Host -Prompt "Mot de passe" -AsSecureString

Maintenant, on va s'intéresser à la sélection de l'OU. L'objectif étant d'avoir une liste des OUs de l'AD à l'écran et de pouvoir choisir celle dans laquelle on souhaite ajouter l'utilisateur. Pour cela, on va utiliser :

  • Le cmdlet "Get-ADOrganizationalUnit" pour lister les unités d'organisation de l'Active Directory
  • Le cmdlet "Out-GridView" et le paramètre "-PassThru" pour afficher la liste des OUs et permettre la sélection

Ce qui donne :

$UtilisateurOU = (Get-ADOrganizationalUnit -Filter *).DistinguishedName | Out-GridView -Title "Choisissez une OU pour cet utilisateur" -PassThru

La valeur "DistinguishedName" correspondante à l'unité d'organisation  choisie sera ajoutée à la variable $UtilisateurOU.

Sur le même principe, nous allons permettre la sélection d'un ou plusieurs groupes de sécurité dans lesquels on souhaite ajouter notre utilisateur. Plutôt que de remonter tous les groupes AD (pas question de l'ajouter dans le groupe "Admins du domaine"), on va remonter uniquement les groupes répondants à un filtre spécifique. Dans cet exemple, je cible une racine spécifique qui contient les groupes de sécurité destinés à mes utilisateurs.

$UtilisateurGroupes = (Get-ADGroup -Filter * -SearchBase "OU=Organisation,OU=Groupes,DC=it-connect,DC=local").Name | Out-GridView -Title "Choisissez un ou plusieurs groupes pour cet utilisateur" -PassThru

Au final, pour notre formulaire, cela donne :

Write-Host "# Création d'un utilisateur dans le domaine $((Get-ADDomain).DNSRoot)" -ForegroundColor Cyan
Write-Host "# Veuillez renseigner les différents champs ci-dessous" -ForegroundColor Cyan
$UtilisateurPrenom = Read-Host -Prompt "Prénom" 
$UtilisateurNom = Read-Host -Prompt "Nom"
$UtilisateurLogin = Read-Host -Prompt "Identifiant"
$UtilisateurMotDePasse = Read-Host -Prompt "Mot de passe" -AsSecureString
$UtilisateurEmail = Read-Host -Prompt "Adresse e-mail"
$UtilisateurFonction = Read-Host -Prompt "Fonction"
$UtilisateurOU = (Get-ADOrganizationalUnit -Filter *).DistinguishedName | Out-GridView -Title "Choisissez une OU pour cet utilisateur" -PassThru
$UtilisateurGroupes = (Get-ADGroup -Filter * -SearchBase "OU=Organisation,OU=Groupes,DC=it-connect,DC=local").Name | Out-GridView -Title "Choisissez un ou plusieurs groupes pour cet utilisateur" -PassThru
Write-Host "# Formulaire complété, le compte va être créé dans l'Active Directory..." -ForegroundColor Cyan

Ensuite, nous n'avons plus qu'à créer l'utilisateur s'il n'existe pas déjà. Pour cela, on reprend le même principe que dans le chapitre précédent, en ajoutant la variable $UtilisateurOU pour indiquer l'OU sélectionnée via le formulaire. Le mot de passe est également ajouté directement via le nom de la variable car c'est déjà une SecureString.

# Vérifier la présence de l'utilisateur dans l'AD
if (Get-ADUser -Filter {SamAccountName -eq $UtilisateurLogin})
{
    Write-Warning "L'identifiant $UtilisateurLogin existe déjà dans l'AD"
}
else
{
    New-ADUser -Name "$UtilisateurNom $UtilisateurPrenom" `
               -DisplayName "$UtilisateurNom $UtilisateurPrenom" `
               -GivenName $UtilisateurPrenom `
               -Surname $UtilisateurNom `
               -SamAccountName $UtilisateurLogin `
               -UserPrincipalName "$UtilisateurLogin@$((Get-ADDomain).DNSRoot)" `
               -EmailAddress $UtilisateurEmail `
               -Title $UtilisateurFonction `
               -Path $UtilisateurOU `
               -AccountPassword $UtilisateurMotDePasse `
               -ChangePasswordAtLogon $true `
               -Enabled $true

    Write-Host "# Création de l'utilisateur pour $UtilisateurNom $UtilisateurPrenom : $UtilisateurLogin" -ForegroundColor Cyan
}

A partir de là, l'utilisateur devrait être créé dans l'Active Directory. Il nous reste à traiter l'ajout dans les groupes de sécurité. On le fait dans un second temps, car l'utilisateur doit exister mais aussi car il faut faire une boucle afin de traiter les groupes un par un (indispensable s'il y a plusieurs groupes sélectionnés). Une boucle "Foreach" fera l'affaire :

Foreach($Groupe in $UtilisateurGroupes){
   Write-Host "# L'utilisateur $UtilisateurLogin va être ajouté au groupe $Groupe" -ForegroundColor Cyan
   Add-ADGroupMember -Identity $Groupe -Members $UtilisateurLogin
}

Nous allons pouvoir passer à la phase de test.

III. Créer un compte AD en mode interactif

Pour tester, il suffit d'exécuter le script et de compléter les étapes une par une. Lorsque c'est l'étape du mot de passe, une fenêtre apparaît à l'écran. C'est logique car c'est une SecureString.

PowerShell - Read-Host Mot de passe

Pour le choix de l'unité d'organisation, une fenêtre apparait aussi (grâce à la commande Out-GridView) :

PowerShell - Selectionner OU avec Out-GridView

Dans le même esprit, pour le groupe de sécurité :

PowerShell - Sélection des groupes avec Out-GridView

Au final, l'utilisateur est créé dans l'annuaire Active Directory avec des valeurs conformes à la saisie dans le formulaire, dans la bonne OU et dans les bons groupes de sécurité !

L'inconvénient de cette méthode, c'est qu'il est possible de laisser un champ vide ! Toutefois, si l'on crée un compte AD sans identifiant, cela va poser problème...! Le cmdlet Read-Host n'intègre pas d'option pour rendre obligatoire la valeur (comme mandatory pour un paramètre). On peut tricher en ajoutant une boucle Do-While sur chaque champ du formulaire afin de boucler sur "la question" tant que la valeur est vide. Voici un exemple pour le prénom et le nom :

Do{ $UtilisateurPrenom = Read-Host -Prompt "Prénom" }While($UtilisateurPrenom -eq "")
Do{ $UtilisateurNom = Read-Host -Prompt "Nom" }While($UtilisateurNom -eq "")

Vous êtes désormais capable de créer un compte Active Directory en mode interactif avec PowerShell ! Libre à vous d'améliorer ce bout de code à votre convenance !

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “Active Directory : créer un utilisateur en mode interactif avec PowerShell

  • Pour éviter l’affichage de caractères bizarres à la place des lettres accentuées, ou non-ASCII, il faut sauvegarder les fichiers avec un encodage UTF8-BOM. Le BOM ou « byte-order-mark » utilise les premiers octets du fichier pour spécifier le type d’encodage UTF8. Ce paramètre est disponible dans le menu « Encodage » de NotePad++.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.