florianburnel / PowerShell

57 stars 42 forks source link

Problème sur modification champ ldap UserPrincipalName #6

Open sebfun opened 1 year ago

sebfun commented 1 year ago

Bonjour

Dans le code si je modifie UserPrincipalName par sAMAccountName partout où cela est indiqué, le mail ne part plus Je voulais rendre plus clair l'affichage car les utilisateurs ne comprennent pas d'avoir dans le login login.nom_de_domaine.local au lieu de login Dans le code j'ai donc remplacé à ces endroits [Parameter(Mandatory=$true)][string]$SendMailUsersAMAccountName, $UsersInfos = Get-ADUser -Filter { (Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} –Properties "DisplayName", "mail", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "GivenName", "Surname","mail", "sAMAccountName", "msDS-UserPasswordExpiryTimeComputed" $UserObj | Add-Member -Type NoteProperty -Name sAMAccountName -Value $User.sAMAccountName Send-MailMessageForUser -SendMailUserGivenName $User.GivenName -SendMailUserSurname $User.Surname -SendMailUserEmail $User.mail

-SendMailUsersAMAccountName $User.sAMAccountName -SendMailUserPasswordExpirationDate ($UserPasswordExpirationDate).ToString('d MMMM yyyy')

Je précise qu'avant la modification cela fonctionne parfaitement sur Office365 Merci d'avance

copysolo commented 1 year ago

C'est possible d'avoir ton schéma complet du scripte stp ?

sebfun commented 1 year ago

Bonjour Et voici

<# .SYNOPSIS Envoyer une notification par e-mail aux utilisateurs dont le mot de passe expire dans X jours

.EXAMPLE .\Send-ADPasswordExpirationNotifications.ps1

.INPUTS .OUTPUTS .NOTES NAME: Send-ADPasswordExpirationNotifications.ps1 AUTHOR: Florian Burnel EMAIL: florian.burnel@it-connect.fr VERSION HISTORY: 1.0 29/09/2022

>

Variables modifiables

Nombre de jours avant l'expiration pour envoyer la notification

$DateThreshold = 14

Serveur SMTP - Nom du serveur

$SMTPServer = "xxxxx.mail.protection.outlook.com"

Serveur SMTP - Numéro de port

$SMTPPort = 25

Serveur SMTP - Adresse e-mail de l'expéditeur

$SMTPSender = xxxxxx"

Serveur SMTP - Encodage Email

$SMTPEncoding =[System.Text.Encoding]::UTF8

Envoyer une synthèse aux administrateurs

[boolean]$SendReportAdmin = $true

Adresse e-mail du destinataire pour la synthèse

$SendReportAdminEmail = "xxxxxxx"

Fonctions

Function Send-MailMessageForUser{ <# .SYNOPSIS : Envoyer une notification à un utilisateur dont le mot de passe expire dans X jours (selon seuil)

>

Param([Parameter(Mandatory=$true)][string]$SendMailUserGivenName,
      [Parameter(Mandatory=$true)][string]$SendMailUserSurname,
      [Parameter(Mandatory=$true)][string]$SendMailUserEmail,
      [Parameter(Mandatory=$true)][string]$SendMailUsersAMAccountName,
      [Parameter(Mandatory=$true)][string]$SendMailUserPasswordExpirationDate)

# Corps de l'email pour les utilisateurs
$SendMailBody=@"

Ce message est généré automatiquement mais vous pouvez y répondre

Bonjour $SendMailUserGivenName,

Dans moins de $DateThreshold jours, le mot de passe de votre compte Windows $SendMailUserPrincipalName va expirer.
Pensez à le changer avant qu'il n'arrive à expiration (date d'expiration : $SendMailUserPasswordExpirationDate)

Si vous avez un souci, répondez à ce mail en décrivant votre problème

Cordialement,

xxxxx

"@

# Objet de l'e-mail pour les utilisateurs
$SendMailObject="$SendMailUserGivenName $SendMailUserSurname : votre mot de passe arrive à expiration !"

# Envoyer l'e-mail
Send-MailMessage -Verbose -SmtpServer $SMTPServer -Encoding $SMTPEncoding  `
    -From $SMTPSender -To $SendMailUserEmail `
    -Subject $SendMailObject `
    -Body $SendMailBody -BodyAsHtml -Port $SMTPPort

}

Variables

Date du jour (format FileTime)

$DateToday = (Get-Date).ToFileTime()

Date de référence (date du jour + nombre jours avant expiration pour la notification)

$DateWithThreshold = (Get-Date).AddDays($DateThreshold).ToFileTime()

Liste des utilisateurs Active Directory

$UsersInfos = Get-ADUser -Filter { (Enabled -eq $True) -and (PasswordNeverExpires -eq $False)} –Properties "DisplayName", "mail", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "GivenName", "Surname","mail", "sAMAccountName", "msDS-UserPasswordExpiryTimeComputed"

Initialiser l'objet avec la liste des utilisateurs

$UsersNotifList=@()

Traiter chaque utilisateur

Foreach($User in $UsersInfos){

if(($User."msDS-UserPasswordExpiryTimeComputed" -lt $DateWithThreshold) -and ($User."msDS-UserPasswordExpiryTimeComputed" -gt $DateToday)){

        $UserPasswordExpirationDate = [datetime]::FromFileTime($User."msDS-UserPasswordExpiryTimeComputed")
        $UserObj = New-Object System.Object
        $UserObj | Add-Member -Type NoteProperty -Name GivenName -Value $User.GivenName
        $UserObj | Add-Member -Type NoteProperty -Name Surname -Value $User.Surname
        $UserObj | Add-Member -Type NoteProperty -Name Email -Value $User.mail
        $UserObj | Add-Member -Type NoteProperty -Name sAMAccountName -Value $User.sAMAccountName
        $UserObj | Add-Member -Type NoteProperty -Name PasswordExpirationDate -Value ($UserPasswordExpirationDate).ToString('dd/MM/yyyy')

        $UsersNotifList+=$UserObj

        Send-MailMessageForUser -SendMailUserGivenName $User.GivenName -SendMailUserSurname $User.Surname -SendMailUserEmail $User.mail `
                                -SendMailUsersAMAccountName $User.sAMAccountName -SendMailUserPasswordExpirationDate ($UserPasswordExpirationDate).ToString('d MMMM yyyy')
}

}

Faut-il envoyer une synthèse aux administrateurs ?

if(($SendReportAdmin -eq $true) -and ($UsersNotifList.Count -ne 0)){

# Corps de l'e-mail (sous la forme d'un tableau)
$SendMailAdminBody = $UsersNotifList | ConvertTo-HTML -PreContent "Bonjour,<br><p>Voici la liste des comptes Active Directory dont le mot de passe expire dans moins de $DateThreshold jours.</p>" | Out-String | ForEach-Object{
                                $_  -replace "<table>","<table style='border: 1px solid;'>" `
                                    -replace "<th>","<th style='border: 1px solid; padding: 5px; background-color:#014B83; color:#fff;'>" `
                                    -replace "<td>","<td style='padding: 10px;'>"
                                }

# Envoyer l'e-mail
Send-MailMessage -Verbose -SmtpServer $SMTPServer -Encoding $SMTPEncoding  `
    -From $SMTPSender -To $SendReportAdminEmail `
    -Subject "Synthèse - Expiration des mots de passe AD - $(Get-Date -Format dd/MM/yyyy)" `
    -Body $SendMailAdminBody -BodyAsHtml -UseSsl -Port $SMTPPort

}

copysolo commented 1 year ago

Super je te remercie :D

sebfun commented 1 year ago

j'ai pensé peut être que cela pouvait être lié avec la balise gras ou les apostrophes dans le corps de mail