none
Prévenir l'utilisateur par email que son mot de passe va expirer avec un script powershell RRS feed

  • 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 &ecirctre expir&eacute dans $expireson jours.<br>
        Merci de vous connecter d'ici ce d&eacutelai et d'effectuer la modification du mot de passe.<br>

        Au del&agrave de ce d&eacutelai, vous ne pourrez plus vous connecter et vous devrez contacter votre administrateur.
        <p>Merci de votre compr&eacutehension<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.GetADUser

    Auriez-vous une idée de ce qu'il me manquerait pour finaliser ce script ?

    Merci


    Sébastien

    vendredi 12 septembre 2014 12:57

Réponses

  • Oui,

    OU, j'ai mis l'OU Users

    et DC et DC j'ai bien mis les renseignements.


    Sébastien

    Users n'est pas une OU mais un container.

    Essaie avec :

    CN=Users,DC=TonDomaine,DC=TopLevelDomain


    Blog
    Scripts

    • Marqué comme réponse Superseb9 lundi 15 septembre 2014 11:04
    vendredi 12 septembre 2014 19:10

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 &ecirctre expir&eacute dans $expireson jours.<br>
        Merci de vous connecter d'ici ce d&eacutelai et d'effectuer la modification du mot de passe.<br>

        Au del&agrave de ce d&eacutelai, vous ne pourrez plus vous connecter et vous devrez contacter votre administrateur.
        <p>Merci de votre compr&eacutehension<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.GetADUser

    Auriez-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" 


    Blog
    Scripts

    vendredi 12 septembre 2014 14:13
  • Oui,

    OU, j'ai mis l'OU Users

    et DC et DC j'ai bien mis les renseignements.


    Sébastien

    vendredi 12 septembre 2014 14:20
  • Oui,

    OU, j'ai mis l'OU Users

    et DC et DC j'ai bien mis les renseignements.


    Sébastien

    Users n'est pas une OU mais un container.

    Essaie avec :

    CN=Users,DC=TonDomaine,DC=TopLevelDomain


    Blog
    Scripts

    • Marqué comme réponse Superseb9 lundi 15 septembre 2014 11:04
    vendredi 12 septembre 2014 19:10
  • Merci,Le problème était bien là!!


    Sébastien

    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 :) !)

    mardi 12 janvier 2016 17:34
  • 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


    mercredi 13 janvier 2016 13:29
  • 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,

    jeudi 14 avril 2016 11:24