none
notifier par email les managers des comptes AD qui vont expirer RRS feed

  • Question

  • Bonjour, 

    J'aimerais notifier les managers des utilisateurs pour qui leur compte AD va expirer dans 5 jours.

    Le script fonctionne, sauf pour la partie de création des logs à la fin du script. J'ai une erreur :

    Else : Le terme «Else» n'est pas reconnu comme nom d'applet de commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un 
    chemin d'accès existe, vérifiez que le chemin d'accès est correct et réessayez.
    Au caractère C:\NotificationAD\testnotifmanager.ps1:99 : 2
    +  Else
    +  ~~~~
        + CategoryInfo          : ObjectNotFound: (Else:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

    Voici le script :

     
    #VARs
     
    #SMTP Host
    $SMTPHost = "192.168.0.1"
    #Who is the e-mail from
    $FromEmail = "helpdesk@.domaincom"
     
    #Program File Path
    $DirPath = "C:\NotificationAD\AccountExpiry"
     
    $Date = Get-Date
    #Check if program dir is present
    $DirPathCheck = Test-Path -Path $DirPath
    If (!($DirPathCheck))
    {
     Try
     {
     #If not present then create the dir
     New-Item -ItemType Directory $DirPath -Force
     }
     Catch
     {
     $_ | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
    }
    #CredObj path
    $CredObj = ($DirPath + "\" + "EmailExpiry.cred")
    #Check if CredObj is present
    $CredObjCheck = Test-Path -Path $CredObj
    If (!($CredObjCheck))
    {
     "$Date - INFO: creating cred object" | Out-File ($DirPath + "\" + "Log.txt") -Append
     #If not present get office 365 cred to save and store
     $Credential = Get-Credential -Message "Please enter your Office 365 credential that you will use to send e-mail from $FromEmail. If you are not using the account $FromEmail make sure this account has 'Send As' rights on $FromEmail."
     #Export cred obj
     $Credential | Export-CliXml -Path $CredObj
    }
     
    Write-Host "Importing Cred object..." -ForegroundColor Yellow
    $Cred = (Import-CliXml -Path $CredObj)
     
     
    	#Get the start date, which defaults to today, and the end date which is based off the start date
    	$startDate = Get-Date
    	$endDate = $startDate.AddDays(5)
    
    	#Query AD for all the accounts between our dates and request for a couple additional properties
    	$Users = Get-ADUser -Filter {AccountExpirationDate -gt $startDate -and AccountExpirationDate -lt $endDate} -Properties AccountExpirationDate, Manager
    	#$Expireson = $startDate + $endDate 
    	
    	#Loop through the query results
    	Foreach($User in $Users)
        {
    		
    		#The $User.Manager is not a email address, but a Distinguished Name; to get the email we can pass it to Get-Aduser though
    		$Manager = Get-ADUser $User.Manager -Properties EmailAddress
    		#$ManagerEmail = $Manager.EmailAddress
    #pour tester:
    		$ManagerEmail = "monadresse@mail.com"
    	 
    	 $SmtpClient = new-object system.net.mail.smtpClient
    	 $MailMessage = New-Object system.net.mail.mailmessage
     
     #Who is the e-mail sent from
     $mailmessage.From = $FromEmail
     #SMTP server to send email
     $SmtpClient.Host = $SMTPHost
     #SMTP SSL
     $SMTPClient.EnableSsl = $false
     #SMTP credentials
     $SMTPClient.Credentials = $cred
     #Send e-mail to the users email
     $mailmessage.To.add("$ManagerEmail")
     #Email subject
     $mailmessage.Subject = "Le compte de $($User.Name) expire le $expiresonFR "
     #Notification email on delivery / failure
     $MailMessage.DeliveryNotificationOptions = ("onFailure")
     #Send e-mail with high priority
     $MailMessage.Priority = "High"
     #Formatage de la date en format FR
     $expiresonFR = get-date $User.AccountExpirationDate -Format 'dd/MM/yyyy'
     $mailmessage.IsBodyHtml = $true
     $mailmessage.Body =
     "<p>Bonjour,</p>
    Le compte de $($User.Name) expire le $expiresonFR"
    
    
     #Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Try
     {
     $smtpclient.Send($mailmessage) 
     }
     Catch
     {
     $_ | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
     } 
     Else
     {
     "$Date - INFO: Password for $User not expiring for $expiresonFR days" | Out-File ($DirPath + "\" + "Log.txt") -Append
     Write-Host "Account for $User.Name does not expire for $expiresonFR days" -ForegroundColor White
     }
     

    Pourriez-vous m'aider à comprendre pourquoi else n'est pas reconnu ? 

    Merci




    • Modifié fafabien mercredi 13 novembre 2019 17:46
    mercredi 13 novembre 2019 17:41

Toutes les réponses

  • Ton Else fait référence à quoi car la il suit un foreach. Le if précédent est déja fermé depuis longtemps:

    mercredi 13 novembre 2019 18:02
  • en fait à la base je souhaite juste créer un fichier de log de la même manière que ce script le fait :

    <# .NOTES =========================================================================== Created on: 3/27/2018 7:37 PM Created by: Bradley Wyatt Version: 1.0.0 Notes: The variables you should change are the SMTP Host, From Email and Expireindays. I suggest keeping the DirPath SMTPHOST: The smtp host it will use to send mail FromEmail: Who the script will send the e-mail from ExpireInDays: Amount of days before a password is set to expire it will look for, in my example I have 7. Any password that will expire in 7 days or less will start sending an email notification Run the script manually first as it will ask for credentials to send email and then safely store them for future use. =========================================================================== .DESCRIPTION This script will send an e-mail notification to users where their password is set to expire soon. It includes step by step directions for them to change it on their own. It will look for the users e-mail address in the emailaddress attribute and if it's empty it will use the proxyaddress attribute as a fail back. The script will log each run at $DirPath\log.txt #> #VARs #SMTP Host $SMTPHost = "192.168.0.1" #Who is the e-mail from $FromEmail = "helpdesk@mail.com" #Password expiry days $expireindays = 7 #Program File Path $DirPath = "C:\NotificationAD\PasswordExpiry" $Date = Get-Date #Check if program dir is present $DirPathCheck = Test-Path -Path $DirPath If (!($DirPathCheck)) { Try { #If not present then create the dir New-Item -ItemType Directory $DirPath -Force } Catch { $_ | Out-File ($DirPath + "\" + "Log.txt") -Append } } #CredObj path $CredObj = ($DirPath + "\" + "EmailExpiry.cred") #Check if CredObj is present $CredObjCheck = Test-Path -Path $CredObj If (!($CredObjCheck)) { "$Date - INFO: creating cred object" | Out-File ($DirPath + "\" + "Log.txt") -Append #If not present get office 365 cred to save and store $Credential = Get-Credential -Message "Please enter your Office 365 credential that you will use to send e-mail from $FromEmail. If you are not using the account $FromEmail make sure this account has 'Send As' rights on $FromEmail." #Export cred obj $Credential | Export-CliXml -Path $CredObj } Write-Host "Importing Cred object..." -ForegroundColor Yellow $Cred = (Import-CliXml -Path $CredObj) # Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired "$Date - INFO: Importing AD Module" | Out-File ($DirPath + "\" + "Log.txt") -Append Import-Module ActiveDirectory "$Date - INFO: Getting users" | Out-File ($DirPath + "\" + "Log.txt") -Append $users = Get-Aduser -properties Name, PasswordNeverExpires, PasswordExpired, PasswordLastSet, EmailAddress -filter { (Enabled -eq 'True') -and (PasswordNeverExpires -eq 'False') } | Where-Object { $_.PasswordExpired -eq $False } $maxPasswordAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge # Process Each User for Password Expiry foreach ($user in $users) { $Name = (Get-ADUser $user | ForEach-Object { $_.Name }) Write-Host "Working on $Name..." -ForegroundColor White Write-Host "Getting e-mail address for $Name..." -ForegroundColor Yellow #$emailaddress = $user.emailaddress

    $emailaddress = "monemailtest@domain.com" If (!($emailaddress)) { Write-Host "$Name has no E-Mail address listed, looking at their proxyaddresses attribute..." -ForegroundColor Red Try { $emailaddress = (Get-ADUser $user -Properties proxyaddresses | Select-Object -ExpandProperty proxyaddresses | Where-Object { $_ -cmatch '^SMTP' }).Trim("SMTP:") } Catch { $_ | Out-File ($DirPath + "\" + "Log.txt") -Append } If (!($emailaddress)) { Write-Host "$Name has no email addresses to send an e-mail to!" -ForegroundColor Red #Don't continue on as we can't email $Null, but if there is an e-mail found it will email that address "$Date - WARNING: No email found for $Name" | Out-File ($DirPath + "\" + "Log.txt") -Append } } #Get Password last set date $passwordSetDate = (Get-ADUser $user -properties * | ForEach-Object { $_.PasswordLastSet }) #Check for Fine Grained Passwords $PasswordPol = (Get-ADUserResultantPasswordPolicy $user) if (($PasswordPol) -ne $null) { $maxPasswordAge = ($PasswordPol).MaxPasswordAge } $expireson = $passwordsetdate + $maxPasswordAge $today = (get-date) #Gets the count on how many days until the password expires and stores it in the $daystoexpire var $daystoexpire = (New-TimeSpan -Start $today -End $Expireson).Days If (($daystoexpire -ge "0") -and ($daystoexpire -lt $expireindays)) { "$Date - INFO: Sending expiry notice email to $Name" | Out-File ($DirPath + "\" + "Log.txt") -Append Write-Host "Sending Password expiry email to $name" -ForegroundColor Yellow $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage #Who is the e-mail sent from $mailmessage.From = $FromEmail #SMTP server to send email $SmtpClient.Host = $SMTPHost #SMTP SSL $SMTPClient.EnableSsl = $false #SMTP credentials $SMTPClient.Credentials = $cred #Send e-mail to the users email $mailmessage.To.add("$emailaddress") #Email subject $mailmessage.Subject = "Votre mot de passe de session Windows expire dans $daystoexpire jours" #Notification email on delivery / failure $MailMessage.DeliveryNotificationOptions = ("onFailure") #Send e-mail with high priority $MailMessage.Priority = "High" #Formatage de la date en format FR $expiresonFR = get-date $expireson -Format 'dd/MM/yyyy' $mailmessage.IsBodyHtml = $true $mailmessage.Body = "<p>Bonjour $Name,</p> <p>Votre mot de passe de session Windows expire le $expiresonFR.<br> Il vous reste $daystoexpire jours avant l'expiration de votre mot de passe.</p> <p><b><Font size=+1>Pour changer votre mot de passe de session Windows depuis un ordinateur de l'entreprise :</b></font><br> Modifiez votre mot de passe Windows en appuyant sur CTRL + ALT + SUPPR puis sélectionnez << Modifier un mot de passe >></p> <p><b><Font size=+1>Vous-êtes absent du bureau ou n'avez pas d'ordinateur ?</b></font><br> Si vous êtes absent du bureau, vous pouvez réinitialiser votre mot de passe de votre session windows depuis ce site internet : https://url.fr</p> <p><b><Font size=+1>Vous rencontrez des difficultés pour réinitialiser votre mot de passe ?</b></font><br> Vous pouvez contacter le support technique informatique selon les moyens suivant :</p> <p><UL><LI>Par mail à helpdeks@mail.com</LI><LI>Depuis un navigateur internet: https://url (uniquement depuis un ordinateur connecté au réseau informatique de l'entreprise)</LI><LI>Par téléphone au 1810</LI></UL></p> " #Write-Host "Sending E-mail to $emailaddress..." -ForegroundColor Green Write-Host "Sending E-mail to $emailaddress..." -ForegroundColor Green Try { $smtpclient.Send($mailmessage) } Catch { $_ | Out-File ($DirPath + "\" + "Log.txt") -Append } } Else { "$Date - INFO: Password for $Name not expiring for $daystoexpire days" | Out-File ($DirPath + "\" + "Log.txt") -Append Write-Host "Password for $Name does not expire for $daystoexpire days" -ForegroundColor White } }



    jeudi 14 novembre 2019 10:58
  • Si ton else est lié au try catch ... tu as un }de trop à la fin du catch le catch

    jeudi 14 novembre 2019 11:06
  • si j'enlève un } juste au dessus de else ça me donne une erreur à la ligne 54, caractère 5: 

    #Loop through the query results
    	Foreach($User in $Users)
        {

    Cependant, en prenant en compte ta remarque, le } ne semble en effet pas bien placé. Je l'ai déplacé à la fin. Bon ça ne résout pour autant pas le problème, mais ça s’exécute pour chaque utilisateur au lieu de s’exécuter une seule fois à la fin du script. 

     #Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Try
     {
     $smtpclient.Send($mailmessage) 
     }
     Catch
     {
     $_ | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
     else
     {
     "$Date - INFO: Password for $User not expiring for $expiresonFR days" | Out-File ($DirPath + "\" + "Log.txt") -Append
     Write-Host "Account for $User.Name does not expire for $expiresonFR days" -ForegroundColor White
     }
    }
     


     

    jeudi 14 novembre 2019 14:11
  • Si ton try ... catch est dans la boucle Foreach($User in $Users), forcément ca l'exécute pour chaque utilisateur.

    S'il ne doit pas être dans la boucle il faut ajouter le } avant le try. mais le bloc try ... catch ... else doit rester ensemble donc si tu as deux } après le catch cela ne marche plus.

    Sur Powershell ISE il suffit d'utiliser le "+" "-" à gauche pour voir l'orgnisation de ton script et ou chaque bloucle s'arrête. il doit y avoir autant de { que de }

    jeudi 14 novembre 2019 15:12
  • oui, je confirme qu'il doit être dans la boucle pour que cela l’exécute pour chaque utilisateur.

    Pour le + - , j'essaie en effet de me familiariser avec cela mais pour autant, je n'arrive toujours pas à comprendre où ça coince avec ce else 

    Mais sur ma dernière modification, le try catch et else sont bien ensemble non ? 

     #Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Write-Host "Sending E-mail to $ManagerEmail..." -ForegroundColor Green
     Try
     {
     $smtpclient.Send($mailmessage) 
     }
     Catch
     {
     $_ | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
     else
     {
     "$Date - INFO: Password for $User not expiring for $expiresonFR days" | Out-File ($DirPath + "\" + "Log.txt") -Append
     Write-Host "Account for $User.Name does not expire for $expiresonFR days" -ForegroundColor White
     }
    }

     
    jeudi 14 novembre 2019 15:50
  • oui, on peut utiliser tabulation pour décaler les blocs afin de rendre la lecture des blocs plus visible

    jeudi 14 novembre 2019 15:57
  • bon je craque, je supprime le else, tant pis pour le log final mais je n'arrive pas à comprendre où je me trompe.

    Je vais juste logger les emails envoyés pour les comptes utilisateurs qui vont expirer.

     Try
     {
     $smtpclient.Send($mailmessage) 
     Write-Host "Account for $($User.Name) expire le $expiresonFR. Envoi d'un mail à $ManagerEmail" -ForegroundColor White
     "$Date - INFO: compte $($User.Name) expire le $expiresonFR" | Out-File ($DirPath + "\" + "Log.txt") -Append
     "$Date - INFO: Mail envoyé à $ManagerEmail pour le compte de $($User.Name)" | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
     Catch
     {
     $_ | Out-File ($DirPath + "\" + "Log.txt") -Append
     }
     }
     

    jeudi 14 novembre 2019 16:25