Question aide pour corriger script AD

Plus d'informations
il y a 3 semaines 1 jour #30471 par Laurent Dardenne
>>J'ai tester la commande :$group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf) et elle me renvoie systématiquement false
Vérifie la structure du nom de groupe issu du fichier csv avec celle renvoyée par la liste MemberOf.
Et si elle ont la même structure, il faut, en l'état, que $group ne contienne qu'un nom de groupe.

>>ça me met un message d'erreur disant qu'il arrive pas a interpréter la valeur; de la manière que je l'ai fait je n'ai pas l'erreur
Donne nous les messages d'erreur stp.

>>par contre je ne comprends pas trop pourquoi la commande get-aduser -Identity $name -Properties memberof | select -expand memberof renvoie un "false":
Je n'ai pas d'AD sous la main pour vérifier la syntaxe.

Dans ces cas là il faut analyser dans la console chaque commande et vérifier le résultat.
Je procède souvent comme cela pour des objets ou cmdlet que je ne connais pas, ensuite j’intègre les commandes dans un script.

>>par contre je ne comprends pas trop pourquoi la commande
Ne change pas pas le code à chaque fois, ni le nom des variables:
$group= (get-aduser -Identity $name -Properties memberof |select -expand memberof)
$g1=$UG.group

        get-aduser -Identity $name -Properties memberof  | select -expand memberof
        if (!($group -eq ([String]::Empty)))
je ne sais pas ce que cela fait, ça m'embrouille plutôt qu'autre chose...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 semaines 1 jour - il y a 3 semaines 1 jour #30472 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonjour Laurent, j'ai copié le code de mon script qui marche qu'a moitié pour mettre les valeurs que tu m'avais indiqué précédement.

le script donne ceci

#Ajout des utilisateurs aux groupes primaires
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")

$UGp=import-csv -path "C:\users-domjacom.csv" -delimiter ";"

Function New-UserPrincipalgroupInfos{
#New-PSCustomObjectFunction -Noun UserInfos -Parameters Name,GivenName,Path,SamAccountName,UserPrincipalName,EmailAddress,SurName,DisplayName -File
 param(
        [Parameter(Mandatory=$True,position=0)]
    $SamAccountName,
        [Parameter(Mandatory=$True,position=1)]
    $Name,
        [Parameter(Mandatory=$True,position=2)]
    $Path
    )

[pscustomobject]@{
    PSTypeName='UserPrincipalgroupInfos';
    SamAccountName=$UG.SamAccountName
    Name=$UG.group;
    Path=$UG.path;
    }

    $PGROUP=@(
    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName1' -Name 'groupp1' -Path 'path' `
    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName2' -Name 'groupp2' -Path 'path' `
    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName3' -Name 'groupp3' -Path 'path' `
    )
}

$UGp=Import-Csv -path "C:\users-domjacom.csv" -delimiter ";"|
 Foreach-object {
    $_ |
     Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
     Add-member -MemberType NoteProperty -Name isInsert -Value $false -PassThru|
     Add-member -MemberType NoteProperty -Name isInside -Value $false -PassThru
 }

foreach($UG in $UGp)
{
$sam=$UG.SamAccountName
$name=$UG.UserName
$group=$UG.group

#test si les utilisateurs ont un groupe principal
$group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf)
        if ($group -eq ([String]::Empty))
        {
        Add-ADGroupMember -Members $UG.SamAccountName  -Identity $UG.group
        write-host -ForegroundColor $MyForegroundColor "l'utilisateur $name a ete ajoute au groupe principal: $group"
        $UG.isInsert=$True        
        }
        
        else
        {
        write-host -ForegroundColor $MyForegroundColor1 "l'utilisateur $name est dans son groupe principal: $group"
        $UG.isInside=$True
        }

add-Content -path "C:\resultatscript.txt" -value $UG.UserName,$group,$UG
    }

   
Pour le message d'erreur il venait du fait que j'avais mis la variable $_.isInside=$True et $_.isInsert=$True  mais en mettant comme je l'ai fait avec $UG.isInside=$True et $UG.isInsert=$True et là je n'ai plus de soucis de ce coté.
Pour la colonne group du csv il n'y a qu'un seul nom.

Par contre le résultat du (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf)  donne ceci à l'écran dan l:

PS C:\Users\Administrateur> $group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf)
False


A lécran le résultat est le suivant:

False
l'utilisateur Tech4 est dans son groupe principal: gg-techniciens


C'est la même chose pour tout les autres utilisateurs mais quand je regarde dans le groupe "gg-techniciens" il n'y a personne contrairement à ce que donne la réponse ecrite à l'écran ainsi que ce qui est écrit dans le fichier de sortie :

Tech4
gg-techniciens
@{CN=Tech4; DistinguishedName=CN=tech4,OU=maintenance,OU=entreprise-jacom,DC=domjacom,DC=local; Enable=True; GivenName=Tech4; EmailAddress=t.tech4@domjacom.local; MailNickname=t.tech4; UserName=Tech4; SamAccountName=tech4; SurName=tech4; UserPrincipalName=tech4@domjacom.local; group=gg-techniciens; groups=; member=CN=gg-techniciens,OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local; path=OU=maintenance,OU=entreprise-jacom,DC=domjacom,DC=local; groupes=; isExist=False; isInsert=False; isInside=True
}

Avec l'inversion du test:
$group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf)
        if (!($group -eq ([String]::Empty)))


le message est :

False
l'utilisateur MartineLEROY a ete ajoute au groupe principal: gg-direction
False
l'utilisateur FredericMANUECO a ete ajoute au groupe principal: gg-direction
False
l'utilisateur JacquesSAVIRON a ete ajoute au groupe principal: gg-direction
...


les utilisateurs sans groupes sont bien insérés dans leur groupe mais le message touche tout le monde et pas seulement ceux qui n'ont pas leur groupe hors je voulais qu'il n'insère que ceux qui ne l'avaient pas.

Résultat dans le fichier log:

MartineLEROY
gg-direction
@{CN=Martine LEROY; DistinguishedName=CN=martineleroy,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local; Enable=True; GivenName=Martine; EmailAddress=m.leroy@domjacom.local; MailNickname=m.leroy; UserName=MartineLEROY; SamAccountName=martineleroy; SurName=LEROY; UserPrincipalName=martineleroy@domjacom.local; group=gg-direction; groups=gg-atelier; member=CN=gg-direction,CN=gg-atelier,OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local; path=OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local; groupes=CN=martineleroy,CN=gg-direction,CN=gg-atelier,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local; isExist=False; isInsert=True; isInside=False}


Du coup je sais pas trop d'ou vient le problème, le script suivant le test insère tout le monde sans distinction de qui était ou pas dans son groupe, ou il affiche que tout le monde est dans son goupe alors que ce n'est pas le cas

Pour ta dernière remarque dans ma version je tentais de faire un test de la partie "group" qui était indiquée dans les infos que me donnait l'écran pour chaque utilisateur de l'AD, car là avaec le test du script actuel on base le test  sur la colone du csv.

J'ai regardé sur le net pour la commande GET-ADUSER  et j'ai trouvé beaucoup de réponse qui ressemblaient à celle que tu m'as donné donc je pense que c'est bien la bonne commande mais que je n'arrive  peut être pas à utiliser correctement.
Il faudrait peut être que je fasse un double test dans mon "if" combinant le test csv et celui que je tentais pour voir si sa change quelque chose
Dernière édition: il y a 3 semaines 1 jour par garrigues.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 semaines 1 jour - il y a 3 semaines 1 jour #30473 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Je pense avoir trouver un début de piste pour mon test des utilisateurs présents dans mes groupes de l'AD

$groups= Get-ADGroup -Filter "*" | where { $_.Name -match "gg-*"} |select name
foreach ($Group in $groups) {
   
    Write-Host
    Write-Host " Group : $($Group.Name)"
    
        Get-ADGroupMember $($Group.Name)
        }


La commande me ressort bien mes groupes que j'ai créé et uniquement eux, et elle me dit qui est présent dedant.
Je pense qu'a partir de sa l'idée sera de demander au script de contrôler le csv et si un membre n'est pas présent dans son groupe, il devra l'ajouter; je vais donc reprndre une partie de mon script que j'ai fait précédement pour l'incorporer dans celui-ci et voir si j'obtient ce que je veux .
Dernière édition: il y a 3 semaines 1 jour par garrigues.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 semaines 10 heures #30474 par Laurent Dardenne
>>Avec l'inversion du test:
Ton test réussi toujours car tu ne vérifies pas le résultat ($true, $false) renvoyé par l'opérateur -in
#émet le résultat dans le pipeline par défaut la console
'un' -in @('un','deux','trois')
function test {
    #émet le résultat dans le pipeline
   'un' -in @('un','deux','trois')
   
   #émet le résultat dans le pipeline
   1+1
}
Test
Write-host "Objet reçu : $(@(Test).count)"
En testant le résultat :
function test {
   #émet le résultat du pipeline dan,s une varaible
   $ResultatDeTest='un' -in @('un','deux','trois')
   if ($ResultatDeTest -eq $true) 
   #émet le résultat dans le pipeline
   {1+1}
}
Test
Write-host "Objet reçu : $(@(Test).count)"
Ton code actuel contient donc un bug difficile à détecter quand on ne connait pas ce fonctionnement.
Et si tu t'en aperçois rapidement tant mieux, sinon c'est des heures de debug pour retrouver le code en cause.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 3 semaines 8 heures - il y a 2 semaines 6 jours #30475 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonjour Laurent, merci pour ta réponse.

Il y a effectivement un soucis car le test pour vérifier que le contenu d'un groupe AD est vide ne marche pas avec le ([String]::Empty).

En m'acharnant dans mes recherches je suis tombé sur un article disant qu'apparement pour déterminer si un groupe AD contient des utilisateurs il faut passer par un compteur.

J'ai donc modifié mon code pour la partie test utilisateur qui donne pour le moment ceci:

$groups= Get-ADGroup -Filter "*" | where { $_.Name -match "gg-*"} |select name   # (mes groupes ont tous pour nom gg- quelque chose pour groupe global)
foreach ($Group in $groups) {
   
    Write-Host " Group : $($Group.Name)" -ForeGroundColor Green

    Get-ADGroupMember $($Group.Name)

          if ($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)
         {
          write-host  "le groupe $Group est vide   " -ForegroundColor Red
          }
          else
          {
          write-host  "le groupe $Group contient des utilisateurs   " -ForegroundColor Green
}
}


Le retour de cette partie est bon , il me liste les groupes avec les utilisateurs qu'il contient, me met un message vert pour ceux qui ont des utilisateur et un message rouge pour celui qui est vide (volontairement pour les test)

ibb.co/qWq5HF4

Il va me rester à ajouter la partie de vérification du csv quand le groupe est vide et d'intégrer les utilisateurs qui devraient y être et d'indiquer en sortie le "isinside" ou "isinsert" .

Je me rapproche doucement de la fin de ce foutu script , mais je crie pas encore victoire car je ne sais pas encore ce que je vais rencontrer .

Bon j'avais bien dit que sa risquait de pas marcher comme je le souhaitais donc j'ai tenter ceci pour la suite (avec des dizaines de tentives différentes mais infructueuses)

    Get-ADGroupMember $($Group.Name)

      $G2= if ($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)  
      {
      write-host  "le groupe $Group est vide   " -ForegroundColor Red

           # foreach($UG in $UGp)
                #{
                $sam=$UG.SamAccountName
                $name=$UG.UserName
                $G2=$UG.group

                Add-ADGroupMember -Members $UG.SamAccountName  -Identity $G2
                    write-host -ForegroundColor $MyForegroundColor "l'utilisateur $name a ete ajoute au groupe principal: $G2"
                    $UG.isInsert=$True
          #}
          }
          else
          {
          write-host  "le groupe $Group contient des utilisateurs   " -ForegroundColor Green
}
}


Dans cette version je ne comprends pas pourquoi il ne me met que l'utilisateur tech4 dans son groupe mais pas les 5 autres techniciens.
Si je met le foreach il tente d'insérer tout les membres dans leurs groupes (ce qui fait que mon test sert à rien pour trouver si un groupe est vide...).
L'idée de départ était de voir si un groupe était vide pour lui intégrer ses utilisateurs sauf que la sa marche pas (soit la commande tente dintégrer tout les utilisateurs dans leurs groupes ou alors il me met qu'1 utilisateur sur 6 dans le groupe et toujours ce fameux tech4..
.
Qaund je commente ceci $G2=$UG.group
j'obtiens le résultat suivant:

 Group : gg-techniciens
le groupe @{name=gg-techniciens} est vide   
Add-ADGroupMember : Impossible de valider l'argument sur le paramètre «Identity». L’argument est
Null. Spécifiez une valeur valide pour l’argument, puis réessayez.
Au caractère C:\test insertion groupes.ps1:72 : 74
+ ...          Add-ADGroupMember -Members $UG.SamAccountName  -Identity $G2
+                                                                                                                        ~~~
    + CategoryInfo          : InvalidData : (:) [Add-ADGroupMember], ParameterBindingValidationEx
   ception
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Manageme
   nt.Commands.AddADGroupMember

 
l'utilisateur Tech4 a ete ajoute au groupe principal:


et l'utilisateur n'est pas créé...

Là je bloque complètement, je me demande si j'ai vraiment compris le fonctionnement de ce que je pensais avoir appris lors des phases précédentes de ce script ou alors les commandes liées à l'AD sont très particulières par rapport aux autres que j'ai testé ....
Dernière édition: il y a 2 semaines 6 jours par garrigues.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 semaines 6 jours - il y a 2 semaines 6 jours #30479 par Laurent Dardenne
>>Bon j'avais bien dit que sa risquait de pas marcher
Pour ceci:
$G2= if ($((Get-ADGroupMember -Identity $Group.name).Count) -eq 0)
{
$sam=$UG.SamAccountName
$name=$UG.UserName
$G2=$UG.group
Add-ADGroupMember -Members $UG.SamAccountName -Identity $G2
Je ne comprend pas comment le résultat est aussi un paramètre.
J'ai de plus en plus de mal à relire ton script et à savoir où tu vas...

>>Là je bloque complètement, je me demande si j'ai vraiment compris le fonctionnement
Il me semble que tu cherches 'à faire' au lieu de comprendre.
Ce n'est pas complexe comme exercice, il faut un peu de méthode si qq chose ne fonctionne pas cherche pourquoi, rien ne sert d'assembler des bout des trucs pour que cela tombe en marche.
D'habitude je ne répond aux demandes concernant l'AD car je ne rien sous la main pour vérifier ce que je propose ou si j'ai un AD c'est de la prod (et je ne fais pas dev en prod ;-) )
Teste dans une console étape par étape et pour un seul objet, simplifie le pb.[/code][/code]

Tutoriels PowerShell
Dernière édition: il y a 2 semaines 6 jours par Laurent Dardenne. Raison: balise code

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.203 secondes
Propulsé par Kunena