Question aide pour corriger script AD

Plus d'informations
il y a 3 ans 1 mois #30442 par Laurent Dardenne
J'ai réécrit et simplifier ton code qui ne fonctionnait pas.
MAIS c'est à tester :
#Chargement des modules active directory
Import-Module ActiveDirectory

#couleurs messages
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")

#création de l'UO racine

$Domain = "DC=domjacom,DC=local"
$Root_OU = Read-Host "nom de votre OU racine"

Function New-RootOUInfos{
 param(
        [Parameter(Mandatory=$True,position=0)]
    $Name,
        [Parameter(Mandatory=$True,position=1)]
    $Path,

    [Switch] $ProtectedFromAccidentalDeletion
 )

$Objet=[pscustomobject]@{
    PSTypeName='RootOUInfo'; #Permet de typer un objet personnalisé
    Name=$Name;
    Path=$Path;
    ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion.IsPresent;
    }
  #ajoute des propriétés et émt l'objet dans le pipeline
  $Objet|
    Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
    Add-member -MemberType NoteProperty -Name isCreated -Value $false -PassThru
}

#Crée un ou des objets personnalisés
#on ne précise pas $ProtectedFromAccidentalDeletion, dans cas il contiendra $false
$ListeOU=@( New-RootOUInfos -Name $Root_ou -Path $Domain )


#Exécute le traitement sur la liste d'objets personnalisés (1 ou n)
foreach ($OU in $ListeOU)
{
    if ((Get-ADOrganizationalUnit -filter "name -like '*$($OU.Name)'"))
    {
       $OU.IsExist=$True
       write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$($OU.Name)' est deja presente dans l'AD"
    }
    else 
    {
       $parameters=@{
         Name=$OU.Name;
         Path=$OU.Path;
         ProtectedFromAccidentalDeletion=$OU.ProtectedFromAccidentalDeletion
       }
       New-ADOrganizationalUnit @parameters
       $OU.isCreated=$True
       write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation '$($OU.Name)' a fonctionne correctement"
    }
    #On ajoute Un objet, celui en cours de traitement
  add-Content -path "C:\resultatscript.txt" -value $OU
}
Si tu ne t'en sors pas, oublie et fait à ta manière.
Pour le Add-Content tu vas gérer du texte, si tu utilises Export-Csv tu peux réimporter les objets et effectuer des traitements sur la liste d'objet contenu.

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 1 mois - il y a 3 ans 1 mois #30443 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonsoir merci pour ta réponse ainsi que ta correction qui marche très bien (je l'ai testé plusiers fois ).

J'essaye de comprendre du coup car c'est bien de copier mais si on analyse pas on apprend pas et donc sa sert pas forcément (ce n'est que mon point de vue mais je vois les choses comme sa ).

A chacune de tes réponse j'apprends de nouvelles choses, par exemple:

[Switch] $ProtectedFromAccidentalDeletion

Je connaissais l'utilisation du "switch" pour créer un choix pour l'utilisateur du script mais là dans ce cas de figure je ne comprends pas trop son fonctionnement.

Je pense du coup qu'il est relié à:

ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion.IsPresent;

et à:
#Crée un ou des objets personnalisés
#on ne précise pas $ProtectedFromAccidentalDeletion, dans cas il contiendra $false
$ListeOU=@( New-RootOUInfos -Name $Root_ou -Path $Domain )


Je suppose que le "switch" est donc placé pour changer l'état de la variable de "false" à "true" suivant si on l'intègre ou pas dans l'objet que l'on a créé.

J'avais vu un $liste dans des exemples sur le net mais je n'avais rien compris à son fonctionnement donc je ne l'avais pas utilisé pensant que sa ne conviendrait pas à ce que je voulais faire .
Pour la partie suivante je pensais qu'elle ne pouvait fonctionner qu'avec une boucle:

$Objet|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false -PassThru


J'avais bien essayé de lui mettre une variable sauf que je l'avais mis que sur cette partie et donc sa n'avait pas fonctionné...

Tu as du coup créé la variable sur le "pscustomobjet" uniquement dans le but d'éviter une boucle foreach ici et ainsi de pouvoir faire fonctionner l'ajout de valeurs basé sur cette variable vu que l'on ne l'utilise plus après.

Concernant ces 2 valeurs pour le fichier log je pensais qu'il valait mieux leur donner un nom différent pour que les 2 se notent dans le fichier (je n'avais pas tester avec le même nom pensant que suivant le test qui fonctionnait (if ou else) sa ne me marquerait que l'un des 2 )

$OU.IsExist=$True
$OU.isCreated=$True

enfin du coup pour cette partie:
else
{
$parameters=@{
Name=$OU.Name;
Path=$OU.Path;
ProtectedFromAccidentalDeletion=$OU.ProtectedFromAccidentalDeletion

}


Je pensais que la hashtable fonctionnait comme les variables et devait donc être définie en début avant le test et les actions qui en découlent.

Du coup il est plutôt conseiller de faire comme tu l'as fait ou se n'est pas grave si la hashtable se retrouve comme les variables avant les tests?.

Je m'aperçois que je suis au final extrêment loin de connaître les capacités de powershell et que le peu que l'on a vu en formation est simplement un éfleurage de tout ce que powershell peut faire.

Je suis partis d'un pauvre script avec des tests pas du tout top mais qui fonctionnait presque par miracle sans connaître les fonction, pscustomobject, la création d'objet, l'ajout de valeurs sur un objet, les hashtable et le splatting...

Je n'irais pas a dire que je comprends encore tout mais la j'ai l'impression d'avoir appris beaucoup de choses en peu de temps, reste maintenant à tout assimiler comme il faut pour essayer de terminer mon script seul et j'espère reproposer quelques chose de complet et fonctionnel d'ici quelques jours.

Si j'y arrive, le prochain défis sera de réaliser le script inverse afin de pouvoir récupérer toutes les données essentielles d'un AD et pour du coup grâce au script actuel les réintégrer à l'aide du ou des fichier exportés (enfin déjà il faudra que je trouve comment exporter proprement mes resultats ).

Je te remercie encore une fois pour ton aide, tes explications, corrections et le temps que tu passe pour m'aider à avancer.


 
 
Dernière édition: il y a 3 ans 1 mois par garrigues.

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

Plus d'informations
il y a 3 ans 1 mois #30446 par Laurent Dardenne
Salut,
>> je ne comprends pas trop son fonctionnement.
Un switch remplace une propriété de type boolean qui est vrai ou faux.
Si un paramètre de type switch est présent sur un appel de cmdlet ou de fonction, le paramètre vaut true, sinon false.

>>Je pense du coup qu'il est relié à
Oui.
Il faut étudier les objets à l'aide de Get-Member, qui affiche les noms de propriété (et leur type) et les noms de méthodes possible sur l'objet.

>>Pour la partie suivante je pensais qu'elle ne pouvait fonctionner qu'avec une boucle
Add-member ajoute un membre ( une propiété ou une méthode) à un objet.
La boucle ne sert qu'à parcourir un tableau d'objets afin d'ajouter les mêmes membres à chaque objet du tableau.

>>Tu as du coup créé la variable sur le "pscustomobjet" uniquement dans le but d'éviter une boucle foreach
Oui

>>Concernant ces 2 valeurs pour le fichier log
Ce n'est pas pour les logs, ils portent l'information du traitement.
Et à partir de ces informations tu écris des logs OU tu tries les objets selon ces informations.

>>Du coup il est plutôt conseiller de faire comme tu l'as fait ou se n'est pas grave si la hashtable se retrouve comme les variables avant les tests?
Il faut renseigner une hastable de splatting avant l'appel ainsi on est assuré qu'on ne modifie pas les objets référencées dans les clés.
Puisque pour un scalaire (un entier par exemple) dotNet recopie sa valeur et pour un objet ou un tableau il recopie son ADRESSE en mémoire.

>>Je m'aperçois que je suis au final extrêment loin de connaître les capacités de powershell
Oui :
get-help about*

>>reste maintenant à tout assimiler
Il faut prendre des notes et pratiquer sur des exemples trés simples et dans la console, ce qui permet d'analyser ce qui se passe.
Ensuite un EDI comme Visual Studio Code te fera gagner du temps ( mais cela ajoute l'apprentissage d'un nouvel outil).

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 1 mois - il y a 3 ans 1 mois #30467 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bonsoir, encore merci pour tes explications, j'ai suivis tes exemples de la root_ou et des utilisateurs et sa m'a permit de créer la partie ou enfant et celle pour les groupes qui fonctionne après quelques heures de galère et j'essaye de finir avec l'incorporation des utilisateurs dans les groupes en suivant encore une fois tes exemples mais là je coince un peu car j'ai réussi à mettre un utilisateur n'ayant pas de groupe principal dans son groupe mais la partie created et exist ne fonctionne pas.


#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
    )

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

    $PGROUP=@(
    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName1' -Name 'pgroup1' -Path 'path' `

    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName2' -Name 'pgroup2' -Path 'path' `

    New-UserPrincipalgroupInfo -SamAccountName 'SamAccountName3' -Name 'pgroup3' -Path 'path' `
    )
}

foreach ($pgroup in $UGp)
{
    $pgroup|
     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 sont déjà dans leur groupe principal
$mem=  (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object MemberOf).MemberOf =$group
        if (!($mem -eq ([String]::Empty)))
        {
        write-host -ForegroundColor $MyForegroundColor "l'utilisateur $name est dans son groupe principal: $group"
        $pgroup.isInside=$True
        }
        else
        {
        try{
        Add-ADGroupMember -Members $UG.SamAccountName  -Identity $UG.group
        }
        catch
        {
        write-host -ForegroundColor $MyForegroundColor2 "l'utilisateur $name n'est pas dans son groupe principal"
        }
    }
#test verification si le csv contient un groupe principal pour l'utilisateur
if  ($UG.group -eq ([String]::Empty))
    {
    write-host -ForegroundColor $MyForegroundColor2 "l'utilisateur $name n'a pas de groupe principal"
    $ng= read-Host "ajoutez $name a un groupe: ex gg-* "
    Add-ADGroupMember -Members $UG.SamAccountName  -Identity $ng
    write-host -ForegroundColor $MyForegroundColor "l'utilisateur $name a bien ete integre dans son groupe principal: $ng"
    $pgroup.isInsert=$True
    }
     
     
$mem
add-Content -path "C:\resultatscript.txt" -value $UG.UserName,$mem,$pgroup
}

voici le résultat du fichier texte, donc déjà ce n'est pas sur la même ligne mais sa je suppose que sa viens des virgules mais sa me mamrque entre chaque utilisateurs la ligne complète du tech4 et cela entre tout les utilisateurs .

MartineLEROY
gg-direction
@{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=; groups=; member=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}
FredericMANUECO
gg-direction
@{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=; groups=; member=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}


et la dernière ligne elle fonctionne

@{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=; groups=; member=OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local; path=OU=maintenance,OU=entreprise-jacom,DC=domjacom,DC=local; groupes=; isExist=False; isInsert=True; isInside=True}

je ne comprends pas pourquoi il me met le tech 4 a toutes les lignes au lieu de mettre chaque utilisateurs avec les valeurs qui leur correspond et a sa ligne les valeurs changent et son les siennes...
Si tu as une idée pour le soucis de réponse et éventuellement sur le test je serais preuneur, il faudra ensuite que je fasse la même chose pour le groupe secondaire et quand se sera fini je tenterais de créer un 3eme groupe (spécial pour glpi car se script est aussi fait pour créer tout larborécense ad pour transférer les utilisateurs vers glpi ce qui ne fonctionnait pas avec mon script originel et j'ai vu parmis les possibilité de créer un groupoe spécial glpi donc mes utilistaeurs auront au minimum 2 groupes voir 3 pour certains.

bon je sais pas de quoi sa vient mais il y a un autre soucis avec le test de présence dans le groupe principal: j'ai utilisé le script , il a bien répondu avec l'utilisateur qui n'a pas de groupe dans le csv et en l'ayant mis manuellement dans son groupe.

Quand je regarde dans l'ad mon utilisateur est bien dans son groupe hors quand je relance le script j'ai a nouveau mon utilisateur ou sa me dit qu'il a pas de groupe csv sa c'est vrai mais sa dit aussi qu'il n'est pas dans un groupe alors qu'il y est la je sais pas pourquoi et je ne comprends pas


ibb.co/LZ1c8Cq

ibb.co/vmJjBxJ

ibb.co/wYxcVJL
Dernière édition: il y a 3 ans 1 mois par garrigues.

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

Plus d'informations
il y a 3 ans 1 mois #30469 par Laurent Dardenne
Le principe d'ajouter un membre se fait sur un objet.
Import-csv crée des objets, le résultat de son appel est donc un tableau d'objets.
Si on veut ajouter un membre, une nouvelle propriété ici, il faut utiliser add-member sur un objet ou liste d'objets.
Comme ceci:
$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
 }
Pour ceci :
    #test si les utilisateurs sont déjà dans leur groupe principal
    $mem=  (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object MemberOf).MemberOf =$group
Le code ne correspond pas au commentaire.
Ceci me semble plus approprié (à vérifier):
$group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf
exemple :
'un' -in @('un','deux','trois')
#true
'quatre' -in @('un','deux','trois')
#false
mais si je me souviens bien, $group est un champ à valeur multiple séparées par des ';'.
On doit donc découper une ligne pour créer un tableau :
$group= $UG.group -split ';'
Ce qui implique que l'opérateur -in n'est plus adapté dans ce cas.

Si tu peux éviter de poster des infos d'utilisateur/trice, remplace par 'truc' ou 'bidule', pour un exemple ça marche aussi.
Je m'arrête ici pour le moment, je n'ai pas regarder le dernier pb.

Tutoriels PowerShell

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

Plus d'informations
il y a 3 ans 1 mois - il y a 3 ans 1 mois #30470 par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Ok, merci pour les conseils , je vais regarder tes solutions pour voir si sa fonctionne.

Pour mes utilisateurs/trices ils râleront pas ni la société car personne n'existe , ou alors sa serait pas de chance pour un exercice fictif .

Pour le $group j'ai modifié mon csv; $group = groupe principal des utilisateurs, $groups = groupe secondaire donc ce sont 2 colonnes différentes, donc je pensais refaire une 2ème partie avec cette base de script pour le groupe secondaire sachant que seulement 10 utilisateurs sur 33 ont un groupe secondaire; le test de vérification du csv si vide n'exitera donc pas car il y en a beaucoup qui n'auront pas ce 2ème groupe

j'ai tester la commande :$group -in (GET-ADUSER –Identity $name –Properties MemberOf | Select-Object -ExpandProperty MemberOf) et elle me renvoie systématiquement false

en ce qui concerne:
$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
}

sa me met un message d'erreur disant qu'il arrive pas a interpreter la valeur; de la manière que je l'ai fait je n'ai pas l'erreur , à l'écran je ne vois que des false mais dans le fichier texte hormis le soucis qu'il y a tout le temps le tech4 et toute ces valeurs pour chaque utilisateurs la valeur true ressort.

là je ne capte plus trop les réponses que j'obtiens

ibb.co/6rsHLBv

J'édite encore, à force de supprimer des utilisateurs des groupes je n'arrivais plus à les réintégrer jusqu'à ce que je repense au "false" de réponse du get-aduser, j'ai donc tester ceci et la sa me remet bien mes utilisateurs dans les groupes, par contre je ne comprends pas trop pourquoi la commande get-aduser -Identity $name -Properties memberof | select -expand memberof renvoie un "false":

foreach($UG in $UGp)
{
$sam=$UG.SamAccountName
$name=$UG.UserName
$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)))
        {
        Add-ADGroupMember -Members $UG.SamAccountName  -Identity $UG.group
        write-host -ForegroundColor $MyForegroundColor1 "l'utilisateur $name a ete ajoute au groupe principal: $g1"
        $UG.isInside=$True         
        }

En laissant les choses comme sa, les utilisateurs n'étant pas dans leur groupe y sont intégrés, mais le message d'intégration est  prit en compte pour tous les utilisateurs (même ceux qui étaient déjà dans leurs groupes)

Avec cette version les utilisateurs n'ayant pas de groupes ne sont pas intégrés et le message prit en compte est celui du else pour tout les utilisateurs

        get-aduser -Identity $name -Properties memberof |select -expand 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: $g1"
        $UG.isInsert=$True        
        }
        
        else
        {
        write-host -ForegroundColor $MyForegroundColor1 "l'utilisateur $name est dans son groupe principal: $g1"
        $UG.isInside=$True
        }


en finissant le script avec : add-Content -path "C:\resultatscript.txt" -value $UG.UserName,$group,$UG , le fichier de log renvois du coup ce qu'il faut sauf qu'il est faussé disant que les utilisateurs ont été inserés alors que seul 5 l'ont réellement été.

L'exemple ci-dessous montre un utilisateur qui été déjà dans ses groupes...
CN=gg-direction,OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local
CN=gg-atelier,OU=groupes-securite,OU=entreprise-jacom,DC=domjacom,DC=local
@{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;
isInsert=True; isInside=False}
Dernière édition: il y a 3 ans 1 mois par garrigues.

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

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