Question
création multi user AD
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
corly écrit:
Détaille le pour TOI, c'est ton projet pas le mien, moi j'en ai un en cours qui me prend tout mon temps.
Il s'agit déjà de spécifier/détailler ce que tu dois faire.
...
Je vais détailler:
Encore une fois, découpe ton projet par tâche, ensuite pour chaque tâche crée un post sur ce forum, dans lequel tu te concentres sur UN sujet à la fois, ainsi, je pense que tu pourras trouver de l'aide + facilement.
Avec un peu de méthode ton projet n'a rien d'insurmontable.
Pour l'export XL voir ce post :
powershell-scripting.com/index.php?optio...30&catid=14#2630
Il reste à implémenter une boucle si le fichier contient + onglets/feuilles, ce qui fait que la méthode doit recevoir une structure de donnée associant un n° d'onglet à un nom de fichier.
corly écrit:
Spécification : régle de nommages AD.ce n'est pas gênant en soi mais cela serait + \"conforme\" à la réalité..
C'est un champ calculé, dans un premier temps insére le nom. Tu affineras + tard. Sous réserve d'avoir une plateforme de test reconstructible rapidement.
corly écrit:
Je te rassures, et sans vouloir t'offenser, tu ne risques rien sur ce point. Pourquoi donc s'excuser de ne pas connaitre ?au risque de passer pour un noob,
corly écrit:
Précise un nom complet dans une variable, c'est plus simple. Ainsi tu contrôles sa validité une seule fois.je me demandais si je devais modifier la commande d'import en spécifiant le fichier csv
corly écrit:
Rien ne t'empêches de placer des \"bouchons\" dans ton script principal. C'est à dire du code qui simule le résultat :n'ayant pas de PS fonctionnel avec le module AD pour le moment (je ne verrai ça que cet aprem), je ne peu pas faire de test...
[code:1]
function New-ADUSer {
param ($Name)
write-host \"Crée l'utilisateur $user\"«»)
}
[/code:1]
corly écrit:
L'AD n'étant pas mon domaine de compétence, applique le principe énoncé au début de ce post.une autre question, dans le cas où je voudrai avoir une structure d'AD correcte...
corly écrit:
Le message n'est pas assez clair ?edit: après test sur un PS sans module AD, la commande avec la variable me retourne
[code:1]Import-Csv : Impossible de lier l'argument au paramètre « Path », car il s'agit d'une chaîne vide.
[/code:1]
Utilise dans ton code le cmdlet Write-Debug , exemple :
[code:1]
Write-Debug \"user=$user\"
[/code:1]
Puis ajoute dans ton profile utilisateur PS, les fonctions suivantes :
[code:1]
#Crée un prompt imbriqué, permet de placer une sotre de point d'arrêt dans du code
#saisie Exit pour continuer l'exécution du code \"parent\".
function NestedPrompt{$host.EnterNestedPrompt()}
function dbgOn {$global:«»DebugPreference=\"continue\"}
function dbgOff {$global:«»DebugPreference=\"Silentlycontinue\"}
[/code:1]
Appel dbgon avant d'exécuter ton coder à débuger, ainsi chaque instruction Write-debug affichera des traces sur la console.
Une fois le code validé Appel dbgoff.
Tu peux aussi donc procéder ainsi :
[code:1]
#Main
dbgoff
Function1
dbgon
Function2
Function3
dbgoff
Function4
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- BENOIT Damien
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
Pour le moment j'ai une colonne \"nom\", une \"prénom\".
pour le moment le userlogon est \"nom.prénom\", mais il est vrai que comme dans l'exemple de script de Damien Benoit, j'ai plus eu l'habitude de la syntaxe \"nomp\".
j'ai trouvé une formule permettant de faire \"nom P.\" mais pas celle permettant de ne pas mettre l'espace..
ce n'est pas gênant en soi mais cela serait + \"conforme\" à la réalité..
La ligne [code:1]$displayname = $user.Surname +\" \"+ $user.GivenName[/code:1] est une simple concaténation de chaine. Ce qui donne \"DUPONT Tom\".
Autre question, dans le script fourni également par Damien Benoit il y a la phase import du csv :
[code:1]$ImportCSV = import-csv -path \"$fichier\" -delimiter \";\"[/code:1]
alors, au risque de passer pour un noob, je me demandais si je devais modifier la commande d'import en spécifiant le fichier csv ou si la variable gère ça automatiquement (puisque j'avais vu la commande qui \"spécifie\") comme [code:1]Import-CSV ./test_afpa.csv –Delimiter “;”[/code:1]
Je suis passé par une variable qui est affecté en paramètre lorsque je lance le script [code:1]NomDuScript.ps1 -fichier xxxx.csv[/code:1] ou xxx.csv est le contenu de la variable $fichier, je trouve cela plus facile d'utilisation.
une autre question, dans le cas où je voudrai avoir une structure d'AD correcte (dans mon cas, la fusion des 2 sites seront sous 1 seul domaine, mais nous séparerons les sites avec une OU \"site A\" et une \"site B\" qui auront une certaine organisation par la suite) et mettre un utilisateurs (toujours lors de la création multiple si c'est possible) dans les bonnes OU.
je m'explique, si Joe Black travaille dans le service comptabilité du site B, comment indique-t-on l'arborescence afin qu'il n'y ait pas une OU comptabilité hors des OU A & B crée mais bien B > Compta..
merci
Auras-tu :
Utilisateurs
Site A
|_ Comptabilité
|
Site B
|_ Comptabilité
Ou
?Utilisateurs
Site A
|_ ComptabilitéA
|
Site B
|_ ComptabilitéB
Je te conseille déjà de regarder sur le script que j'ai posté [code:1]-Path $OUDN[/code:1] de la commande New-ADUser, Cela dépose l'utilisateur dans l'OU spécifié dans la variable $OUDN dans le cas de mon script.
Étant moi même encore débutant, je place un peu partout lorsque je fais des scripts des Write-Host (que je retire évidement par la suite...) à la suite de mes variables afin de déterminer ce que contiennent mes variables et ou bloque le script.
Par exemple :
[code:1]
$nom = $user.Surname
Write-Host \"Nom=\" $nom
[/code:1]
Mais comme le dit Laurent Dardenne, il faut mieux structurer et bien poser ce que tu souhaite, ça évite de se noyer.<br><br>Message édité par: Damien BENOIT, à: 28/11/11 14:38
Connexion ou Créer un compte pour participer à la conversation.
- Gaëtan Mandon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
merci pour vos conseils avisés..
alors, premièrement oui j'ai une plateforme de test, il est illusoire de croire que mon script sera fontionnel dès le départ donc afin de ne pas embrouiller mes camarades je fais mes tests de mon côté.
pour mon \"souci\" de nomP sans espace, j'avais remarqué cet espace dans la fonction et je l'avais enlevé sans meilleur résultat..
j'ai trouvé un super outil: WiSAIS ( blogs.technet.com/b/pierrc/archive/2010/...ilisateurs-dchp.aspx )sur lequel j'ai occulté la phase création du csv automatisé (long quand on doit entrer utilisateur par utilisateur) et préféré modifier ma base afin qu'elle soit conforme au script, j'ai également occulté le xml puisque je pars sur un server déja installé. Bref, je ne me sers que du script de création d'user que j'ai modifié en \"fixant\" les paramètres domaine ou qui appelait 1 variable d'un fichier que je ne voulais pas utiliser..
j'ai quelques erreurs et pour le moment ca ne me crée qu'un utilisateur qui a pour nom le 1er nom de la liste mais ses infos sont celles du dernier de la liste..
voila où j'en suis actuellement, je reviendrai vous tenir au courant de mon avancement...
edit: j'avais oublié 1 partie ...
Auras-tu :
Utilisateurs
Site A
|_ Comptabilité
|
Site B
|_ Comptabilité
Ou
Utilisateurs
Site A
|_ ComptabilitéA
|
Site B
|_ ComptabilitéB
?
notre plan est basé dans le style de ton 1er exemple..
1 OU pour chaque site, mais à l'intérieur les \"sous OU\" sont les mêmes..
(mais pour le moment déjà j'essaie de faire simple, pas de distinction de site...)<br><br>Message édité par: corly, à: 30/11/11 10:17
Connexion ou Créer un compte pour participer à la conversation.
- Gaëtan Mandon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
voilà, j'ai bien avancé..
j'arrive dorénavant à créer tous mes utilisateurs et à les placer dans mes OU.
comme précisé dans mon ancien post, j'ai fait l'impasse sur quelques infos et enfin ça fonctionne.
le script me renvoie une erreur sur un \"setInfo\" qui a \"()\", mais le problème est que si j'enlève cette parenthèse vide, rien ne fonctionne...
j'ai appliqué votre méthode que j'ai nommée \"dis moi ce que tu fais...\" avec bon nombre de write-Host ce qui m'a permit d'avancer.
[code:1]#################################
# WiSAIS (Windows Server Automated Installation Solution)
#
# Desc : Importation des utilisateurs du fichier user.csv et ajout dans Active Directory
# Auteurs : Pierre Chesne (MS France), Samy Girard (MS France), Antoine Journaux (MS France)
# Version : 1.0
#
#################################
Write-Host \"Création des utilisateurs dans l'Active Directory en cours ...\"
#import du module Active Directory
Import-Module activedirectory
#création des OU \"Echirolles\" et \"Pont-de-Claix\"
$objDomain = [ADSI]\"LDAP://localhost:389/dc=activup,dc=local\"
$objOU = $objDomain.Create(\"organizationalUnit\", \"ou=Echirolles\")
$objOU.SetInfo()
$objDomain = [ADSI]\"LDAP://localhost:389/dc=activup,dc=local\"
$objOU = $objDomain.Create(\"organizationalUnit\", \"ou=Pont-de-Claix\")
$objOU.SetInfo()
#connexion à l'Active Directory
$objOU=[ADSI]\"LDAP://localhost:389/DC=activup,DC=local\"
if($objOU.Children -ne $null) {
# importation des data du fichier csv (se placer dans le dossier !!)
$dataSource=import-csv .\user_ech.csv
$cpt = 0
ForEach($dataRecord in $dataSource) {
$ou=$dataRecord.service
#vérification de l'existance de l'OU
if(($objOU.Children | where {$_.Path -match \"OU=$ou\"}) -eq $null){
#si elle n'existe pas on la crée
$objOU = $objOU.create(\"organizationalUnit\", \"ou=\"+$ou)
$objOU.SetInfo()
}
else {
#sinon on place le curseur dessus pour que l'utilisateur soit crée dans la bonne OU
$objOU = $objOU.Children.Find(\"OU=$ou\")
}
$SamAccountName=$dataRecord.login
$GivenName=$dataRecord.prenom
$sn=$dataRecord.nom
$cn=$GivenName + \" \" + $sn
$displayName=$cn
$description=$dataRecord.description
$UserPrincipalname=$SamAccountName +\"@activup.local\"
$telephoneNumber=$dataRecord.tel_bureau
$mail=$dataRecord.mail
#$homePhone=$dataRecord.tel_perso
$mobile=$dataRecord.tel_mobile
#on crée l'objet utilisateur dans Active Directory
$objUser=$objOU.Create(\"User\",\"CN=\"+$cn)
Write-Host \"$cn\"
$objUser.Put(\"SamAccountName\",$SamAccountName)
Write-Host \"$SamAccountName\"
$objUser.Put(\"UserPrincipalName\",$UserPrincipalName)
Write-Host \"$UserPrincipalName\"
$objUser.Put(\"DisplayName\",$Displayname)
Write-Host \"$displayName\"
#$objUser.Put(\"Description\",$description)
$objUser.Put(\"GivenName\",$GivenName)
Write-Host \"$GivenName\"
$objUser.Put(\"sn\",$sn)
Write-Host \"$sn\"
$objUser.put(\"telephoneNumber\",$telephoneNumber)
Write-Host \"$telephoneNumber\"
$objUser.put(\"mail\",$mail)
Write-Host \"$mail\"
#$objUser.put(\"homePhone\",$homePhone)
$objUser.put(\"mobile\",$mobile)
Write-Host \"$mobile\"
$objUser.SetInfo
#$objUser.setPassword(\"\")
#on ne met pas de mdp pour que l'utilisateur en choisisse un au premier démarrage
#on active le compte
#$objUser.psbase.InvokeSet(\"AccountDisabled\",$false)
$objUser.SetInfo()
#on vérifie que l'utilisateur est bien crée et on rajoute le résultat dans le fichier ADlog.txt
if(($objOU.Children | where {$_.Path -match \"CN=$cn\"}) -ne $null) {
\"User : \"+$UserPrincipalName+\" Ok\" | Add-Content C:\ADlog.txt
}
$objOU=[ADSI]\"LDAP://localhost:389/DC=activup,DC=local\"
}
Write-Host \"Création réussie!\"
}
else {
\"Failure\" | Add-Content C:\ADlog.txt
}
[/code:1]
Comme vous le voyez, je crée 2 OU principales au départ, Echirolles et Pon-de-Claix.
J'aimerai maintenant placer les users dans des OU, dans ces OU..
j'ai testé en mettant :
[code:1]$objOU=[ADSI]\"LDAP://localhost:389/ou=Echirolles,dc=activup,dc=local\"[/code:1]
mais ça ne fonctionne pas du tout..
je ne sais pas comment je dois faire pour me placer dans la bonne OU.
si je dois faire un csv pour chaque site ou 1 qui aura une donnée exploitée en variable..
bref je suis un peu perdu..
si quelqu'un peut m'aiguiller
merci encore
Connexion ou Créer un compte pour participer à la conversation.
- Gaëtan Mandon
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 10
- Remerciements reçus 0
voilà, demain nous rendons notre projet, en retard et avec quelques petits problèmes mais bon... Nous ne sommes qu'en formation ^^
Pour ma part, je me suis satisfait de ce script que j'ai modifié à ma sauce afin de le rendre executable \"correctement..
n'étant pas parvenu à créer mes users dans des sous-OU, je me suis contenté de créer en 1er lieu mes 2 OU \"sites\" et de faire une différenciation dans les sous-OU en rajoutant un préfixe dans le csv. Ensuite, on rentre manuellement les sous-OU dans les OU \"sites\"
Pour ma connaissance personnelle, j'aimerai quand même savoir comment je pourrai faire pour améliorer ce script.
autre question à propos de ce script, je ne comprends pas pourquoi de partout je vois le [code:1]$objUser.SetInfo()[/code:1] avec la parenthèse vide et que j'ai du en enlever afin de le rendre opérationnel. Mais, pour autant j'ai une erreur au milieu de mes \"Write-Host\" justement à propos de SetInfo mais si je la corrige alors c'est le script qui ne fonctionne pas.
Je dois zapper quelque chose quelque part, pour finir je pense que j'enlèverai les write-host afin de le rendre plus rapide.. visuellement du moins
[code:1]#################################
# WiSAIS (Windows Server Automated Installation Solution)
#
# Desc : Importation des utilisateurs du fichier user.csv et ajout dans Active Directory
# Auteurs : Pierre Chesne (MS France), Samy Girard (MS France), Antoine Journaux (MS France)
# Version : 1.0
#
#################################
Write-Host \"Création des utilisateurs dans l'Active Directory en cours ...\"
#import du module Active Directory
Import-Module activedirectory
#création des OU \"Echirolles\" et \"Pont-de-Claix\"
$objDomain = [ADSI]\"LDAP://localhost:389/dc=activup,dc=local\"
$objOU = $objDomain.Create(\"organizationalUnit\", \"ou=Echirolles\"«»)
$objOU.SetInfo()
$objDomain = [ADSI]\"LDAP://localhost:389/dc=activup,dc=local\"
$objOU = $objDomain.Create(\"organizationalUnit\", \"ou=Pont-de-Claix\"«»)
$objOU.SetInfo()
#connexion à l'Active Directory
$objOU=[ADSI]\"LDAP://localhost:389/DC=activup,DC=local\"
if($objOU.Children -ne $null) {
# importation des data du fichier csv (se placer dans le même répertoire !!)
$dataSource=import-csv .\user.csv
$cpt = 0
ForEach($dataRecord in $dataSource) {
$ou=$dataRecord.service
#vérification de l'existance de l'OU
if(($objOU.Children | where {$_.Path -match \"OU=$ou\"}) -eq $null){
#si elle n'existe pas on la crée
$objOU = $objOU.create(\"organizationalUnit\", \"ou=\"+$ou)
$objOU.SetInfo()
}
else {
#sinon on place le curseur dessus pour que l'utilisateur soit crée dans la bonne OU
$objOU = $objOU.Children.Find(\"OU=$ou\"«»)
}
$SamAccountName=$dataRecord.login
$GivenName=$dataRecord.prenom
$sn=$dataRecord.nom
$cn=$GivenName + \" \" + $sn
$displayName=$cn
$description=$dataRecord.description
$UserPrincipalname=$SamAccountName +\"@activup.local\"
$telephoneNumber=$dataRecord.tel_bureau
$mail=$dataRecord.mail
#$homePhone=$dataRecord.tel_perso
$mobile=$dataRecord.tel_mobile
#on crée l'objet utilisateur dans Active Directory
$objUser=$objOU.Create(\"User\",\"CN=\"+$cn)
Write-Host \"$cn\"
$objUser.Put(\"SamAccountName\",$SamAccountName)
Write-Host \"$SamAccountName\"
$objUser.Put(\"UserPrincipalName\",$UserPrincipalName)
Write-Host \"$UserPrincipalName\"
$objUser.Put(\"DisplayName\",$Displayname)
Write-Host \"$displayName\"
#$objUser.Put(\"Description\",$description)
$objUser.Put(\"GivenName\",$GivenName)
Write-Host \"$GivenName\"
$objUser.Put(\"sn\",$sn)
Write-Host \"$sn\"
$objUser.put(\"telephoneNumber\",$telephoneNumber)
Write-Host \"$telephoneNumber\"
$objUser.put(\"mail\",$mail)
Write-Host \"$mail\"
#$objUser.put(\"homePhone\",$homePhone)
$objUser.put(\"mobile\",$mobile)
Write-Host \"$mobile\"
# Chemin du profil itinerrant
$objUser.put(\"profilePath\", \"\\ECH-SRV-02\Partage_DFS\Users_Profiles\%username%\\"«»)
# Chemin de la homedirectory
$objUser.put(\"homeDirectory\", \"\\ECH-SRV-02\Partage_DFS\Users_Profiles\%username%\\"«»)
# Lettre de la homedirectory
$objUser.put(\"homeDrive\", \"H:\"«»)
$objUser.SetInfo
#$objUser.setPassword(\"\"«»)
#on ne met pas de mdp pour que l'utilisateur en choisisse un au premier démarrage
#on active le compte
#$objUser.psbase.InvokeSet(\"AccountDisabled\",$false)
$objUser.SetInfo()
#on vérifie que l'utilisateur est bien créé et on rajoute le résultat dans le fichier ADlog.txt
if(($objOU.Children | where {$_.Path -match \"CN=$cn\"}) -ne $null) {
\"User : \"+$UserPrincipalName+\" Ok\" | Add-Content C:\ADlog.txt
}
$objOU=[ADSI]\"LDAP://localhost:389/DC=activup,DC=local\"
}
Write-Host \"Création réussie!\"
}
else {
\"Failure\" | Add-Content C:\ADlog.txt
}
[/code:1]
ps: je laisse l'en-tête car cet outil qu'il a créé est génial, je n'ai malheureusement pas encore assez de connaissances pour le maîtriser mais ça viendra.
merci pour vos conseils, je vais continuer à venir ici pour m'instruire.
et pour voir si certains peuvent m'aider à fignoler mon script..<br><br>Message édité par: corly, à: 7/12/11 21:17
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- création multi user AD