none
Powershell RRS feed

  • Question

  • Bonjour, je suis débutant a Powershell et j'aimerais faire ceci :

    1)Créez un fichier texte de 250 lignes contenant sur chaque ligne un utilisateur.

    Voici mon code pour cette étape dites moi c'est bon .

    for ($i = 1; $i -le 250; $i++) { ADD-content -path "D:\dossier_essai\utilisateur.txt" -value "user$i"

    }

    2)Créez un fichier texte de 25 lignes contenant sur chaque ligne un groupe de 10 utilisateurs.

    Ensuite c'est la que ça se complique car j'ai essayer quelque chose pour faire ca mais je pense que c'est pas du tout bon

    Voici mon code :

    for ($i = 1; $i -le 25; $i++)
    {
       for ($a=1; $a -le 10; $a++)
       {
           Add-content - path "D:\dossier_essai\groupe.txt" -value "groupe$i = utilisateur$a" 
       }
    }
    

    3)Développez un script qui reçoit en paramètres les deux fichiers textes, créée les utilisateurs et les affecte au groupe cible.

    Pour le sript je ne sais pas trop comment faire est ce que vous pouvez m'aider

    Merci beaucoup

    fa23


    dimanche 19 avril 2020 22:51

Toutes les réponses

  • bonjour fa23

    tu y étais presque. Tu as bien pris en compte qu'il fallait faire 2 boucles For avec un incrément. Cependant, tu n'as pris en compte que les utilisateurs dans chaque groupe sont différents. Du moins c'est ce que j'ai compris de ton exercice. Groupe1 user1...user10, groupe1 user11...20, groupe2 user21...30 ...

    Il faut donc revoir ton code afin que les noms des utilisateurs aillent bien de 1 à 250, mais que chaque ligne correspondant à un groupe ne soit traitée que 10 fois.

    voici comment je m'y prendrais, mais comme toujours en Posh il n'y a pas qu'une seule méthode. J'ai commenté pour donner les explications. 

    $u = 1 # initialisation
    for ($i = 1; $i -le 25; $i++)
    {
    for ($a=1; $a -le 10; $a++)
    {
    # ajout (-Append) de la chaine de caractères donnant le nom de l'utilisateur suivi d'une virgule, ou n'importe quel autre car.
    # ET pas de fin de ligne dans le fichier de sortie (-NoNewLIne)
    # $a est utilisé pour traiter la boucle for x fois, $u est utilisé pour nommer l'utilisateur, il va s'incrémenter à chaque tour
    "Utilisateur$u," | Out-File -FilePath "c:\temp\groupe.txt" -Append -NoNewline
    $u++
    }
    # on a fini de traiter un groupe, on doit ajouter une nouvelle ligne
    "" |Out-File -FilePath "c:\temp\groupe.txt" -Append
    }

    Pour la 3ème partie, l'objectif n'est pas de te fournir la solution, mais de te mettre sur la voie sinon aucun intérêt.

    • recherche comment on ajoute un utilisateur dans un groupe. On ne sait pas s'il s'agit d'un groupe AD ou d'un groupe loca, alors considère qu'il s'agit d'un groupe AD. pour trouver la bonne cmdlet : Get-Help *-ADGroup*. Cela va te sortir une courte liste de cmdlets avec le "noun" ADGroup*". "*" étant un caractère joker. Tu vas vite identifier la cmdlet qui va bien, le nom est bien parlant.
    • cette première cmdlet étant identifiée, Help <cmdlet> -full pour voir comment ça marche. Là normalement tu devrais vite comprendre comment ajouter un utilisateur dans un groupe.

    Pour le traitement de masse tu as 2 questions à te poser :

    • Comment importer dans posh le contenu des 2 fichiers ? Mot clé : "Content" pour identifier la bonne cmdlet. Une fois importé, met le résultat de l'import dans une variable.
    • Comment faire un traitement en boucle ? Foreach-Object ou Foreach. Une petite recherche sur le net, te permettra rapidement de voir comment cela fonctionne si tu ne le sait pas.

    Une piste ? double boucle foreach :-)

    Aller, cherche un peu, tu vas trouver aisément avec ces indications. Reviens ici avec la solution ou avec un point de blocage.

    Je trouve que ces exercices sont très bien pour le côté pédagogique et progressif. Tu remercieras ton prof de ma part :-)

    cordialement

    Olivier

    lundi 20 avril 2020 06:53
  • bonjour olivier,

    Alors j’ai donc essayer de faire le script mais quand je l’exécute rien ne se passe, il ne créé pas mes utilisateurs ni mes groupe .

    Voila ce que j'ai fait meme si je pense que c'est pas totalement ça que je doit faire :

    $a = Get-Content D:\dossier_essai\utilisateur.txt
    $b = Get-Content D:\dossier_essai\groupe.txt
    
    foreach ($a in $utilisateur) 
    {
        New-ADUser $a
    
        foreach ($b in $groupe) 
        {
            New-ADGroup "groupe"
            Add-ADGroupMember -Identity groupe -Members $b
    
        }
    }

    Merci

    Cordialement,

    fa23

    lundi 20 avril 2020 21:41
  • Bonsoir,

    attention, il ne faut pas utiliser 2 fois la même variable pour 2 choses différentes.

    $a : contient tous les utilisateurs du fichier utilisateur.txt

    Tu ne peux donc pas l'utiliser dans ta boucle Foreach. $a est écrasé par le contenu de $Utilisateur (qui ne peut qu'être vide). 

    Pareil pour la boucle $b

    Donc, tu devrais plutôt utiliser une boucle de type :

    foreach ($i in $a)

    et utiliser $i qui prendra une par une toutes valeurs contenues dans $a (fichier Utilsateur.txt)

    Le problème est identique pour la 2ème boucle.

    A bientôt,


    Thierry DEMAN-BARCELO. Office Apps&Services MVP. MCSE:Enterprise admin, Messaging, Server Infrastructure 2016(89 MCPs). MCSA Office 365,Microsoft 365 Certified: Messaging Administrator Associate,Modern Desktop Administrator Associate, Security Admin https://base.faqexchange.info


    lundi 20 avril 2020 22:05
  • J'ai essayer avec ceci :

    $a = Get-Content D:\dossier_essai\utilisateur.txt
    $b = Get-Content D:\dossier_essai\groupe.txt
    
    foreach ($c in $a) 
    {
        New-ADUser $c
       
       foreach ($d in $b) 
       {
            New-ADGroup "groupe"
            Add-ADGroupMember -Identity groupe -Members $d
    
        }
    }

    Mais ca ne fonctionne toujours pas

    fa23

    mardi 21 avril 2020 00:49
  • Bonjour,

    disons que 'avant', il n'y avait aucune chance que cela fonctionne.

    Je ne connais pas le contenu de utilisateur.txt et groupe.txt...

    La partie "groupe" ne crée qu'un seul groupe appelé "groupe".

    J'imagine que l'objectif est d'utiliser "$d" en lieu et place.

    Pareil pour la ligne suivante...

    Avez-vous tenu compte du minimum de paramètre obligatoire pour la création d'un objet "Utilisateur" et "Groupe"?

    Par exemple, pour le groupe, il faut ajouter au moins l'option "-GroupScope Global" pour que le groupe puisse être créé.

    Pour l'utilisateur, si le fichier ne contient qu'un seul élément (sans espaces), l'utilisateur peut être créé.

    A bientôt,


    Thierry DEMAN-BARCELO. Office Apps&Services MVP. MCSE:Enterprise admin, Messaging, Server Infrastructure 2016(89 MCPs). MCSA Office 365,Microsoft 365 Certified: Messaging Administrator Associate,Modern Desktop Administrator Associate, Security Admin https://base.faqexchange.info

    mardi 21 avril 2020 07:36
  • bonjour Fa23,

    Thierry a raison sur les points qu'il avance. J'ajouterais que le traitement du pb n'est pas pris correctement. En effet, tu as 2 boucles foreach imbriquées et cela ne donnera pas l'effet escompté.

    Ex.ton code donnerait :

    création de user1

    creation de Groupe1

    Ajout de User1 dans groupe1

    création de groupe2

    ajout de User1 dans groupe2

    ...

    création de user2 et on recommence. Pas bon ! Essaie de penser comme tu t'y prendrais graphiquement

    • création des users : New-Aduser permet de créer plusieurs utilisateurs en même temps, tant que les Name (seul paramètre obligatoire) est séparé par une virgule

    Comment vérifier rapidement quels sont les paramètres obligatoires d'une cmdlet ?

    help <Cmdlt> -Parameter * | Where-Object {$_.Required -eq $true}

    • création des groupes. Attention, comme l'a souligné Thierry, le paramètre GroupScope est obligatoire. Je rajouterais qu'il faudrait également ajouter le paramètre path, sinon le groupe va être créé dans le container par défaut de l'annuaire et pas ou il convient, selon ton organisation, de le créer.
    • Ajout des users dans les groupes.Là, effectivement tu va avoir une boucle

    foreach ($group in $listegroups)

    { New-AdGroupMember - Identity $group -Members LaPremièreligneDeTonFichierUsers }

    Au second tour de la boucle foreach (group2 donc), les membres à ajouter seront LaSecondeLignedeTonfichierUsers. Rappelles-toi qu'il se présentent ainsi :

    user1, User2, ... user10

    User11, user12, ...user20

    ...

    Tu peux ajouter plusieurs utilisateurs à un groupe, tant que ceux-ci sont séparés par des virgules. Conseil : regarde l'aide sur la cmdlet.

    Pour obtenir le contenu du fichier users.txt, ligne par ligne, je te laisse chercher :-)

    cordialement

    Olivier

    mardi 21 avril 2020 12:19
  • Bonjour Olivier,

    Ah lala je suis vraiment pas bon en powershell..

    J'ai donc essayer ceci :

    Set-Location 'AD:\OU=Users,OU=Accounts, OU=Contoso, DC=contoso,DC=com'
    
    $a = Get-Content D:\dossier_essai\utilisateur.txt
    $listegroups = Get-Content D:\dossier_essai\groupe.txt
    
    foreach ($c in $a) 
    {
        New-ADUser $c | Out-File -FilePath "D:\dossier_essai\utilisateur.txt" -Append
       
       foreach ($groupe in $listegroups) 
       {
            New-ADGroup "groupe" -GroupScope Global
            Add-ADGroupMember -Identity groupe -Members $a
            "" |Out-File -FilePath "D:\dossier_essai\groupe.txt" -Append
    
        }
       
        "" |Out-File -FilePath "D:\dossier_essai\utilisateur.txt" -Append
    }

    Mais cela ne fonctionne pas non plus..

    Par contre si je mets la boucle pour créer le groupe en commentaire, il me crée bien mes utilisateurs du fichier users c'est déja une bonne chose alors c'est dans l'autre boucle qu'il y a un problème. Je vais finir par y arriver..

    Merci

    fa23

    mercredi 22 avril 2020 19:46