Meilleur auteur de réponses
Prévenir l'utilisateur par email que son mot de passe va expirer avec un script powershell

Question
-
Bonjour,
Je suis entrain d'essayer de faire un script afin que les utilisateurs puissent être prévenus par mail, qu'il faut qu'ils changent leur mot de passe.
J'ai commencé ce script, avec l'aide d'informations sur internet, mais je rencontre des difficultés pour le faire fonctionner.
Le script est :
Import-Module ActiveDirectory
# Variables
$smtpServer = "IP du serveur"
$from = "Password@company.com"
$expireindays = 20
$maxPasswordAge = 90
$OUpath = "OU=Users,DC=company,DC=com"
$today = (get-date)
# Recherche des utilisateurs activés qui ont un mot de passe qui expire
$users = Get-ADUser -SearchBase $OUpath -Properties GivenName,mail,PasswordLastSet -Filter {(PasswordNeverExpires -eq "False") -and (Enabled -eq "True")}
foreach ($user in $users)
{
# Informations du compte utilisateur
$Name = $user.GivenName
$emailaddress = $user.mail
# Recherche en jours de la dernière modification du mot de passe
$passwordSetDate = $user.PasswordLastSet
$lastset_days = (New-TimeSpan -Start $today -End $passwordSetDate).Days
# Expire dans x jours en comparaison avec la date de modification, et la durée max autorisée
$expireson = $lastset_days + $maxPasswordAge
# Préparation du message email
$subject="IT Services : Attention, expiration du mot de passe dans $expireson jours"
$body ="
Bonjour $name,
<p> Votre mot de passe IT va être expiré dans $expireson jours.<br>
Merci de vous connecter d'ici ce délai et d'effectuer la modification du mot de passe.<br>
Au delà de ce délai, vous ne pourrez plus vous connecter et vous devrez contacter votre administrateur.
<p>Merci de votre compréhension<br>
</P>"
# Envoi du mail si l'expiration est < 20 jours
if ($expireson -lt $expireindays)
{
echo "Attention : Le compte de $Name expire bientôt ($expireson jours). Envoi d'un mail vers $emailaddress en cours"
Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -credential $smtp_credentials
}
else
{
echo "Information : Le compte de $Name expire dans $expireson jours. Aucun émail vers $emailaddress ne sera envoyé"
}
}Quand j'exécute le script, j'obtiens cela comme ereur :
Get-ADUser : Objet de l’annuaire non trouvé
Au caractère C:\Script\compte expiré.ps1:17 : 10
+ $users = Get-ADUser -SearchBase $OUpath -Properties GivenName,mail,PasswordLastS ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (:) [Get-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUserAuriez-vous une idée de ce qu'il me manquerait pour finaliser ce script ?
Merci
Sébastien
Réponses
-
- Marqué comme réponse Superseb9 lundi 15 septembre 2014 11:04
Toutes les réponses
-
Bonjour,
Je suis entrain d'essayer de faire un script afin que les utilisateurs puissent être prévenus par mail, qu'il faut qu'ils changent leur mot de passe.
J'ai commencé ce script, avec l'aide d'informations sur internet, mais je rencontre des difficultés pour le faire fonctionner.
Le script est :
Import-Module ActiveDirectory
# Variables
$smtpServer = "IP du serveur"
$from = "Password@company.com"
$expireindays = 20
$maxPasswordAge = 90
$OUpath = "OU=Users,DC=company,DC=com"
$today = (get-date)
# Recherche des utilisateurs activés qui ont un mot de passe qui expire
$users = Get-ADUser -SearchBase $OUpath -Properties GivenName,mail,PasswordLastSet -Filter {(PasswordNeverExpires -eq "False") -and (Enabled -eq "True")}
foreach ($user in $users)
{
# Informations du compte utilisateur
$Name = $user.GivenName
$emailaddress = $user.mail
# Recherche en jours de la dernière modification du mot de passe
$passwordSetDate = $user.PasswordLastSet
$lastset_days = (New-TimeSpan -Start $today -End $passwordSetDate).Days
# Expire dans x jours en comparaison avec la date de modification, et la durée max autorisée
$expireson = $lastset_days + $maxPasswordAge
# Préparation du message email
$subject="IT Services : Attention, expiration du mot de passe dans $expireson jours"
$body ="
Bonjour $name,
<p> Votre mot de passe IT va être expiré dans $expireson jours.<br>
Merci de vous connecter d'ici ce délai et d'effectuer la modification du mot de passe.<br>
Au delà de ce délai, vous ne pourrez plus vous connecter et vous devrez contacter votre administrateur.
<p>Merci de votre compréhension<br>
</P>"
# Envoi du mail si l'expiration est < 20 jours
if ($expireson -lt $expireindays)
{
echo "Attention : Le compte de $Name expire bientôt ($expireson jours). Envoi d'un mail vers $emailaddress en cours"
Send-Mailmessage -smtpServer $smtpServer -from $from -to $emailaddress -subject $subject -body $body -bodyasHTML -priority High -credential $smtp_credentials
}
else
{
echo "Information : Le compte de $Name expire dans $expireson jours. Aucun émail vers $emailaddress ne sera envoyé"
}
}Quand j'exécute le script, j'obtiens cela comme ereur :
Get-ADUser : Objet de l’annuaire non trouvé
Au caractère C:\Script\compte expiré.ps1:17 : 10
+ $users = Get-ADUser -SearchBase $OUpath -Properties GivenName,mail,PasswordLastS ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (:) [Get-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.ActiveDirectory.Management.Commands.GetADUserAuriez-vous une idée de ce qu'il me manquerait pour finaliser ce script ?
Merci
Sébastien
Bonjour,
As-tu bien remplacé cette variable avec les informations de ton AD ?
$OUpath = "OU=Users,DC=company,DC=com"
-
-
- Marqué comme réponse Superseb9 lundi 15 septembre 2014 11:04
-
-
Le script fonctionne à merveille, c'est parfait
mais pourquoi à l'exécution du script, quand l'utilisateur doit être notifié, je dois renseigner un utilisateur pour envoyer l'email ?
Inutile dans mon cas, car le serveur fait parti du connecteur de réception (HUB) Exchange qui autorise les utilisateurs anonymes.
Donc je met n'importe quoi et le mail est bien envoyé.
(Dans la console de gestion Exchange, j'ai ajouté le serveur (qui exécute ce script) au le connecteur de réception (HUB), et coché utilisateurs autorisés à envoyer : anonyme)
Je voudrai que le script s'exécute et envoie directement les emails (sans demande d’identification à chaque utilisateur qui a son mot de passe qui expire à la date prédéfinie).
Merci pour votre aide (je débute grave avec powershell, mais quelle puissance :) !)
-
Je me répond à moi même, pour envoyer l'email en anonyme (sous réserve que le connecteur Exchange le permette)
Si ça en peut aider d'autres,
# Variables anonymous (pour envoyer en tant que)
$anonUsername = "anonymous"
$anonPassword = ConvertTo-SecureString -String "anonymous" -AsPlainText -Force
$anonCredentials = New-Object System.Management.Automation.PSCredential($anonUsername,$anonPassword)et remplacer à la ligne Send-Mailmessage ....... -credential $anonCredentials
-
Bonjour Tout le monde,
Merci bcp pour le script, c'est vraiment génial, j'ai une question SVP, comment peut-on y procéder, si on veut appliquer le script sur tous les utilisateurs du domaine puisque nos comptes d'utilisateurs sont éparpillés partout?
Est ce qu'il s'agit du bon syntaxe ==> $Ldappath = "DC=company,DC=com"
Merci,