Question
aide pour corriger script AD
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30434
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet aide pour corriger script AD
Un oubli enfin 2:
Pour :
$UGs=import-csv -path "C:\users-domjacom.csv" -delimiter ";"
Si possible essaie d'avoir une source de données, dans ce cas les noms d'utilisateurs associés aux groupse peuvent être différent de ceux indiqués dans le premier fichier.
Pour ceci :
Je préfére avoir toutes les infos nécessaires avant de lancer le traitement.
Enfin toutes les saisies de ce script sont supposées être valide, ce qui n'est pas toujours le cas.
Pour :
$UGs=import-csv -path "C:\users-domjacom.csv" -delimiter ";"
Si possible essaie d'avoir une source de données, dans ce cas les noms d'utilisateurs associés aux groupse peuvent être différent de ceux indiqués dans le premier fichier.
Pour ceci :
write-host -ForegroundColor $MyForegroundColor2 "l'utilisateur $name n'a pas de groupe principal"
write-host "voulez vous indiquer un groupe pour l'utilsateur $name ?"
Je préfére avoir toutes les infos nécessaires avant de lancer le traitement.
Enfin toutes les saisies de ce script sont supposées être valide, ce qui n'est pas toujours le cas.
Tutoriels PowerShell
Dernière édition: il y a 3 ans 2 mois par Laurent Dardenne.
Connexion ou Créer un compte pour participer à la conversation.
- garrigues
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30435
par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Oula je vais essayer de comprendre le fonctionnement de tout ce que tu m'a marqué
.
Ma conaissance en powershell était limité à environ 6h lors de ma formation "gestionnaire systèmes et réseaux informatiques".
Je me suis lancé dedant en autodidacte (avec les quelques bases apprises) pour refaire l'exercice que l'on m'avait donné pour mon stage (suite au covid je me suis retrouvé avec un projet individuel).
Du coup un test pour moi se limitait à ce que je t'ai posté (et que l'on m'avait appris) mais quand je vois ce que tu m'a indiqué je m'aperçois que je ne sais clairement pas faire de vrai tests .
voici un exemple de ce que contient le fameux csv USERS que j'utilise sûrement mal du coup (si je me réferre à mes tests) pour la création des utilisateurs.
CN Martine LEROY
DistinguishedName CN=martineleroy,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local
Enable True
GivenName Martine
EmailAddress Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
MailNickname m.leroy
UserName MartineLEROY
SamAccountName martineleroy
SurName LEROY
UserPrincipalName Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
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
Tu as là du coup toutes les colonnes et informations pour un utilisateur dont je dispose (il y a en gros les même informations pour les 32 autres) sauf pour certains ont 1 seul groupe et non 2 comme l'exemple ci-dessus.
Les 2 autres csv eux sont + simples , + courts et fonctionnel de coup.
Exemple pour les OU:
name administration
path ou=entreprise-jacom,dc=domjacom,dc=local
Et pour les groupes
name gg-atelier
path ou=groupes-securite,ou=entreprise-jacom,dc=domjacom,dc=local
Peut être que tu verrais des modifications à faire mais j'ai utilisé les csv donnés par mon ancien formateur qui nous disait que c'était sufisant (il nous avait fait un mini script dont je me suis inspiré au début du miens mais qui ne ressemble en rien à ce à quoi ressemble le script actuellement et qui ne fonctionnait plus ou très mal).
Du coup avec ton aide précieuse et je t'en remercie encore une fois mon script pourris va prendre + de lignes et sera plus ressemblant à un vrai script de pros ( on sent clairement l'amateurisme quand je vois les solutions que tu me propose et que je vais devoir bien étudier pour en comprendre le parfait fonctionnement ( il va peut-être me falloir 6 mois mais j'espère y arriver).
Je vais modifier les variables comme tu me dis avec les simple cote pour l'exportation future pour le fichier de "vérification".
En tout cas merci encore une fois, je vais passer ma soirée pour comprendre exactement le 1er bloc d'instruction "function" que tu m'as indiqué car je suppose qu'il faudra aussi le mettre pour les autres tests (création OU, groupes, et insertion des utilisateurs dans les groupes.
En d'autre termes je suis pas couché
Juste pour comprendre cette partie la on la répète 3 fois c'est normal?
$users=@(
New-UserInfos -Name 'user1' -GivenName 'user1Full' -Path 'path' -SamAccountName 'SamAccountName1' -UserPrincipalName 'User1PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User1SurName' -DisplayName 'user1MailNickname'
New-UserInfos -Name 'user2' -GivenName 'user2Full' -Path 'path' -SamAccountName 'SamAccountName2' -UserPrincipalName 'User2PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User2SurName' -DisplayName 'user2MailNickname'
New-UserInfos -Name 'user3' -GivenName 'user3Full' -Path 'path' -SamAccountName 'SamAccountName3' -UserPrincipalName 'User3PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User3SurName' -DisplayName 'user3MailNickname'
)
Je suppose que c'est pour la structure du fichier de log que l'on fait sa afin qu'il sache l'enchainement ou alors je n'ai rien compris sur cette partie là (ce qui fort probable ).
Du coup l'importation de mon csv ce fait juste apres cette partie avant le 1er foreach non? ou là encore je suis au fraises?
J'essaye de comprendre la logique, je pense que j'aurais bien aimer t'avoir en prof pour pouvoir poser les questions en direct (et tu a l'air bien + calé que le formateur que j'ai eu ).
Je vais testé de refaire cette structure pour les OU et les groupes en attendant les réponses a mes question qui me paraîssent stupides...
Bon j'ai adapté ton exemple pour la ROOT_OU qui est la 1ère étape du script, le code donne ceci
Import-Module ActiveDirectory
#couleurs messages
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")
#création de l'UO racine
$Domain = read-Host "non de votre domaine ex: DC=myDomain,DC=com"
$Root_OU = Read-Host "nom de votre OU racine"
Function New-RootOUInfos{
#New-PSCustomObjectFunction -Noun RootOUInfo -Parameters Name,path,ProtectedFromAccidentalDeletion -File
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='RootOUInfo'; #Permet de typer un objet personnalisé
Name=$ROOT_OU;
Path=$domain;
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$ROU=@(
New-RootOUInfos -Name 'ROOT_OU' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($Root_OU in $ROUs)
{
$Root_OU|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach ($Root_OU in $ROUs)
{
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
$Root_OU.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$Root_OU' est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
$Root_OU.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation '$Root_OU' a fonctionne correctement"
}
}
$ROU
le résultat est le suivant:
ibb.co/k4NRgTh
sauf qu'il ne m'affiche plus du coup a l'écran les messages , est ce normal?,
je vais continuer pour les OU enfants, et les groupes
Ma conaissance en powershell était limité à environ 6h lors de ma formation "gestionnaire systèmes et réseaux informatiques".
Je me suis lancé dedant en autodidacte (avec les quelques bases apprises) pour refaire l'exercice que l'on m'avait donné pour mon stage (suite au covid je me suis retrouvé avec un projet individuel).
Du coup un test pour moi se limitait à ce que je t'ai posté (et que l'on m'avait appris) mais quand je vois ce que tu m'a indiqué je m'aperçois que je ne sais clairement pas faire de vrai tests .
voici un exemple de ce que contient le fameux csv USERS que j'utilise sûrement mal du coup (si je me réferre à mes tests) pour la création des utilisateurs.
CN Martine LEROY
DistinguishedName CN=martineleroy,OU=direction,OU=entreprise-jacom,DC=domjacom,DC=local
Enable True
GivenName Martine
EmailAddress Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
MailNickname m.leroy
UserName MartineLEROY
SamAccountName martineleroy
SurName LEROY
UserPrincipalName Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
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
Tu as là du coup toutes les colonnes et informations pour un utilisateur dont je dispose (il y a en gros les même informations pour les 32 autres) sauf pour certains ont 1 seul groupe et non 2 comme l'exemple ci-dessus.
Les 2 autres csv eux sont + simples , + courts et fonctionnel de coup.
Exemple pour les OU:
name administration
path ou=entreprise-jacom,dc=domjacom,dc=local
Et pour les groupes
name gg-atelier
path ou=groupes-securite,ou=entreprise-jacom,dc=domjacom,dc=local
Peut être que tu verrais des modifications à faire mais j'ai utilisé les csv donnés par mon ancien formateur qui nous disait que c'était sufisant (il nous avait fait un mini script dont je me suis inspiré au début du miens mais qui ne ressemble en rien à ce à quoi ressemble le script actuellement et qui ne fonctionnait plus ou très mal).
Du coup avec ton aide précieuse et je t'en remercie encore une fois mon script pourris va prendre + de lignes et sera plus ressemblant à un vrai script de pros ( on sent clairement l'amateurisme quand je vois les solutions que tu me propose et que je vais devoir bien étudier pour en comprendre le parfait fonctionnement ( il va peut-être me falloir 6 mois mais j'espère y arriver).
Je vais modifier les variables comme tu me dis avec les simple cote pour l'exportation future pour le fichier de "vérification".
En tout cas merci encore une fois, je vais passer ma soirée pour comprendre exactement le 1er bloc d'instruction "function" que tu m'as indiqué car je suppose qu'il faudra aussi le mettre pour les autres tests (création OU, groupes, et insertion des utilisateurs dans les groupes.
En d'autre termes je suis pas couché
Juste pour comprendre cette partie la on la répète 3 fois c'est normal?
$users=@(
New-UserInfos -Name 'user1' -GivenName 'user1Full' -Path 'path' -SamAccountName 'SamAccountName1' -UserPrincipalName 'User1PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User1SurName' -DisplayName 'user1MailNickname'
New-UserInfos -Name 'user2' -GivenName 'user2Full' -Path 'path' -SamAccountName 'SamAccountName2' -UserPrincipalName 'User2PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User2SurName' -DisplayName 'user2MailNickname'
New-UserInfos -Name 'user3' -GivenName 'user3Full' -Path 'path' -SamAccountName 'SamAccountName3' -UserPrincipalName 'User3PrincipalName' `
-EmailAddress 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.' -SurName 'User3SurName' -DisplayName 'user3MailNickname'
)
Je suppose que c'est pour la structure du fichier de log que l'on fait sa afin qu'il sache l'enchainement ou alors je n'ai rien compris sur cette partie là (ce qui fort probable ).
Du coup l'importation de mon csv ce fait juste apres cette partie avant le 1er foreach non? ou là encore je suis au fraises?
J'essaye de comprendre la logique, je pense que j'aurais bien aimer t'avoir en prof pour pouvoir poser les questions en direct (et tu a l'air bien + calé que le formateur que j'ai eu ).
Je vais testé de refaire cette structure pour les OU et les groupes en attendant les réponses a mes question qui me paraîssent stupides...
Bon j'ai adapté ton exemple pour la ROOT_OU qui est la 1ère étape du script, le code donne ceci
Import-Module ActiveDirectory
#couleurs messages
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")
#création de l'UO racine
$Domain = read-Host "non de votre domaine ex: DC=myDomain,DC=com"
$Root_OU = Read-Host "nom de votre OU racine"
Function New-RootOUInfos{
#New-PSCustomObjectFunction -Noun RootOUInfo -Parameters Name,path,ProtectedFromAccidentalDeletion -File
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='RootOUInfo'; #Permet de typer un objet personnalisé
Name=$ROOT_OU;
Path=$domain;
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$ROU=@(
New-RootOUInfos -Name 'ROOT_OU' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($Root_OU in $ROUs)
{
$Root_OU|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach ($Root_OU in $ROUs)
{
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
$Root_OU.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$Root_OU' est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
$Root_OU.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation '$Root_OU' a fonctionne correctement"
}
}
$ROU
le résultat est le suivant:
ibb.co/k4NRgTh
sauf qu'il ne m'affiche plus du coup a l'écran les messages , est ce normal?,
je vais continuer pour les OU enfants, et les groupes
Dernière édition: il y a 3 ans 2 mois par garrigues.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30438
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet aide pour corriger script AD
Salut,
>>Ma connaissance en powershell était limité à environ 6h
Il faut minimum 1 semaine.
>>Je me suis lancé dedans en autodidacte
C'est plus long.
>>je m'aperçois que je ne sais clairement pas faire de vrai tests
Chaque chose en son temps
>>j'ai utilisé les csv donnés par mon ancien formateur qui nous disait que c'était suffisant
Bah en 6 heure faut se faciliter la vie et aller à l'essentiel, entre 'être capable de ' et comprendre cela ne demande pas la même durée.
>>on sent clairement l'amateurisme
Je connais des pro qui codent comme des gorets, donc amateur c'est pas mal !
>> le 1er bloc d'instruction "function" que tu m'as indiqué
Cela crée un jeu de test avec du remplissage, c'était juste pour proposer un code complet.
>>Juste pour comprendre cette partie la on la répète 3 fois c'est normal?
Oui, il y trois appel de fonction et chaque appel crée un objet différent, la syntaxe @() permet d'insérer plusieurs instructions afin de construire un tableau d'objet.
Le séparateur d'instruction est ici le retour chariot (sinon le point virgule) et le caractère ` permet de continuer l'instruction sur une autre ligne.
C'est une construction propre à Powershell.
>>Je suppose que c'est pour la structure du fichier de log
Pas vraiment, cela regroupe des informations, le cmdlet import-csv , à partir d'une ligne de texte structuré, créé un objet. Une linge du csv = 1 objet n ligne n objets.
>>Du coup l'importation de mon csv ce fait juste après cette partie
C'est une démo.
>>pouvoir poser les questions en direct
Tu as ce forum qui fera l'affaire.
>> + calé que le formateur que j'ai eu
On ne peut se faire un avis sur 6 heures
>>qui me paraissent stupides...
Faut bien commencer par le début.
>>j'ai adapté ton exemple pour la ROOT_OU qui est la 1ère étape du script, le code donne ceci
>>sauf qu'il ne m'affiche plus du coup a l'écran les messages , est ce normal?,
Voir ceci :
la variable $Rous n'existe pas, Powershell est un langage dynamique et permissif.
Si la variable n'existe pas, pas de pb il continue.
>>Ma connaissance en powershell était limité à environ 6h
Il faut minimum 1 semaine.
>>Je me suis lancé dedans en autodidacte
C'est plus long.
>>je m'aperçois que je ne sais clairement pas faire de vrai tests
Chaque chose en son temps
>>j'ai utilisé les csv donnés par mon ancien formateur qui nous disait que c'était suffisant
Bah en 6 heure faut se faciliter la vie et aller à l'essentiel, entre 'être capable de ' et comprendre cela ne demande pas la même durée.
>>on sent clairement l'amateurisme
Je connais des pro qui codent comme des gorets, donc amateur c'est pas mal !
>> le 1er bloc d'instruction "function" que tu m'as indiqué
Cela crée un jeu de test avec du remplissage, c'était juste pour proposer un code complet.
>>Juste pour comprendre cette partie la on la répète 3 fois c'est normal?
Oui, il y trois appel de fonction et chaque appel crée un objet différent, la syntaxe @() permet d'insérer plusieurs instructions afin de construire un tableau d'objet.
Le séparateur d'instruction est ici le retour chariot (sinon le point virgule) et le caractère ` permet de continuer l'instruction sur une autre ligne.
C'est une construction propre à Powershell.
>>Je suppose que c'est pour la structure du fichier de log
Pas vraiment, cela regroupe des informations, le cmdlet import-csv , à partir d'une ligne de texte structuré, créé un objet. Une linge du csv = 1 objet n ligne n objets.
>>Du coup l'importation de mon csv ce fait juste après cette partie
C'est une démo.
>>pouvoir poser les questions en direct
Tu as ce forum qui fera l'affaire.
>> + calé que le formateur que j'ai eu
On ne peut se faire un avis sur 6 heures
>>qui me paraissent stupides...
Faut bien commencer par le début.
>>j'ai adapté ton exemple pour la ROOT_OU qui est la 1ère étape du script, le code donne ceci
>>sauf qu'il ne m'affiche plus du coup a l'écran les messages , est ce normal?,
Voir ceci :
$ROU=@(
New-RootOUInfos -Name 'ROOT_OU' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($Root_OU in $ROUs)...
la variable $Rous n'existe pas, Powershell est un langage dynamique et permissif.
Si la variable n'existe pas, pas de pb il continue.
foreach ($Root_OU in $ROUs) {'ok'}
#ras
Set-StrictMode -Version latest #Ceinture/bretelle/Para chute
foreach ($Root_OU in $ROUs) {'ok'}
#Impossible d’extraire la variable « $ROUs », car elle n’a pas été définie.
Tutoriels PowerShell
Dernière édition: il y a 3 ans 2 mois par Laurent Dardenne.
Connexion ou Créer un compte pour participer à la conversation.
- garrigues
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30439
par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Rebonjour, bon j'avance un peu plus, quelques petits soucis de fautes dans les noms me rallentissent un peu mais je comprends mieux la decompostion d'un script , les fonctions , les vrai tests et ce grâce a ton aide.
Je t'en remercie encore une fois de plus (je pense te remercier encore quelques fois avant la fin de mon script )
Pour la partie "root_ou" c'était un peu spécial donc j'ai tenté un peu en improvisant car la "root_ou" est définie par l'utilisateur et non pas dans le fichier ,(j'ai pensé a tricher et la rajouter en 1er dans mon csv pour qu'elle se fasse en auto , mais comme c'est pas bien de tricher je l'ai pas fait .
Je l'ai donc définie avec une variable qui n'existe effectivement pas car de ce que j'ai compris un "foreach" a toujours 2 variables, un "for" tout court n'aurait pas été bon non plus car ce n'est pas le même fonctionnement (ou alors j'ai mal compris la boucle "for").
Je rectifie l'énorme bétise dite précédement car j'avais pas réfléchi comme il fallait: root_ou est bien dans un endroit dont j'avais la variable puisqu'elle est a la racine du domaine, donc mes foreach sont devenus ceci:
foreach ($Root_OU in $Domain)
Je réédite car en faisant sa en fait le script le me créé plus la root_ou mais il créé le nom de domaine en tant que nouvelle root_ou.
il faut maintenant que je trouve comment indiquer a se foutu script que $domain n'est pas une ou mais bien le contrôleur de domaine (ce qu'il arrivait a reconnaître avant ...).
Du coup je suis entrain de bosser sur la partie groupe.
je pense du coup que le petit soucis d'exportation de resultat de ma "root_ou" doit venir de ma boucle car il me marque ceci dans le bloc texte récapitulatif:
@{Name=entreprise-jacom; Path=dc=domjacom,dc=local; ProtectedFromAccidentalDeletion=false}
True
alors que pour mes uo enfants la il me sort tout les résultats
@{name=administration; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=commerce; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=developpement; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=direction; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=expedition; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=maintenance; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=marketing; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=production; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=secretariat; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=groupes-securite; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
le isExist et isCreated sur la root_ou ne s'inscrit pas....
Je testerais tout a l'heure ce que tu m'a marqué.
Voici le résultat de la partie OU enfant
#creation OU enfant
$OUs=import-csv -path "C:\OU-AP.csv" -delimiter ";"
Function New-OUInfos{
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='OUInfos';
Name=$ou.name;
Path='$Root_OU','$Domain';
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$OU=@(
New-OUInfos -Name 'ou1' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
New-OUInfos -Name 'ou2' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
New-OUInfos -Name 'ou3' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($ou in $OUs)
{
$ou|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach($ou in $OUs){
$parametersou=@{
Name= $ou.name
Path= $ou.path
}
if ((Get-ADOrganizationalUnit -filter "name -like'*$($ou.name)'"))
{
$OU1= $ou.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$ou' est deja presente dans l'AD"
}
else
{
New-ADOrganizationalUnit @parametersou -ProtectedFromAccidentalDeletion $false
$OU2= $ou.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'unite d'organisation '$ou' a fonctionne correctement"
}
$OU
add-Content -path "C:\resultatscript.txt" -value $OU1,$OU2,$OU
}
Je t'en remercie encore une fois de plus (je pense te remercier encore quelques fois avant la fin de mon script )
Pour la partie "root_ou" c'était un peu spécial donc j'ai tenté un peu en improvisant car la "root_ou" est définie par l'utilisateur et non pas dans le fichier ,(j'ai pensé a tricher et la rajouter en 1er dans mon csv pour qu'elle se fasse en auto , mais comme c'est pas bien de tricher je l'ai pas fait .
Je l'ai donc définie avec une variable qui n'existe effectivement pas car de ce que j'ai compris un "foreach" a toujours 2 variables, un "for" tout court n'aurait pas été bon non plus car ce n'est pas le même fonctionnement (ou alors j'ai mal compris la boucle "for").
Je rectifie l'énorme bétise dite précédement car j'avais pas réfléchi comme il fallait: root_ou est bien dans un endroit dont j'avais la variable puisqu'elle est a la racine du domaine, donc mes foreach sont devenus ceci:
foreach ($Root_OU in $Domain)
Je réédite car en faisant sa en fait le script le me créé plus la root_ou mais il créé le nom de domaine en tant que nouvelle root_ou.
il faut maintenant que je trouve comment indiquer a se foutu script que $domain n'est pas une ou mais bien le contrôleur de domaine (ce qu'il arrivait a reconnaître avant ...).
Du coup je suis entrain de bosser sur la partie groupe.
je pense du coup que le petit soucis d'exportation de resultat de ma "root_ou" doit venir de ma boucle car il me marque ceci dans le bloc texte récapitulatif:
@{Name=entreprise-jacom; Path=dc=domjacom,dc=local; ProtectedFromAccidentalDeletion=false}
True
alors que pour mes uo enfants la il me sort tout les résultats
@{name=administration; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=commerce; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=developpement; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=direction; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=expedition; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=maintenance; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=marketing; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=production; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=secretariat; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
True
@{name=groupes-securite; path=ou=entreprise-jacom,dc=domjacom,dc=local; isExist=True; isCreated=False}
le isExist et isCreated sur la root_ou ne s'inscrit pas....
Je testerais tout a l'heure ce que tu m'a marqué.
Voici le résultat de la partie OU enfant
#creation OU enfant
$OUs=import-csv -path "C:\OU-AP.csv" -delimiter ";"
Function New-OUInfos{
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='OUInfos';
Name=$ou.name;
Path='$Root_OU','$Domain';
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$OU=@(
New-OUInfos -Name 'ou1' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
New-OUInfos -Name 'ou2' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
New-OUInfos -Name 'ou3' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($ou in $OUs)
{
$ou|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach($ou in $OUs){
$parametersou=@{
Name= $ou.name
Path= $ou.path
}
if ((Get-ADOrganizationalUnit -filter "name -like'*$($ou.name)'"))
{
$OU1= $ou.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$ou' est deja presente dans l'AD"
}
else
{
New-ADOrganizationalUnit @parametersou -ProtectedFromAccidentalDeletion $false
$OU2= $ou.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'unite d'organisation '$ou' a fonctionne correctement"
}
$OU
add-Content -path "C:\resultatscript.txt" -value $OU1,$OU2,$OU
}
Dernière édition: il y a 3 ans 2 mois par garrigues.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 3 ans 2 mois #30440
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet aide pour corriger script AD
Salut,
Le foreach à 2 variables effectivement une externe (un tableau d'objets) et une 'interne' (un objet du tableau en cours d'itération)
Pour ton pb de Domaine peut-être est-ce dû à ces erreurs ( notée #!!!) :pour ceci :
$OU2= $ou.isCreated=$True
C'est une affectation multiple, $ou2 vaut true :
Prête attention à tes noms de variable, $Ou, $Ou1 etc,ça commence mal
Le foreach à 2 variables effectivement une externe (un tableau d'objets) et une 'interne' (un objet du tableau en cours d'itération)
Pour ton pb de Domaine peut-être est-ce dû à ces erreurs ( notée #!!!) :
#création de l'UO racine
$Domain = read-Host "non de votre domaine ex: DC=myDomain,DC=com"
$Root_OU = Read-Host "nom de votre OU racine"
Function New-RootOUInfos{
#New-PSCustomObjectFunction -Noun RootOUInfo -Parameters Name,path,ProtectedFromAccidentalDeletion -File
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='RootOUInfo';
Name=$ROOT_OU; #!!! Utilise le paramètre $name
Path=$domain;
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$ROU=@(
#!!! Utilise la variable $Root_OU
New-RootOUInfos -Name 'ROOT_OU' -Path 'path' -ProtectedFromAccidentalDeletion 'false' `
)
foreach ($Root_OU in $ROUs) #!!! tu écrases ta saisie dans $Root_OU
{
$Root_OU|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
$OU2= $ou.isCreated=$True
C'est une affectation multiple, $ou2 vaut true :
$a=$b=-1
$a;$b
Prête attention à tes noms de variable, $Ou, $Ou1 etc,ça commence mal
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- garrigues
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 3 ans 2 mois - il y a 3 ans 2 mois #30441
par garrigues
Réponse de garrigues sur le sujet aide pour corriger script AD
Bon la je suis entrain de devenir fou a force, je ne comprend rien a ce qu'il se passe.
Quand j'adapte les tests sur le papier comme je l'ai dit dans mon précédent message j'ai bien une variable qui est $domaine qui correspond à la racine du domaine là ou doit se créér ma Root_OU.
J'ai donc fait ceci::
#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{
#New-PSCustomObjectFunction -Noun RootOUInfo -Parameters Name,path,ProtectedFromAccidentalDeletion -File
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='RootOUInfo'; #Permet de typer un objet personnalisé
Name=$ROOT_OU;
Path='$Domain';
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$ROU=@(
New-RootOUInfos -Name 'root_ou1' -Path 'path' -ProtectedFromAccidentalDeletion 'false'
)
foreach ($Root_OU in $Domain)
{
$Root_OU|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach ($Root_OU in $Domain)
{
$parametersroot_ou=@{
Name= $Root_OU
Path= '$Domain'
}
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
$ROU1= $Root_OU.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$Root_OU' est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit @parametersroot_ou -ProtectedFromAccidentalDeletion $false
$ROU2= $Root_OU.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation '$Root_OU' a fonctionne correctement"
}
$ROU
add-Content -path "C:\resultatscript.txt" -value $ROU1,$ROU2,$ROU
}
sauf qu'il ne me créé jamais la Root_OU mais systématiquement une OU avec le nom du domaine
New-ADOrganizationalUnit : La syntaxe du nom de l’objet est incorrecte
Au caractère Ligne:61 : 8
+ New-ADOrganizationalUnit @parametersroot_ou -ProtectedFromAcci ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (OU=DC\=domjacom\,DC\=local,$Domain:String) [New-ADOr
ganizationalUnit], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Com
mands.NewADOrganizationalUnit
La propriété «isCreated» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut
être définie.
Au caractère Ligne:62 : 15
+ $ROU2= $Root_OU.isCreated=$True
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : ( , RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
la creation de l'organisation 'DC=domjacom,DC=local' a fonctionne correctement
alors qu'avec ma 1ère méthode qui était:
#Chargement des modules active directory
Import-Module ActiveDirectory
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")
#création de l'UO racine
$Domain = read-Host "non de votre domaine ex: DC=myDomain,DC=com"
$Root_OU = Read-Host "nom de votre OU racine"
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'")){
write-host -ForegroundColor $MyForegroundColor1 "l'organisation $Root_OU est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation $Root_OU a fonctionne correctement"
}
résultat:
non de votre domaine ex: DC=myDomain,DC=com : dc=domjacom,dc=local
nom de votre OU racine : jacomo
la creation de l'organisation jacomo a fonctionne correctement
J'ai cherché des heures sur internet pour voir comment spécifier que $Domaine etait le contrôleur de domaine mais rien a faire alors qu'avec la méthode 2 le script reconnaît qu'il s'agit du contrôleur de domaine et m'intègre bien la Root_Ou a l'intérieur.
Si quelqu'un a une idée je suis preneur car jusque là je n'arrive pas a avancer sur cette partie (ou alors il faut que je "triche en intégrant ma Root_OU dans mon csv en 1er et que tout se fasse en même temp avec la partie 2 du script...
Merci d'avance pour les suggestions ou idées que vous pourrez me donner pour avancer sur ce soucis
Vu que la 1ère partie foirait avec les vrais tests j'ai repris ce que j'avais fait au début en modifiant un peu pour avoir un équivalant de log
#Chargement des modules active directory
Import-Module ActiveDirectory
$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"
$ROU1= "l'organisation $Root_OU est deja presente dans l'AD"
$ROU2= "la creation de l'organisation $Root_OU a fonctionne correctement"
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
write-host -ForegroundColor $MyForegroundColor1 $ROU1
add-Content -path "C:\resultatscript.txt" -value "OU=$Root_OU,$Domain exist=true"
}
else
{
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
write-host -ForegroundColor $MyForegroundColor $ROU2
add-Content -path "C:\resultatscript.txt" -value "OU=$Root_OU,$Domain created=true"
}
la sortie dans mon fichier texte donne donc ceci:
OU=test6,DC=Domjacom,DC=local created=true
ou quand on essaye de la recréér:
OU=test6,DC=Domjacom,DC=local exist=true
Quand j'adapte les tests sur le papier comme je l'ai dit dans mon précédent message j'ai bien une variable qui est $domaine qui correspond à la racine du domaine là ou doit se créér ma Root_OU.
J'ai donc fait ceci::
#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{
#New-PSCustomObjectFunction -Noun RootOUInfo -Parameters Name,path,ProtectedFromAccidentalDeletion -File
param(
[Parameter(Mandatory=$True,position=0)]
$Name,
[Parameter(Mandatory=$True,position=1)]
$path,
[Parameter(Mandatory=$True,position=2)]
$ProtectedFromAccidentalDeletion
)
[pscustomobject]@{
PSTypeName='RootOUInfo'; #Permet de typer un objet personnalisé
Name=$ROOT_OU;
Path='$Domain';
ProtectedFromAccidentalDeletion=$ProtectedFromAccidentalDeletion;
}
}
$ROU=@(
New-RootOUInfos -Name 'root_ou1' -Path 'path' -ProtectedFromAccidentalDeletion 'false'
)
foreach ($Root_OU in $Domain)
{
$Root_OU|
Add-member -MemberType NoteProperty -Name isExist -Value $false -PassThru|
Add-member -MemberType NoteProperty -Name isCreated -Value $false
}
foreach ($Root_OU in $Domain)
{
$parametersroot_ou=@{
Name= $Root_OU
Path= '$Domain'
}
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
$ROU1= $Root_OU.IsExist=$True
write-host -ForegroundColor $MyForegroundColor1 "l'organisation '$Root_OU' est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit @parametersroot_ou -ProtectedFromAccidentalDeletion $false
$ROU2= $Root_OU.isCreated=$True
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation '$Root_OU' a fonctionne correctement"
}
$ROU
add-Content -path "C:\resultatscript.txt" -value $ROU1,$ROU2,$ROU
}
sauf qu'il ne me créé jamais la Root_OU mais systématiquement une OU avec le nom du domaine
New-ADOrganizationalUnit : La syntaxe du nom de l’objet est incorrecte
Au caractère Ligne:61 : 8
+ New-ADOrganizationalUnit @parametersroot_ou -ProtectedFromAcci ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (OU=DC\=domjacom\,DC\=local,$Domain:String) [New-ADOr
ganizationalUnit], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Com
mands.NewADOrganizationalUnit
La propriété «isCreated» est introuvable dans cet objet. Vérifiez qu’elle existe et qu’elle peut
être définie.
Au caractère Ligne:62 : 15
+ $ROU2= $Root_OU.isCreated=$True
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : ( , RuntimeException
+ FullyQualifiedErrorId : PropertyAssignmentException
la creation de l'organisation 'DC=domjacom,DC=local' a fonctionne correctement
alors qu'avec ma 1ère méthode qui était:
#Chargement des modules active directory
Import-Module ActiveDirectory
$MyForegroundColor=@("Green")
$MyForegroundColor1=@("Yellow")
$MyForegroundColor2=@("red")
#création de l'UO racine
$Domain = read-Host "non de votre domaine ex: DC=myDomain,DC=com"
$Root_OU = Read-Host "nom de votre OU racine"
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'")){
write-host -ForegroundColor $MyForegroundColor1 "l'organisation $Root_OU est deja presente dans l'AD"
}
else {
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
write-host -ForegroundColor $MyForegroundColor "la creation de l'organisation $Root_OU a fonctionne correctement"
}
résultat:
non de votre domaine ex: DC=myDomain,DC=com : dc=domjacom,dc=local
nom de votre OU racine : jacomo
la creation de l'organisation jacomo a fonctionne correctement
J'ai cherché des heures sur internet pour voir comment spécifier que $Domaine etait le contrôleur de domaine mais rien a faire alors qu'avec la méthode 2 le script reconnaît qu'il s'agit du contrôleur de domaine et m'intègre bien la Root_Ou a l'intérieur.
Si quelqu'un a une idée je suis preneur car jusque là je n'arrive pas a avancer sur cette partie (ou alors il faut que je "triche en intégrant ma Root_OU dans mon csv en 1er et que tout se fasse en même temp avec la partie 2 du script...
Merci d'avance pour les suggestions ou idées que vous pourrez me donner pour avancer sur ce soucis
Vu que la 1ère partie foirait avec les vrais tests j'ai repris ce que j'avais fait au début en modifiant un peu pour avoir un équivalant de log
#Chargement des modules active directory
Import-Module ActiveDirectory
$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"
$ROU1= "l'organisation $Root_OU est deja presente dans l'AD"
$ROU2= "la creation de l'organisation $Root_OU a fonctionne correctement"
if ((Get-ADOrganizationalUnit -filter "name -like'*$($Root_OU)'"))
{
write-host -ForegroundColor $MyForegroundColor1 $ROU1
add-Content -path "C:\resultatscript.txt" -value "OU=$Root_OU,$Domain exist=true"
}
else
{
New-ADOrganizationalUnit -Name $Root_OU -Path $Domain -ProtectedFromAccidentalDeletion $false
write-host -ForegroundColor $MyForegroundColor $ROU2
add-Content -path "C:\resultatscript.txt" -value "OU=$Root_OU,$Domain created=true"
}
la sortie dans mon fichier texte donne donc ceci:
OU=test6,DC=Domjacom,DC=local created=true
ou quand on essaye de la recréér:
OU=test6,DC=Domjacom,DC=local exist=true
Dernière édition: il y a 3 ans 2 mois par garrigues.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.128 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- aide pour corriger script AD