Monthly Archive 20 March 2024

ByPatrick

Analyse du Script PowerShell pour la Gestion de Transfert de Fichiers SFTP et Envoi d’Emails

Ce script PowerShell est conçu pour transférer des fichiers depuis un serveur SFTP vers un emplacement local, et pour envoyer des emails de notification. Voici une analyse détaillée de chaque section du script :

Synopsis et Description

.SYNOPSIS
    FTP transfer scripts

.DESCRIPTION
   Script that will get the Files FICH1, FICH2, FICH3.txt from and send the file 
  • Description : Cette section fournit un bref résumé et une description du script. Elle indique que le script est utilisé pour transférer des fichiers depuis un serveur Ethias et pour envoyer un fichier spécifique.

Notes et Informations

.NOTES
    Author     : 
.INFO'S & REQ'S
   X: drive must be mounted as net use  \\fs-\PUBLIC /user:
  • Description : Cette partie contient des informations sur l’auteur du script, le point de contact, et les prérequis, notamment le montage du lecteur X: via une commande net use.

Configuration des Variables

$LogFilePath="e:\logs\log.txt";
$ServerName="";
$FileServerName="";
$username="";
$SMTPServerName="smtp.";
$remotePath = "/*"
$localPath = "D:\Folder\"
$WinScpDllPath="e:\scripts\\WinSCPnet.dll"
$proxy=""
$SshHostKeyFingerprint="ssh-rsa 2048 "  # PROD
  • Description : Ici, le script configure diverses variables, telles que le chemin du fichier de log, le nom du serveur SFTP, le nom du serveur de fichiers, le nom d’utilisateur, le nom du serveur SMTP, le chemin distant, le chemin local, le chemin de la DLL WinSCP, le serveur proxy, et l’empreinte de la clé SSH.

Fonction de Logging

function log ([string] $message ){
    $a = Get-Date
    $message1= $a.ToString() + " " + $message
    out-file -FilePath $LogFilePath -InputObject $message1 -Append
}
  • Description : La fonction log est utilisée pour écrire des messages de log dans le fichier de log configuré, en ajoutant la date et l’heure à chaque message.

Bloc Try-Catch Principal

try{
    # ...
}
catch [Exception] {
    # ...
}
finally {
    # ...
}
  • Description : Le bloc try-catch-finally encapsule l’exécution du script principal. Il tente d’exécuter le script, attrape les exceptions si elles se produisent, et exécute le bloc finally à la fin, quelle que soit l’issue.

Vérification des Prérequis et Exécution du Script

log("debug du script");
# ...
if ($checklistOk){
    # ...
}
else {
    log("Erreur lors de la checklist")
    exit 2
}
  • Description : Cette section débute par écrire un message de debug dans le fichier de log, puis vérifie si le dossier local existe et met à jour la variable $checklistOk en conséquence. Si tout est OK, le script continue. Sinon, il écrit un message d’erreur et quitte avec le code 2.

Configuration et Utilisation de WinSCP pour le Transfert de Fichiers

Add-Type -Path $WinScpDllPath
$sessionOptions = New-Object WinSCP.SessionOptions
# ...
$session = New-Object WinSCP.Session
# ...
$session.Open($sessionOptions)
# ...
$session.GetFiles($remotePath, $localPath).Check()
# ...
$session.Dispose()
  • Description : Cette partie du script configure les options de session WinSCP, ouvre une session, récupère la liste des fichiers distants, télécharge les fichiers, et ferme la session.

Envoi d’Emails de Notification

$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($SMTPServerName)
# ...
$smtp.Send($msg)
# ...
  • Description : Le script configure un objet MailMessage avec les destinataires, le sujet, et le corps du message, puis utilise un objet SmtpClient pour envoyer l’email via le serveur SMTP configuré.

Points à Noter

  • Le script contient des commentaires TODO qui indiquent des tâches ou des vérifications qui devraient être implémentées, comme vérifier la taille des logs ou vérifier si le dossier de destination existe.
  • Les valeurs de certaines variables sont vides ($ServerName, $FileServerName, $username, etc.) et devraient être remplies avec les informations appropriées pour que le script fonctionne.
  • L’envoi d’email est commenté dans le bloc catch pour éviter l’envoi d’emails intempestifs pendant le développement ou le débogage.

Ce script est un exemple de gestion de transfert de fichiers SFTP et d’envoi d’emails de notification, avec une gestion des exceptions et un système de logging intégré.

ByPatrick

Analyse du Script PowerShell pour la Comparaison de Données SQL et l’Envoi d’Emails

Ce script PowerShell est conçu pour se connecter à une base de données SQL, extraire des données, les comparer avec des données antérieures, et envoyer un email avec les modifications trouvées en pièce jointe. Voici une analyse détaillée de chaque section du script :

Configuration des Variables

$File1="C:\SQLData.csv"
$File2="C:\SQLData.old"
$Result="c:\result.txt"

$Database = "XXXXXXX"
$Server = " "

$SMTPServer = "smtp"
  • Description : Cette section configure les chemins des fichiers CSV pour les données actuelles et antérieures, le fichier de résultats, le nom de la base de données, le nom du serveur SQL, et le nom du serveur SMTP pour l’envoi d’emails.

Nettoyage des Fichiers Existants et Renommage

remove-item $File2
remove-item $Result
Rename-Item $File1 $File2
  • Description : Le script commence par supprimer les fichiers $File2 (données antérieures) et $Result (résultat de la comparaison), puis renomme le fichier $File1 (données actuelles) en $File2 pour le considérer comme les données antérieures lors de la prochaine exécution.

Connexion à SQL et Extraction des Données

$SqlQuery = "SELECT filename, file_description FROM dbo.item_table"
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection

$SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;User Id=XXXXXX;Password=XXXXXXX;"

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand

$SqlCmd.CommandText = $SqlQuery

$SqlCmd.Connection = $SqlConnection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter

$SqlAdapter.SelectCommand = $SqlCmd

$DataSet = New-Object System.Data.DataSet

$nRecs = $SqlAdapter.Fill($DataSet)
$nRecs | Out-Null
  • Description : Cette partie configure une requête SQL pour sélectionner des colonnes spécifiques d’une table, établit une connexion à la base de données avec une chaîne de connexion, et utilise un SqlDataAdapter pour remplir un DataSet avec les résultats de la requête. Le nombre de lignes affectées est stocké dans $nRecs et ensuite redirigé vers Out-Null pour éviter qu’il soit affiché.

Exportation des Données vers un Fichier CSV et Comparaison

$objTable = $DataSet.Tables[0]
$objTable | Export-CSV $File1
Compare-Object  $(Get-Content($File1))  $(Get-Content($File2)) > $Result
  • Description : Le script extrait la première table du DataSet et l’exporte vers un fichier CSV $File1. Ensuite, il utilise Compare-Object pour comparer le contenu des fichiers CSV actuel et antérieur, et redirige la sortie vers le fichier $Result.

Envoi d’un Email avec les Résultats de la Comparaison

$Mailer = new-object Net.Mail.SMTPclient($SMTPServer)
$From = 
$To = 
$Subject = "Modification"
$Body = "Bonjour, vous trouverez en pièce jointe les modifications apportées"
$Msg = new-object Net.Mail.MailMessage($From,$To,$Subject,$Body)
$Msg.IsBodyHTML = $False
$Attachment = new-object Net.Mail.Attachment($Result)
$Msg.attachments.add($Attachment)
$Mailer.send($Msg)
  • Description : Cette section configure un objet SMTPclient avec le serveur SMTP, définit les détails de l’email (expéditeur, destinataires, sujet, corps), configure le message pour ne pas interpréter le corps comme du HTML, attache le fichier de résultats à l’email, et envoie l’email via le serveur SMTP configuré.

Points à Noter

  • Le script utilise des informations de connexion à la base de données (User Id et Password) qui devraient être sécurisées. Il est recommandé d’utiliser des méthodes plus sécurisées pour stocker et récupérer ces informations, comme les services de secrets ou les variables d’environnement.
  • Le nom du serveur SQL ($Server) est vide et doit être rempli avec le nom du serveur cible.
  • Le script suppose que le serveur SMTP n’exige aucune authentification pour l’envoi d’emails. Si une authentification est nécessaire, le script doit être modifié pour inclure les informations d’identification appropriées.
  • Le script utilise une encodage particulier pour les caractères spéciaux dans le corps de l’email (è au lieu de è, etc.). Cela pourrait être dû à un problème d’encodage lors de la création du script, et il est préférable de corriger ces caractères pour une meilleure lisibilité.

Ce script est un exemple de workflow d’extraction de données, de comparaison, et de notification par email, automatisant le processus de surveillance des modifications dans une base de données SQL.