Résolu
Script envoi de mail MDP expiré
- Sébastien
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 mois 3 semaines - il y a 10 mois 2 semaines #33876
par Sébastien
Script envoi de mail MDP expiré a été créé par Sébastien
Bonjour à tous,
Je souhaite envoyer un mail quand le mot de passe d'un utilisateur AD va arriver à expiration.
J'ai trouvé mon bonheur sur le site de Metsys blog.metsys.fr/comment-ameliorer-la-comm...eur-avec-powershell/ . Après 2/3 modif pour me baser sur une OU au lieu d'un groupe et retirer la condition du format de l'adresse mail celui-ci fonctionne bien.
Sauf que chez nous, nous avons du FR et UK. Un seul mail avec les 2 langues ne convenait pas. J'ai ajouté l'attribut "preferredLanguage" qui est vide en FR et "en-GB" pour nos comptes Anglais.
Ensuite pour l'envoi de mail j'ai copié/collé la partie FR pour appeler un autre fichier html pour le mail en UK et ajouté preferredLanguage (Cela commence à la ligne 105) ne tenez pas compte du nombre de jour c'est pour mes tests.
Mais problème, le script fonctionne bien au point de vu de la langue si je change la langue de mon compte de test on voit bien les log FR ou UK, par contre aucun mail ne part.
Je n'arrive pas trop à voir ce qu'il ne va pas.
Quand je regarde la différence sur la console de sortie on vois que la cible est vide.
Je pense que quelque chose ne va pas au niveau des elseif et if de la ligne 105.
Merci de votre aide.
Je souhaite envoyer un mail quand le mot de passe d'un utilisateur AD va arriver à expiration.
J'ai trouvé mon bonheur sur le site de Metsys blog.metsys.fr/comment-ameliorer-la-comm...eur-avec-powershell/ . Après 2/3 modif pour me baser sur une OU au lieu d'un groupe et retirer la condition du format de l'adresse mail celui-ci fonctionne bien.
Sauf que chez nous, nous avons du FR et UK. Un seul mail avec les 2 langues ne convenait pas. J'ai ajouté l'attribut "preferredLanguage" qui est vide en FR et "en-GB" pour nos comptes Anglais.
Ensuite pour l'envoi de mail j'ai copié/collé la partie FR pour appeler un autre fichier html pour le mail en UK et ajouté preferredLanguage (Cela commence à la ligne 105) ne tenez pas compte du nombre de jour c'est pour mes tests.
Mais problème, le script fonctionne bien au point de vu de la langue si je change la langue de mon compte de test on voit bien les log FR ou UK, par contre aucun mail ne part.
Je n'arrive pas trop à voir ce qu'il ne va pas.
Quand je regarde la différence sur la console de sortie on vois que la cible est vide.
Je pense que quelque chose ne va pas au niveau des elseif et if de la ligne 105.
Merci de votre aide.
############################################################################
#
# Objet : Script de notification d'expiration de PWD par mail automatique
# Auteur : Hervé CZUBAK
# version : 1.0
#
#############################################################################
# Definition des variables
#le paramètre sendmail attend une réponse de type YES ou NO. Sert surtout pour les environnements d’automatisation de recette/prod comme un whatif#
param (
[Parameter(Mandatory)]
[Alias("MAIL")]
[string]$sendmail
)
#Module AD
import-module ActiveDirectory
#ScriptRoot
$RootFolder = Split-Path -Path $MyInvocation.MyCommand.Path
#Serveur SMTP
$SMTPhost = "192.168.X.X"
#port
$port = "25"
#Expediteur du mail
$FromEmail = "noreply@mondomaine.com"
#Email Sujet
$SubjectMail = "Attention, expiration mot de passe"
#Corps du mail en HTML
$encoding = [System.Text.Encoding]::UTF8
# Definition Fonction Mail
###La fonction suivante va servir pour appeler la commande d’envoi de mail
Function Mail {
[CmdletBinding(SupportsShouldProcess)]
param (
[Parameter(Mandatory)]
[string]$Usermail,
[string]$Body
)
###ici on rajoute une fonction de whatif à la commande send-mailmessage###
if ($PSCmdlet.ShouldProcess($name)) {
$encoding = [System.Text.Encoding]::UTF8
Send-MailMessage -Encoding $encoding -smtpserver $SMTPhost -Port $port -To $Usermail -Subject $SubjectMail -From $FromEmail -Body $Body -BodyAsHtml
} else {}
}
#Création du dossier et fichier de log
# Chemin du dossier à vérifier
$dossier = "C:\Script\Expiration-MDP"
# Vérifier si le dossier existe
if (Test-Path $dossier -PathType Container) {
Write-Host "Le dossier existe déjà."
} else {
# Créer le dossier s'il n'existe pas
New-Item -Path $dossier -ItemType Directory
Write-Host "Le dossier a été créé avec succès."
}
if ($sendmail -eq 'no')
{
start-transcript -path "C:\Script\Expiration-MDP\MDP-Expire.rtf"
# Obtention des utilisateurs dont la stratégie de mot de passe est appliqué (pas de récursivité de groupe > Une boucle par groupe)
foreach ($user in $(Get-ADUser -Filter * -SearchBase "OU=Users,OU=ENTREPRISE,DC=mondomaine,DC=com" | where objectClass -eq 'user').SamAccountName)
{
$ADUser=Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed, mail, givenName, userPrincipalName, PasswordNeverExpires, pwdLastSet, AccountExpirationDate, preferredLanguage
$error.clear()
try {
$ExpDate=[DateTime]::FromFileTime($ADUser.'msDS-UserPasswordExpiryTimeComputed')
$DiffDays=$(New-TimeSpan -Start $(Get-Date) -End $($ExpDate)).Days
}
catch { "Erreur variable de temps pour $user - Valeur Non traduisible - PWD n'expire pas" }
if (!$error) { }
if ($ADUser.Enabled -eq $false){
Write-Host "Le compte utilisateur $user est désactivé"
}
elseif ($ADUser.AccountExpirationDate -NE $null -AND $ADUser.accountExpiratioNDate -lt (Get-Date)){
Write-Host "Le compte utilisateur $user est arrivé à expiration"
}
elseif ($ADUser.PasswordNeverExpires)
{
write-host "Le mot de passe de $user est configuré sur 'n'expire jamais' pas d'envoi de mail'"
}
elseif ($ADUser.pwdLastSet -eq 0){
Write-Host "Le mot de passe de $user doit être changé à la prochaine connexion"
}
elseif ($ADUser.mail -eq $null) {
Write-Host "L'utilisateur $user n'a pas d'adresse e-mail"
}
elseif ($DiffDays -eq 85) { #Si égal à 15 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
elseif ($DiffDays -eq 10) { #Si égal à 10 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-10 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
elseif ( $DiffDays -lt 5 ) { #Si moins de 5 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-10 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
else {write-host "Pas de mail de rappel pour $user"}
}
Stop-Transcript
}
else{
if ($sendmail -eq 'yes')
{
start-transcript -path "C:\Script\Expiration-MDP\MDP-Expire.rtf"
# Obtention des utilisateurs dont la stratégie de mot de passe est appliqué (pas de récursivité de groupe > Une boucle par groupe) / Si groupe différent, recopier la boucle.
foreach ($user in $(Get-ADUser -Filter * -SearchBase "OU=Users,OU=ENTREPRISE,DC=mondomaine,DC=com" | where objectClass -eq 'user').SamAccountName)
{
$ADUser=Get-ADUser "$user" -Properties msDS-UserPasswordExpiryTimeComputed, mail, givenName, userPrincipalName, PasswordNeverExpires, pwdLastSet, AccountExpirationDate, preferredLanguage
$error.clear()
try {
$ExpDate=[DateTime]::FromFileTime($ADUser.'msDS-UserPasswordExpiryTimeComputed')
$DiffDays=$(New-TimeSpan -Start $(Get-Date) -End $($ExpDate)).Days
}
catch { "Erreur variable de temps pour $user - Valeur Non traduisible - PWD n'expire pas" }
if (!$error) { }
if ($ADUser.Enabled -eq $false){
Write-Host "Le compte utilisateur $user est désactivé"
}
elseif ($ADUser.AccountExpirationDate -NE $null -AND $ADUser.accountExpiratioNDate -lt (Get-Date)){
Write-Host "Le compte utilisateur $user est arrivé à expiration"
}
elseif ($ADUser.PasswordNeverExpires)
{
write-host "Le mot de passe de $user est configuré sur 'n'expire jamais' pas d'envoi de mail'"
}
elseif ($ADUser.pwdLastSet -eq 0){
Write-Host "Le mot de passe de $user doit être changé à la prochaine connexion"
}
elseif ($ADUser.mail -eq $null) {
Write-Host "L'utilisateur $user n'a pas d'adresse e-mail"
}
elseif ($DiffDays -eq 64) { #Si égal à 15 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
elseif ($DiffDays -eq 10) { #Si égal à 10 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-10 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
elseif ( $DiffDays -lt 5 ) { #Si moins de 5 jours
if ($ADUser.preferredLanguage -eq "en-GB") {
$html = Get-Content -Path "$RootFolder\template-UK.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-15 Envoi du mail de rappel (en-GB) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
} elseif ($ADUser.preferredLanguage -eq $null) {
$html = Get-Content -Path "$RootFolder\template-FR.html" -Raw
$html = $html.Replace("INSERT_GIVENNAME", $ADUser.givenName)
$html = $html.Replace("INSERT_USERPRINCIPALNAME", $ADUser.UserPrincipalName)
$html = $html.Replace("INSERT_PWDDATE", $DiffDays)
Mail -Usermail $ADUser.mail -Body $html -WhatIf
Write-Host "$user J-10 Envoi du mail de rappel (FR) à" $ADUser.mail "le mot de passe arrive à expiration dans" $DiffDays "jours, le" $(Get-Date($ExpDate) -Format "dd.MM.yyyy")
}
}
else {write-host "Pas de mail de rappel pour $user"}
}
Stop-Transcript
}
}
Dernière édition: il y a 10 mois 2 semaines par Sébastien.
Connexion ou Créer un compte pour participer à la conversation.
- Sébastien
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 mois 3 semaines #33878
par Sébastien
Réponse de Sébastien sur le sujet Script envoi de mail MDP expiré
J'ai trouvé j'ai retiré les -Whatif
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 10 mois 2 semaines - il y a 10 mois 2 semaines #33881
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Script envoi de mail MDP expiré
Hello,
Effectivement, il fallait retirer le -Whatif. Ce commutateur (paramètre que l'on met ou qu'on ne met pas) permet de simuler l'action sans la faire.
Celui-ci fait partie des paramètres communs de PowerShell.
Pour en savoir plus, tapes la commande :
Si tu n'as pas mis à jour l'aide de PowerShell, voici le lien vers l'aide : learn.microsoft.com/fr-fr/powershell/mod...out_commonparameters
Arnaud
Effectivement, il fallait retirer le -Whatif. Ce commutateur (paramètre que l'on met ou qu'on ne met pas) permet de simuler l'action sans la faire.
Celui-ci fait partie des paramètres communs de PowerShell.
Pour en savoir plus, tapes la commande :
# Cette commande nécessite que l'aide soit installée sur ta machine
Help about_CommonParameters
Si tu n'as pas mis à jour l'aide de PowerShell, voici le lien vers l'aide : learn.microsoft.com/fr-fr/powershell/mod...out_commonparameters
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Dernière édition: il y a 10 mois 2 semaines par Arnaud Petitjean. Raison: Elaboration de la réponse
Connexion ou Créer un compte pour participer à la conversation.
- Sébastien
- Auteur du sujet
- Hors Ligne
- Membre senior
Réduire
Plus d'informations
- Messages : 43
- Remerciements reçus 0
il y a 10 mois 2 semaines #33884
par Sébastien
Réponse de Sébastien sur le sujet Script envoi de mail MDP expiré
Salut,
Merci pour les explications.
Merci pour les explications.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
- Hors Ligne
- Modérateur
il y a 10 mois 2 semaines #33895
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Script envoi de mail MDP expiré
Je t'en prie !
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.112 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- Script envoi de mail MDP expiré