Comparaison fichier txt / csv avec une extraction Active Directory
Bonjour à tous,
J'aimerais savoir si ce que je souhaite réaliser est faisable.
Je vous explique la situation :
Un fichier est généré par un AS400 chaque jour avec une liste d'utilisateur dans un fichier TXT.
Je manipule le fichier de sorte à obtenir le résultat souhaité et dans un format CSV.
sur un format comme celui-ci :
Citation:
nom;prenom;matricule;DateDeDepart
Ce qui me permet ensuite d'envoyer ces informations par mail et de récupéré la liste des prochains départ utilisateurs (sur 3 mois) et de les anticiper.
Je rencontre ceci dit une difficulté car ma liste est très longue car elle prend en compte l'intégralité des personnes de l'entreprise et je souhaiterais la raccourcir en filtrant via les comptes Active Directory selon les critères suivants :
Code:
1 2
| $date = Get-Date
Get-ADUser -filter * -Properties * | where-object {$_.Enabled -eq "True"} | where-object {$_.EmailAddress -notlike ""} | where-object {$_.AccountExpirationDate -notlike ""} | where-object {$_.AccountExpirationDate -gt "$date"} | Select Surname,Enabled |
J'aimerais ensuite comparer les entrées reçu en fonction de la colonne Surname de la requête AD et la colonne Surname du fichier CSV et de récupérer uniquement les lignes du fichier CSV qui match avec le Surname.
Je suis conscient que l'explication peut-être difficile à comprendre mais je pense que la demande l'est aussi.
Je suis également ouvert à d'autres approche qui me permettrait d'atteindre mon but. Si vous avez des idées je suis preneur !
je précise que je ne suis pas un utilisateurs expérimenté en Powershell et que je réalise actuellement que des scripts basiques.
Voici mon script actuel :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #insert à la ligne 0
$i = 0
#Récupération de la date du jour avec le même format que le fichier généré par l'AS400
$datedujour=(Get-Date).ToString('yyyyMMdd')
#Récupération du contenu du fichier
$a=get-content "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt"
$b=$a.count
#Ajout des en-tête dans le fichier txt
set-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" ('Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1')
#Ré-ajoute le contenu du fichier après l'insertion des en-tête
add-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" $a[$i..$b]
#Récupération du contenu du fichier précédemment créé
$fichier = Get-Content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt"
$body =""
#Il va le lire ligne par ligne du txt
foreach ($ligne in $fichier){
#on split la ligne en une liste, et on utilise ";" comme séparateur puis on recupere la date
$date = ($ligne -split ";")[3]
#Si la date est differente de 00/00/0000
if($date -notmatch "00/00/0000"){
#On ajoute la ligne à notre corps de mail avec un retour à la ligne à la fin.
$body+="$ligne `n"
}
}
# On supprime tout les espaces blancs
$body2 = $body.Replace(' ','')
# On ajoute le contenu dans un fichier CSV
$csv = Set-Content "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv" $body2
# On récupére toute les entrées des 3 prochains mois (90 jours)
$date2 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
# On récupére le contenu du CSV avec notre filtre précédent et on tri les entrées par date de départ du plus proche au plus lointain
$csv2 = Import-Csv "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv" -Delimiter ';' | Where-Object {$_.datedepart2 -lt $date2} | Sort-Object -Property datedepart2 | Select-Object Prenom,Nom,Matricule,DateDepart,Site,Poste,matriculeN+1 | out-string
# Envoi du résultat par Mail
Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $csv2 -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"
# Suppression des fichiers créés pour les modifications
Remove-Item -Path "T:\Dsi\transfert\AD\Departs\dsi003pf-3.csv"
Remove-Item -Path "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" |
Merci à tous,