PowerShell : Comment modifier des mots de passe dans l’Active Directory ?
I. Présentation
Lorsqu'il est nécessaire d'effectuer des opérations en lots au sein d'un annuaire Active Directory, PowerShell devient vite incontournable. Par exemple, pour modifier le mot de passe pour un utilisateur, on peut le faire en quelques clics via l'interface graphique ou en PowerShell si on trouve ça fun... Par contre, quand il s'agit d'effectuer cette modification du mot de passe sur un ensemble d'utilisateurs, PowerShell est indispensable.
Fort heureusement, Microsoft propose le module ActiveDirectory pour PowerShell et notamment le commandlet "Set-ADAccountPassword" qui permet de modifier le mot de passe.
Ensuite, différentes manières de faire comme le fait d'avoir un fichier CSV avec le login de chaque utilisateur ciblé et le mot de passe associé à chaque utilisateur ; c'est cette solution que l'on va tester. Sinon, on pourrait très bien cibler nos utilisateurs et pour chaque utilisateur générer un mot de passe, avec la création d'un fichier de sortie qui récapitule les mots de passe attribués.
II. Format du CSV
Tout simplement, ce fichier devra contenir deux colonnes : SamAccountName et Password, qui correspondent respectivement à l'identifiant de connexion de l'utilisateur et au mot de passe que l'on veut lui attribuer.
Le fichier CSV sera alors :
SamAccountName;Password alain.terieur;B0nJ0uR*50 alex.terieur;B0n$0!R*14
Note : On peut nommer les colonnes comme on le souhaite, le principal c'est que les noms soient significatifs.
III. Modifier les mots de passe AD en lot
Désormais, on va construire un petit script qui va travailler à notre place. Mais avant cela, on va s'intéresser à la syntaxe du commandlet Set-ADAccountPassword.
Voici un exemple de cette commande qui permet de modifier le mot de passe pour un utilisateur ayant pour login "florian.burnel" :
Set-ADAccountPassword -Identity florian.burnel -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "GhYjKb!M05n" -Force)
On indique donc le SamAccountName dans le paramètre "Identity", le paramètre "Reset" permet d'indiquer qu'il s'agit d'une réinitialisation du mot de passe et non d'un changement (qui impliquerait d'indiquer le mot de passe actuel via -OldPassword).
Enfin, le plus important le paramètre "NewPassword"qui permet de définir le nouveau mot de passe à attribuer à l'utilisateur. On ne peut pas envoyer des données en clair directement dans ce paramètre, il faut impérativement convertir la valeur en chaîne sécurisée via "ConvertTo-SecureString" comme dans mon exemple.
Sans plus attendre, voici le script :
#### #### Modules #### # Module PowerShell Active Directory requis Import-Module ActiveDirectory #### #### Variables #### # Controleur de domaine cible pour faire la MAJ $Server = "ADDS01" # Chemin vers le fichier CSV $fichier = "C:\Scripting\CSV\Users_Password.csv" # Importer le fichier CSV $users = Import-Csv -Path $fichier -Delimiter ";" -Encoding UTF8 # Fichier de logs nommé à la date et l'heure de l'exécution du script $DateHeure = Get-Date -Format "yyyyMMddHHmm" $log = "C:\Scripting\Logs\Script_Modification_Password_Utilisateurs_$DateHeure.log" #### #### 1 - Récupération des données dans le CSV #### # Pour chaque ligne du CSV... (Pour chaque utilisateur) foreach($user in $users){ # Récupère le SamAccountName de l'utilisateur $UserSAM = $user.SamAccountName # Récupérer le mot de passe de l'utilisateur $UserPwd = $user.Password #### #### 2 - Modifier le mot de passe de chaque utilisateur dans l'AD #### # Try-Catch permet d'exécuter une action et si elle échoue d'en faire une autre, dans ce cas précis on met à jour le mot de passe # et si ça échoue alors on écrit une ligne de log try{ Set-ADAccountPassword -Server $Server -Identity $UserSAM -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $UserPwd -Force) Add-Content -Path "$log" -Value "Le mot de passe de l'utilisateur $UserLogin est désormais à jour !" }catch{ Add-Content -Path "$log" -Value "ERREUR ! Impossible de mettre à jour le mot de passe pour l'utilisateur $UserLogin !" } }
Si vous souhaitez explorer les autres possibilités de ce commandlet, voici l'aide sur le TechNet : Set-ADAccountPassword
Bonjour,
Si on doit le faire en masse sur un ensemble de compte AD, est-il aussi possible avec Powershell de positionner le paramètre « l’utilisateur doit changer de mot de passe à la prochaine ouverture de session » ?
Hello Garand,
voici comment faire :
#Changer le mot de passe
Set-ADAccountPassword -Identity testeur -Reset -NewPassword (ConvertTo-SecureString -AsPlainText « M0t2P4$$ » -Force)
#s’assurer que le mot de passe puisse expirer sinon tu risque d’avoir une erreur powershell
Set-ADUser –Identity testeur –PasswordNeverExpires $false
#s’assurer que le mot de passe puisse etre changé sinon tu risques d’avoir les champs « changer mot de passe » et « le mot de passe doit etre changé » à true et bah tu ne pouras donc pas faire modifier ton mot de passe par l’utilisateur.
set-aduser –Identity testeur -CannotChangePassword $false
#enfin faire changer le mot de passe à l’utilisateur concerné
Set-ADUser –Identity testeur –ChangePasswordAtLogon $true
Bien entendu, on peut également scripter cela avec un fichier csv en variable et un foreach.
amicalement Bad-Hell
petite erreur de ma part les champs qui risquent de se bloquer sont « L’utilisateur devra changer son mot de passe » et « L’utilisateur ne peut pas changer de mot de passe » . voilà
Merci pour ce script tout fait. tu m’as fait gagner un bon quart d’heure 🙂
Pour info il faudra tout de même corriger les variables $UserLogin en $UserSAM pour les logs.
Bonjour,
Je souhaiterais renouveler les mots de passes de mes utilisateurs avec des exigences de complexité (12 caractères, majuscules, minuscules, chiffres, caractères spéciaux). Le script proposé ne correspond pas exactement à mon besoin et je tourne en rond depuis un moment pour essayer de l’adapter. Je ne veux pas faire de bêtises et bloquer mes utilisateurs.
Je souhaiterais donc pouvoir les modifier en lot et récupérer un fichier CSV qui contienne Le nom et le prénom, le login et le nouveau mot de passe. Est-ce possible?
Je ne veux pas que les utilisateurs choisissent eux-même leur mot de passe et puissent le modifier.
Amicalement
Bonsoir Julien,
Ce n’est pas terrible vis-à-vis du RGPD de faire ça, normalement on doit demander à l’utilisateur de changer son mot de passe à la connexion, lui-même.
Pour exporter les infos malgré tout, il y a plusieurs possibilités : écrire dans un fichier CSV (ou texte) à chaque tour de boucle pour récupérer les infos de l’utilisateur en cours, ou sinon créer un objet personnalisé en PowerShell, stocker tout cela dans un tableau et à la fin l’exporter en CSV.
Pour les mots de passe, c’est le script qui doit les générer ?
Cordialement,
Florian
Salut à toi, j’ai un besoin : changer le mot de passe de compte de service et d’aller le « mettre à jour » sur les serveurs. Vu le nombre, je cherche une façon automatiser de faire l’étape de renseigner le nouveau mot de passe sur les comptes de services.
Bonjour,
Oui je sais que ce n’est pas conforme au RGPD mais je dois pouvoir accéder aux sessions utilisateurs car certaines vieilles applications métier demandent d’être sur le compte utilisateur pour leur paramétrage. De plus je ne sais pas comment paramétrer les comptes de messagerie sur Outlook sans être sur la session utilisateur (peut-être existe-t-il un moyen…).
L’idée de ma demande étant de me servir du fichier csv pour récupérer les mots de passes et les mettre dans un coffre-fort numérique.
Pour répondre à ta question sur la génération des mot de passes, oui si le script peut les générer ça m’arrange. Avec les exigence de sécurité CNIL/ANSSI : 12 caractères, majuscules, minuscules, chiffres, caractères spéciaux
mais ce qui est important c’est que je puisse les récupérer en clair. et que les utilisateurs ne puissent pas les changer.
Bonjour Florian,
J’essaye d’utiliser votre script pour changer les mots de passe utilisateur sur le contrôleur de domaine.
Pour l’instant, j’effectue des tests avec 2 ou 3 utilisateurs fictifs créés pour l’occasion.
Mon problème est le suivant : la procédure fonctionne très bien 2 ou 3 fois de suite, puis terminé, j’ai le message :
——————————————————————————————————–
Set-ADAccountPassword : Access is denied
At line:1 char:1
+ Set-ADAccountPassword -Server DC01 -Identity apaso -Reset -NewPasswor …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (apaso:ADAccount) [Set-ADAccountPassword], Unauth
orizedAccessException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.UnauthorizedAccessException,Microsoft.
ActiveDirectory.Management.Commands.SetADAccountPassword
——————————————————————————————————-
Le compte utilisé pour effectuer ces modifications fait partie des ‘administrateurs du domaine’,
ça fait 2 jours que je cherche une solution sans y parvenir.
Auriez-vous une idée sur ce problème.
Merci pour votre aide.
Bien à vous.
Bonsoir André,
Avez-vous vérifié que votre défaut Policy de votre domaine n’interdisait pas plusieurs changement de mot de passe sur une courte période?
Bonne soirée