Active Directory : créer un utilisateur en mode interactif avec PowerShell
Sommaire
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.
Pour le choix de l'unité d'organisation, une fenêtre apparait aussi (grâce à la commande Out-GridView) :
Dans le même esprit, pour le groupe de sécurité :
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 !
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++.