Home  Tutorials  Powershell


Réinitialiser le mot de passe d'un utilisateur AD avec une chaîne aléatoire (FR)

Afin d'assurer une meilleure gestion de réinitialisation de mot de comptes utilisateurs Active Directory, ce script a été développé pour générer automatiquement un mot de passe aléatoire et le définir comme le nouveau mot de passe pour un compte d'utilisateur. Le nouveau mot de passe du compte utilisateur sera fourni dans le cadre d'une interface résumant l'action effectuée et une notification par e-mail envoyé à l'utilisateur qui a lancé la réinitialisation du mot de passe.

Pour générer un mot de passe aléatoire, ce script est basé sur l'utilisation d'un autre script PowerShell qui a été développé par Bill Stewart. Ce script doit être téléchargé pour être dans le même dossier le script suivant sera.

Remarque: La complexité du mot de passe généré peut être modifiée en mettant à jour les paramètres utilisés pour appeler le script Get-RandomString.ps1.

Avant d'utiliser le script, vous devez mettre à jour les variables suivantes:
  • $adPath: Mettez à jour le nom distinctif pour être celui du domaine Active Directory que vous utilise
  • $domaindnsname: Spécifiez le nom DNS du domaine que vous utilise
  • $DomainNetbiosName: Spécifiez le nom NetBIOS du domaine que vous utilise
  • $smtpserver: Spécifiez le nom DNS du serveur SMTP à utiliser pour envoyer des notifications par e-mail
  • $noreplymail: Indiquez l'adresse SMTP à utiliser pour envoyer des notifications par e-mail


PowerShell

____________________________________________________________________________
###############################################################
# ADPassword_reset_v1.0.ps1
# Version 1.0
# MALEK Ahmed - 04 / 03 / 2013
###################

##################
#--------Config
##################

$adPath="LDAP://DC=contoso,DC=msft"
$domaindnsname="contoso.msft"
$domainnetbiosname="CONTOSO"
$smtpserver="mail.contoso.msft"
$noreplymail="no-reply@contoso.msft"

##################
#--------Function
##################

FunctionSet-AdUserPwd
{
Param(
[string]$user,
[string]$pwd
)#end param
$oUser= [adsi]"LDAP://$user"
$ouser.psbase.invoke("SetPassword",$pwd)
$ouser.psbase.CommitChanges()
}# end function Set-AdUserPwd

##################
#--------Main
##################

cls
#Prompting the user to enter the variables
#Determine if the user is external or not

$usernameAD= ([Environment]::UserDomainName).ToString() + "\" + ([Environment]::UserName).ToString()
#Reads the User samaccountname
$samaccountname=Read-Host'What is the user samaccountname?'
#Define the User Password
$password= .\Get-RandomString.ps1 -Length 8 -LowerCase:$FALSE -Numbers:$TRUE -UpperCase:$TRUE
#Doing the password reset
import-module activedirectory
#Identify the creator e-mail address
$User= get-aduser ([Environment]::UserName).ToString() -Properties Mail
$accountcreator=$User.mail
#LDAP connection
$objDomain=New-ObjectSystem.DirectoryServices.DirectoryEntry($adPath)
#Doing an LDAP search
$ObjSearch=New-ObjectSystem.DirectoryServices.DirectorySearcher($ObjDomain)
$ObjSearch.PageSize= 60000
#Filtering user accounts based on their samaccountname
$ObjSearch.Filter="(&(objectCategory=person)(objectClass=user)(samaccountname="+$samaccountname+"))"
$allSearchResult=$ObjSearch.FindAll()
if($allSearchResult.Count -eq 0)
{
   $errormessagesamaccountname="The is no such login in "+$domaindnsname+" domain, please try another one!"
   $samaccountname=Read-Host$errormessagesamaccountname
   $ObjSearch.Filter="(&(objectCategory=person)(objectClass=user)(samaccountname="+$samaccountname+"))"
   $allSearchResult=$ObjSearch.FindAll()
   while ($allSearchResult.Count -eq 0)
   {
      $samaccountname=Read-Host$errormessagesamaccountname
      $ObjSearch.Filter="(&(objectCategory=person)(objectClass=user)(samaccountname="+$samaccountname+"))"
      $allSearchResult=$ObjSearch.FindAll()
   }
   foreach($objSearchResultin$allSearchResult)
   {
      $objUser=New-ObjectSystem.DirectoryServices.DirectoryEntry($objSearchResult.Path)
      $test1=$Error.Count
      Set-AdUserPwd -user$objUser.distinguishedname -pwd$password
      $test2=$Error.Count
      if($test1-eq$test2)
      {
         $passwordreset=$true
      }
      else
      {
         $passwordreset=$false
      }
   }
}
else
{
   foreach($objSearchResultin$allSearchResult)
   {
      $objUser=New-ObjectSystem.DirectoryServices.DirectoryEntry($objSearchResult.Path)
      $test1=$Error.Count
      Set-AdUserPwd -user$objUser.distinguishedname -pwd$password
      $test2 =$Error.Count
      if($test1-eq$test2)
      {
         $passwordreset=$true
      }
      else
      {
         $passwordreset=$false
      }
   }
}

#Notification
$wshShell=new-object–comobject “wscript.shell”
if($passwordreset)
{
   $wshShell.Popup("The password reset for "+$domainnetbiosname+"\" + $samaccountname+ " was done successfully. The new password is" + $password + "", 0, "[SUCCESS] The password reset for" + $domainnetbiosname + "\" + $samaccountname + "was done successfully", 48);
   $mailbody="AD Login = "+$domainnetbiosname+"\" + $samaccountname + "`r`n`r`n"
   $mailbody+="Password = "+$password+"`r`n`r`n"
   $mailbody+="The password reset was done by "+$usernameAD
   #Notification about the script execution
   $msg=new-objectNet.Mail.MailMessage
   $smtp=new-objectNet.Mail.SmtpClient($smtpServer)
   $msg.From=$noreplymail
   $msg.To.Add($accountcreator)
   $msg.Subject ="[SUCCESS] The password reset for "+$domainnetbiosname+"\" + $samaccountname + "was done successfully"
   $msg.Body =$mailbody
   $smtp.Send($msg)
}
else
{
   $wshShell.Popup("The password reset for "+$domainnetbiosname+"\" + $samaccountname + "was not done successfully", 0, "[ERROR] The password reset for" + $domainnetbiosname + "\" + $samaccountname + "was not done successfully", 48);
   $mailbody="AD Login = "+$domainnetbiosname+"\" + $samaccountname + "`r`n`r`n"
   $mailbody+="`r`n`r`n"
   $mailbody+= "The error occured when doing the password reset will be checked by the Centralized Infrastructure Team!`r`n`r`n"
   $mailbody+="Debugging [Centralized Infra]: samaccountname: "+$samaccountname+"`r`n`r`n"
   $mailbody+="The password reset was done by "+$usernameAD
   #Notification about the script execution
   $msg=new-objectNet.Mail.MailMessage
   $smtp=new-objectNet.Mail.SmtpClient($smtpServer)
   $msg.From=$noreplymail
   $msg.To.Add($accountcreator)
   $msg.Subject ="[ERROR] The password reset for "+$domainnetbiosname+"\" + $samaccountname + "was not done successfully"
   $msg.Body =$mailbody
   $smtp.Send($msg)
}