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 :

Traiter un fichier csv et interrogation de l'AD [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Traiter un fichier csv et interrogation de l'AD
    Bonjour à vous,

    Je suis nouveau sur le forum et j'ai une maigre connaissance en powershell. Toutefois je sollicite votre aide pour m'aider à rédiger un script qui a plusieurs but, si vous le voulez bien. Challenge trop grand pour moi, j'ai besoin de l'aide de personne plus expérimenté que je trouverai, je l'espère, sur ce forum .

    Voila donc mon problème :

    J'ai un fichier CSV avec une colonne de login,et une autre avec des numéros d'entités.

    Exemple du tableau :
    titi 282
    toto 282
    tata 298
    riri 298
    fifi 298
    loulou 298
    tutu 298
    roro 683
    rara 683

    L'idée serait de récupérer chaque login du tableau possédant le même numéro d'entités, d'aller chercher dans l'AD leur groupe en commun et d'utiliser le résultat du comparatif pour créer un modèle d'utilisateur dans l'AD en y ajoutant les groupes qui sont en commun. Chaque modèle s'appellera "tpluser*numérod'entité*"

    Exemple :

    Je veux récupérer tous ceux qui ont comme numéro d'entité le 282, je récupère donc comme login "titi" et "toto". Je vais ensuite chercher leur groupes d'utilisateur auxquels ils appartiennent, et je les compare pour garder que ceux qu'ils ont en commun. Enfin je crée un modèle d'utilisateur dans l'AD et j'y ajoute les groupes en commun.

    Je souhaite exécuter ce script pour l'ensemble des numéros d'entités. J'en ai plus de 400, d’où mon intérêt de passer par un script et non de le faire à la main.

    merci Beaucoup pour votre aide !

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Points : 520
    Points
    520
    Par défaut
    salut Exentrill

    a tu l'intention d'aller vers une pratique de l'AGDLP ? une très bonne idée !

    deux questions :
    - le numéro d'entité est t'il les attributs de l'utilisateur dans AD ?
    - quel version de PowerShell et du serveur AD

    ATTENTION il faut que dans ton fichier la première ligne contienne l'entête : login entité
    le séparateur entre login entité est un espace ? peut tu choisir

    pour le moment il te faut :
    - import-csv pour lire le fichier.
    - Group-Object pour regroupe les utilisateurs par entité
    - une boucle foreach
    - Get-ADUser -Properties memberof pour lire le nom des groupes d'un utilisateur
    - un tableau pour compter les groupes et on ne garde que les groupes qui sont aussi nombreux que les utilisateurs de l'entité
    - la normalement il faut New-AdUser pour rajouter un utilisateur modèle puis Add-ADGroupMember pour rajouter le modele à chaque groupe
    mais moi je ferait plutôt un groupe avec les utilisateurs en "membres" et les groupes en "membre de" -> AGDLP
    mais c'est a toi de voir !!!

    je vais me fais une petite maquette pour pouvoir t'aidée plus !

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse !

    Pour répondre à tes 2 questions :
    les numéros correspondent à des entités (des équipes) qui possèdent leurs propres groupes d'accès.
    Version powershell : 4.0
    Version du serveur de l'AD : 2012 R2 standard

    Voilà ce que l'on a réussi à faire en bidouillant un peu, certes ce n'est pas optimisé mais ça fonctionne :

    Code : 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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Set-StrictMode -Version latest
    $ErrorActionPreference = "Stop"
    $entites = Import-Csv .\desktop\tableau2.csv -Delimiter ";"
    $personnes = Import-Csv .\desktop\tableau1.csv -Delimiter ";"
    $entites2 = @{} # contient la liste des gens pour chaque entite
    $entites3 = @{} # contient la liste des groupes pour chaque entite
    $entites4 = @{} # contient la liste des groupes a garder pour chaque entite
    
    foreach ($entite in $entites) {
        foreach ($personne in $personnes) {
            if ($entite.EntiteNum -eq $personne.EntiteNum) {
                $entitetmp = $entite.EntiteNum
                if ($entites2.ContainsKey($entitetmp)) {
                    $entites2.$entitetmp += $personne.Login
    
                } else {
                    $entites2.Add($entitetmp, @($personne.Login))
                }
            }
    
        }
    }
    
    foreach ($entite2 in $entites2.GetEnumerator()) {
           
        $entitenum = $($entite2.Key)
        $personnes = $($entite2.Value)
    
        if (-not ($entitenum -eq 84)) {
            continue; #TMP TODO
        }
    
        foreach ($personne in $personnes) {
    
            try {
                $groupes = (GET-ADUSER –Identity $personne –Properties MemberOf | Select-Object MemberOf).MemberOf
            } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
                Write-Output "DEBUG : introuvable : $personne"
                continue
            }
    
            if ($entites3.ContainsKey($entitenum)) {
                $entites3.$entitenum += $groupes
            } else {
                $entites3.Add($entitenum, @($groupes))
            }
    
        }
    }
    
    foreach ($entite3 in $entites3.GetEnumerator()) {
        
        $entitenum = $($entite3.Key)
        $groupes = $($entite3.Value)
        
        if (-not ($entitenum -eq 84)) {
            continue; #TMP TODO
        }
    
        $nbgroupes = ($entites3[$entitenum] | group)
    
        foreach ($nbgroupe in $nbgroupes) {
            $count = $nbgroupe  | Select -ExpandProperty "Count"
            $groupe = $nbgroupe  | Select -ExpandProperty "Name"
    
            $nbmembres = ($entites2[$entitenum]).Count
    
            if ( ($nbmembres -lt 3) -or ($count -gt ($nbmembres * 2 / 3)) ) {
    
                if ($entites4.ContainsKey($entitenum)) {
                    $entites4.$entitenum += $groupe
                } else {
                    $entites4.Add($entitenum, @($groupe))
                }
            }
        }
    }
    
    foreach ($entite4 in $entites4.GetEnumerator()) {
    
        $entitenum = $($entite4.Key)
        $groupes = $($entite4.Value)
        
        try {
            New-ADUser -Server serveuraixdc -SamAccountName "tpluser$entitenum" -UserPrincipalName "tpluser$($entitenum)" -Name "tpluser$($entitenum)" -Description "Modele utilisateur pour l'entite $entitenum" -Path "CN=Users,DC=LGM,DC=COM" -AccountPassword (ConvertTo-SecureString "coucou" -AsPlainText -force) -Enabled $False -PasswordNeverExpires $True -PassThru
        } catch [Microsoft.ActiveDirectory.Management.ADIdentityAlreadyExistsException] {
            # OSEF
        }
    
        $groupes | Add-ADGroupMember -Server serveuraixdc  -Members "tpluser$entitenum"
    
    }
    Le soucis c'est que certains utilisateurs ont pu être mal créé, du coup il ne faudrait pas prendre l'intégralité des utilisateurs. Il faudrait utiliser que les 2/3 pour la comparaison des groupes d'où la commande un peu maladroite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ($nbmembres -lt 3) -or ($count -gt ($nbmembres * 2 / 3)) )
    En résumé, prendre les 2/3 des utilisateurs appartenant à un même numéro d'entité, comparer leur groupe et créer un utilisateur modèle dans l'AD appartenant au groupe commun récupéré de la comparaison.

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Points : 520
    Points
    520
    Par défaut
    salut Exentrill

    je t'avoue que comme j'attendais ta réponse, je n'est pas cherché plus

    mais je suis heureux de voir que j'ai pu de guidé !

    si tu des problème sur ton script, on peu regarder ensemble su tu veux

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Voici ce que je propose.
    Je me suis arrêté à l'analyse il n'y à plus qu'a effectuer la création ...

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <#
    Fichier lst.csv :
     
    nom;num
    titi;282
    toto;282
    tata;298
    riri;298
    fifi;298
    loulou;298
    tutu;298
    roro;683
    rara;683
     
    #>
     
    # Charge le fichier lst.csv
    $csv = Import-Csv -Path lst.csv -Delimiter ';'
     
    # Pour chaque groupe de numéro "num"
    foreach ($grpnum in ($csv | Group-Object num))
    {
        # récupère le numéro
        $num = $grpnum.Name
     
        # Initalise la liste des groupes AD
        $grpad = @()
        # pour chaque nom "nom"
        foreach($name in ($grpnum | Select-Object -ExpandProperty Group | Select-Object -ExpandProperty nom))
        {
            try
            {
                # Ajoute les groupes d'appartenances de l'utilisateur à la liste $grpad
                $grpad += Get-ADUser -Identity $name -Properties memberof | Select-Object -ExpandProperty memberof
            }
            catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException]
            {
                # Si utilisateur est introuvable
                Write-host "DEBUG : introuvable : $name"
            }
        }
     
        # Si il y a des des groupes d'appartenances
        if ($grpad.Count -gt 0)
        {
            # Récupère tous les doublons dans les groupes d'appartenances
            $grpaddoublon = (Compare-object –referenceobject ($grpad | Select-Object -Unique) –differenceobject $grpad) | Select-Object InputObject -Unique
     
            # Si il y a des doublons dans les groupes d'appartenances
            if ($grpaddoublon.Count -gt 0)
            {
                # Affiche les nombres de doublons pour le groupes num
                Write-Host "$($grpaddoublon.Count) doublons trouvez pour le Num $num"
     
                # $num : numéro du groupe
                # $grpaddoublon : tous les groupes en doublons (ou plus) des utilisateurs concernés par le groupes 
     
                # ......
     
            }
        }
    }

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

Discussions similaires

  1. Besoin d'aide pour petit script
    Par tibofo dans le forum VBScript
    Réponses: 2
    Dernier message: 22/07/2009, 22h37
  2. [MySQL] Besoin d'aide pour un script
    Par spespam dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/11/2008, 15h03
  3. [MySQL] besoin d'aide pour un script pour la numérotation de page
    Par rysis83 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/01/2008, 20h59
  4. Besoin d'aide pour modif script
    Par Abdias dans le forum Langage
    Réponses: 5
    Dernier message: 12/10/2006, 07h00
  5. Besoin d'aide pour un script shell
    Par lecharcutierdelinux dans le forum Linux
    Réponses: 5
    Dernier message: 20/05/2006, 10h36

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