IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Comparaison fichier txt / csv avec une extraction Active Directory [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Par défaut 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 :

    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 PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    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 PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    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,

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je comprend mais tu n'a pas de colonne Surname dans ton csv.
    Je vais regardé ce qui est réalisable, peux tu nous procurer un fichier csv fictif mais représentatif ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    $a=get-content "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt"
    Attention à l'étoile * je pense que c'est une erreur

    J'ai commencé à regarder le script et tu passe par beaucoup de fichier intermédiaire qui n'ont pas l'air utile.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Attention à l'étoile * je pense que c'est une erreur

    J'ai commencé à regarder le script et tu passe par beaucoup de fichier intermédiaire qui n'ont pas l'air utile.
    Non l'étoile n'est pas une erreur car le fichier est horodaté avec l'heure et je n'ai pas besoin de cette information. Alors l'heure est représenté par l'étoile ce qui fonctionne très bien.

    Je passe effectivement par beaucoup de fichier intermédiaire mais je n'ai pas réussi à faire autremement...

    Si vous avez des suggestions je suis preneur.

    Merci à vous.

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Je te propose quelques choses comme ceci à peaufiner car je ne l'ai pas testé.
    si tu as des questions pour finaliser le script.

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $datedujour = (Get-Date).ToString('yyyyMMdd')
    $date90 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # Récupère la liste des noms des comptes AD selon les critères
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty Name
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$namesAD -contains $_.Surname -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $date90} | Sort-Object -Property datedepart2 | Out-String
     
    # Envoi du résultat par Mail
    Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $str -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"

    Edit : J'ajoute l'étoile

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    J'aurais préféré filtrer sur le Matricule mais malheureusement il me faudrait retirer les 0 avant et uniquement avant et je n'ai pas réussi à générer ce code.
    La correspondance se serait fait sur le matricule dans les utilisateurs de l'AD ? Avec quelle propriété ?

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je te propose quelques choses comme ceci à peaufiner car je ne l'ai pas testé.
    si tu as des questions pour finaliser le script.

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $datedujour = (Get-Date).ToString('yyyyMMdd')
    $date90 = (Get-Date).AddDays(+90).ToString('yyyyMMdd')
     
    # Récupère la liste des noms des comptes AD selon les critères
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour} | Select-Object -ExpandProperty Name
     
    # Récupère les données au format csv en ajoutant un en-tête
    $csv = Import-Csv -LiteralPath "T:\Dsi\transfert\AD\Departs\DSI003PF_$datedujour*.txt" -Delimiter ";" -Header 'Prenom', 'Surname', 'Matricule', 'DateDepart', 'datedepart2', 'Site', 'Poste', 'matriculeN+1'
     
    # Filtre les données, et récupère le résultat sous forme de chaine de caractères
    $str = $csv | Where-Object {$namesAD -contains $_.Surname -and $_.DateDepart -notmatch "00/00/0000" -and $_.DateDepart2 -lt $date90} | Sort-Object -Property datedepart2 | Out-String
     
    # Envoi du résultat par Mail
    Send-MailMessage -Encoding UTF8 -SmtpServer XXX -Body $str -From XXX -To XXX -Subject "Liste des prochains départs collaborateurs"

    Edit : J'ajoute l'étoile
    Je viens de tester ce morceau de code et je rencontre une erreur au niveau du import-csv qui me signifie : Caractères non conformes dans le chemin d'accès. Serait-ce l'étoile ? Elle fonctionnerai avec un get-content mais pas avec un import-csv ?

    j'ai tenté avec le nom réel du fichier et la commande passe. En revanche j'ai ajouté à la fin ceci :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    write-host $str

    Et je n'ai aucune sortie mais pas d'erreur.

    J'ai également dû faire une petite modification au niveau de cette ligne car le format date ne correspondait pas pour ce morceau de code :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $datedujour2 = get-date
    $namesAD = Get-ADUser -Filter * -Properties Name, Enabled, EmailAddress, AccountExpirationDate | Where-Object {$_.Enabled -eq $true -and $_.EmailAddress -ne "" -and $_.AccountExpirationDate -gt $datedujour2} | Select-Object -ExpandProperty Name

    Si la correspondance peut-être fait avec le Matricule de l'AD ce serait vraiment parfait ! car 2 personnes peuvent posséder le même nom de famille... Le matricule de mes utilisateurs est renseigné sur la propriété "CN" dans l'AD et dans la colonne "Matricule" dans le fichier TXT.

    Merci pour votre aide.

  8. #8
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Du coup avec ta modification tu obtient un résultat correcte ?

    Avant de modifier il faudrait déjà que ce code fonctionne.

  9. #9
    Membre chevronné
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Mai 2020
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 288
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Je comprend mais tu n'a pas de colonne Surname dans ton csv.
    Je vais regardé ce qui est réalisable, peux tu nous procurer un fichier csv fictif mais représentatif ?
    Dans mon exemple effectivement je n'ai pas écrit name;surname mais c'est bien le cas comme on peut le voir ici :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    set-content "T:\Dsi\transfert\AD\Departs\dsi003pf-2.txt" ('Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1')

    C'est un fichier txt qui à la base n'avait pas d'en-tête. J'ai donc dû lui apporter des en-tête via les premières lignes de codes.

    Je n'ai pas pu joindre le fichier, peut-être parce qu'il s'agit d'un CSV ?

    Voici l'intérieur :

    Prenom;Surname;Matricule;DateDepart;datedepart2;Site;Poste;matriculeN+1
    THOMAS;DUPONT;0001111;16/05/2020;20200516;1832;Magasinier;00022222
    Voici le fichier TXT source (On ne le voit pas mais j'ai beaucoup de blanc entre les différents ";") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    THOMAS              ;DUPONT               ;0001111;16/05/2020;00000000;0230;Magasinier        ;00002222
    J'aurais préféré filtrer sur le Matricule mais malheureusement il me faudrait retirer les 0 avant et uniquement avant et je n'ai pas réussi à générer ce code.

    Merci à vous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] Découpage d'un fichier txt à partir d'une liste csv
    Par boblag dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 23/01/2020, 17h01
  2. Comparaison de fichier a partir d'une extraction.
    Par valentin7513 dans le forum Excel
    Réponses: 1
    Dernier message: 11/12/2015, 12h14
  3. Mise à jour de fichier CSV avec une exécution automatique
    Par WeDgEMasTeR dans le forum Langage
    Réponses: 1
    Dernier message: 20/05/2010, 14h07
  4. extraction en fichier plat (csv) d'une base oracle sous unix
    Par djfredou dans le forum Import/Export
    Réponses: 0
    Dernier message: 21/01/2010, 14h26
  5. [CSV] Traitement fichiers txt/csv avec php
    Par cirtey dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2007, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo