PowerShell

Powershell : Surveiller des fichiers avec envoi de mail

Pour un besoin client, je dois surveiller si des fichiers datant de plus de 20 minutes sont dans un répertoire. Pour cela, j’ai opté pour un script Powershell qui va vérifier périodiquement le contenu du répertoire, et m’envoyer un mail en cas de problème.

Le contexte

Une application est utilisée par des utilisateurs distants, pour envoyer des fichiers plats par FTP. Ces fichiers sont ensuite traités par une application, avant d’être supprimés.

Il peut arriver que l’application plante par exemple, et que les fichiers ne soient pas traités. Comme c’est une application critique, il est important de réagir rapidement.

Le script sera donc chargé de vérifier la présence de fichiers dans le répertoire depuis plus de 20 minutes, et, le cas échéant, m’avertir par mail. Chaque vérification fait aussi l’objet d’une écriture dans un fichier de log.

Le script

### FONCTION ENVOI DE MAIL ###
Function SendMail
{
$EXPEDITEUR = "[email protected]"
$DESTINATAIRE = "[email protected]","[email protected]"
$SUJET = "Sujet du mail"
$SERVEUR_SMTP = "mail.domaine.com" 
$CORPS_MAIL = "Message d'alerte fichiers bloqués depuis plus de 20 minutes."
#$PJ = 'c:\script\Rapport.txt' # si Pièce jointe
#$attachment = New-Object System.Net.Mail.Attachment($PJ) #Pour la Pièce jointe
$Mail_Message = New-Object System.Net.Mail.MailMessage #on créé l'objet
$Mail_Message.From = $EXPEDITEUR
$Mail_Message.Subject = $SUJET
$Mail_Message.Body = $CORPS_MAIL
#$Mail_Message.Attachments.Add($PJ)
$Mail_Adresses = $Mail_Message.To
if ($DESTINATAIRE -is "System.Array") #Si plusieurs adresses
    {
    foreach ($Adr in $DESTINATAIRE) #on rajoute chaque adresse
        {
        $Mail_Adress = New-Object System.Net.Mail.MailAddress $Adr
        $Mail_Adresses.Add($Mail_Adress)
        }
    }
else
    {
    $Mail_Adress = New-Object System.Net.Mail.MailAddress $DESTINATAIRE
    $Mail_Adresses.Add($Mail_Adress)
    }
$SMTPClient = New-Object Net.Mail.SmtpClient($SERVEUR_SMTP, 26) #serveur SMTP et Port
$SMTPClient.EnableSsl = $false #si SSL activé ou non - Importer le certificat avant?
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("[email protected]", "password"); #ICI Login et password du compte mail
$SMTPClient.Send($Mail_Message) #l'envoi du mail
}

### Déclaration variables ###
$log="C:\répertoire\log.txt"
$dateverif = get-date -format "yyyy_MM_dd_-_HH_mm_ss"


### VERIFICATION DES COMMANDES EN ATTENTE ###
$Date=(Get-Date).AddMinutes(-20)
$path='C:\FTP\repertoire à surveiller\*.*'
$H=Dir $Path |
     Where-Object {! $_.PsIsContainer}|
     Group-Object -Property {$_.LastWriteTime -ge $date} -AsHashTable -AsString

$oldOfs,$ofs=$ofs,' , '
if ($H -eq $null) # Aucun fichier dans le répertoire à surveiller
{
    echo "$dateverif Aucun fichier trouvé" >> $log
        exit 0
}
if ($H.Contains('False')) # Présence de fichiers de plus de 20 minutes
{
	Write-Warning "Fichiers non traités"
	"$($H.False)"
	echo "$dateverif ATTENTION : Fichiers bloqués" >> $log
        SendMail #Envoi du mail d'alerte
        exit 2
}
if ($H.Contains('True')) # Présence de fichiers de moins de 20 minutes
{
	Write-Warning "Fichiers en attente d'intégration"
	"$($H.True)"
	echo "$dateverif Fichiers en attente" >> $log
	exit 0
}
$ofs=$oldOfs

Je pense avoir suffisamment commenté ce script pour que vous puissiez le réutiliser facilement.

Dans la première partie, la fonction d’envoi de mail vous permet de définir les destinataires, le compte qui envoi, le serveur SMTP, objet, contenu du mail. Je ne suis pas parvenu à utiliser SSL sur le SMTP, mais je n’ai pas passé de temps car ca fonctionne bien sans dans mon cas. Même si je ne m’en sert pas actuellement, j’ai testé la possibilité de joindre un fichier (log par exemple), que j’ai commenté ici.

La seconde partie permet de déterminer les variables (fichier de log, et récupération de la date/heure actuelle).

Et enfin en troisième partie, on va tester la présence de fichiers ou non dans le répertoire qu’on cible, et en fonction du résultat, on génère l’envoi d’un mail, et on écrit dans le fichier de log.

Ce script est perfectible évidement, mais il permet d’assurer une surveillance du bon fonctionnement du traitement de fichiers, et est rapide à mettre en place.

Automatisation

Afin de lancer ce script régulièrement, j’ai créé une tâche automatisée à l’aide du planificateur de tâches.

La tâche s’exécute toutes les 10 minutes.

On lance l’exécution de Powershell (C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe) , avec en argument le script.

Si ce script répond à vos besoins, n’hésitez pas à le mentionner! Et si vous l’adaptez, ou apportez quelques modifications intéressantes, alors merci d’en faire profiter tout le monde dans les commentaires, et je mettrai l’article à jour !

Samuel Monier

Informaticien indépendant Réseaux et systèmes - Infrastructure - Serveurs. J'interviens sur les départements 42 - 63 - 69 - 43 - 71, et à échelle nationale à distance. N'hésitez pas à me demander conseil!

Articles similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page