Question
[Résolu] Script modification attributs AD
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 32
- Remerciements reçus 0
Pour être plus précis il n'y a jamais de ligne complétement vide. c'est plutôt dans les champs \"officephone\" et \"title\" qui sont vides. Parfois c'est l'un des deux par même les deux.
En fait je me suis peut être mal exprimé mais ce n'est pas une ligne qui est nulle ou vide mais plutôt un champ qui est vide par ce que je n'ai pas l'information
Je pense que si je comprend bien ta première solution, il ne prendra pas en compte les lignes ou il y a des valeurs vides ou nulle à la lecture du csv ? or moi je veux qu'il les prennent en compte à l'exception des valeurs nulles.
Corrige moi si je me trompe
Quant à la deuxième solution, peut on mettre plusieurs critères.
J'espère être assez clair dans mes explications.
voici mon script original
[code:1]
Import-Module ActiveDirectory
$users = Import-Csv -Path C:\users\administrateur\Desktop\Modif_users.csv -delimiter \";\"
foreach ($user in $users) {
$usersearch = Get-ADUser -Filter \"samaccountname -eq '$($user.samAccountName)'\"
if ($usersearch -eq $null) {
write-host \"l'utilisateur \"$user.samaccountname\" n'existe pas\" -ForegroundColor Red
}
else {
$usersearch | Set-ADUser -Company $($user.Company) `
-Department $($user.Department) `
-Description $($user.Description) `
-state $($user.st) `
-title $($user.title) `
-office $($user.office) `
-OfficePhone $($user.telephoneNumber)
Write-Host \"Compte modifié pour\"$user.samaccountname\"\" -ForegroundColor green
}
}
[/code:1]
J'avais pensé aussi mettre des conditions mais je pense que ce n'est pas génial
[code:1]
Import-Module ActiveDirectory
$users = Import-Csv -Path C:\users\administrateur.LPO\Desktop\Modif_users.csv -delimiter \";\"
foreach ($user in $users) {
$usersearch = Get-ADUser -Filter \"samaccountname -eq '$($user.samAccountName)'\" -SearchBase \"OU=Utilisateurs,DC=lpo,DC=local\"
if ($usersearch -eq $null) {
write-host \"l'utilisateur \"$user.samaccountname\" n'existe pas\" -ForegroundColor Red
}
else {
if($user.title -eq ' ' -or $user.title -eq $null) {
$usersearch | Set-ADUser -Company $($user.Company) `
-Department $($user.Department) `
-Description $($user.Description) `
-state $($user.st) `
-office $($user.office) `
-OfficePhone $($user.telephoneNumber)
}
if($user.telephoneNumber -eq ' ' -or $user.telephoneNumber -eq $null) {
$usersearch | Set-ADUser -Company $($user.Company) `
-Department $($user.Department) `
-Description $($user.Description) `
-state $($user.st) `
-title $($user.title) `
-office $($user.office)
if(($user.telephoneNumber -eq ' ' -or $user.telephoneNumber -eq $null) -and ($user.title -eq ' ' -or $user.title -eq $null)) {
$usersearch | Set-ADUser -Company $($user.Company) `
-Department $($user.Department) `
-Description $($user.Description) `
-state $($user.st) `
-office $($user.office)
}
else {
$usersearch | Set-ADUser -Company $($user.Company) `
-Department $($user.Department) `
-Description $($user.Description) `
-state $($user.st) `
-title $($user.title) `
-office $($user.office) `
-OfficePhone $($user.telephoneNumber)
}
Write-Host \"Compte modifié pour\"$user.samaccountname\"\" -ForegroundColor green
}
}
[/code:1]
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
si le champ est vide on garde l'ancienne valeur ?
Le principe de ton dernier script est bon, mais ça peut être amélioré
- soit avec un switch
- soit utilise l'instance
- soit avec une boucle sur les attributs a changé
en plus ton CSV a déjà les bons attributs pour l'AD sauf pour office qui devrait etre physicalDeliveryOfficeName
pour l'instance tu peut faire comme ça :
[code:1]Import-Module ActiveDirectory
$users = Import-Csv -Path C:\users\administrateur\Desktop\Modif_users.csv -delimiter \";\"
foreach ($user in $users) {
$usersearch = Get-ADUser -Filter \"samaccountname -eq '$($user.samAccountName)'\" -Properties mail,department, Description, st, title, office, telephoneNumber
if ($usersearch -eq $null) {
write-host \"l'utilisateur \"$user.samaccountname\" n'existe pas\" -ForegroundColor Red
}
else {
$usersearch.Department = if ($user.Department.trim() -ne \"\"«») {$user.Department.trim()} else {$usersearch.Department}
$usersearch.Description = if ($user.Description.trim() -ne \"\"«») {$user.Description.trim()} else {$usersearch.Description}
$usersearch.st = if ($user.st.trim() -ne \"\"«») {$user.st.trim()} else {$usersearch.st}
$usersearch.title = if ($user.title.trim() -ne \"\"«») {$user.title.trim()} else {$usersearch.title}
$usersearch.office = if ($user.office.trim() -ne \"\"«») {$user.office.trim()} else {$usersearch.office}
$usersearch.telephoneNumber = if ($user.telephoneNumber.trim() -ne \"\"«») {$user.telephoneNumber.trim()} else {$usersearch.telephoneNumber}
Set-ADUser -instance $userusersearch
Write-Host \"Compte modifié pour\"$user.samaccountname\"\" -ForegroundColor green
}
}[/code:1]je suis pas un adepte de ce type de code (les if sur une ligne)
pour la boucle :
[code:1]Import-Module ActiveDirectory
$users = Import-Csv -Path C:\users\administrateur\Desktop\Modif_users.csv -delimiter \";\"
$attribAD = \"Department\", \"Description\", \"st\", \"title\", \"physicalDeliveryOfficeName\", \"telephoneNumber\"
foreach ($user in $users) {
$usersearch = Get-ADUser -Filter \"samaccountname -eq '$($user.samAccountName)'\"-Properties mail,department, Description, st, title, office, telephoneNumber
if ($usersearch -eq $null) {
write-host \"l'utilisateur \"$user.samaccountname\" n'existe pas\" -ForegroundColor Red
}
else {
$attribAD | foreach {
if ($user.\"$_\".trim() -ne \"\"«») {
Set-ADUser usersearch -Clear $_
Set-ADUser usersearch -Add @{$_=$user.\"$_\"}
}
}
Write-Host \"Compte modifié pour\"$user.samaccountname\"\" -ForegroundColor green
}
}
[/code:1]ce dernier script n'a pas été testé
il faut aussi que tu remplace office par physicalDeliveryOfficeName dans le CSV
Connexion ou Créer un compte pour participer à la conversation.
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 32
- Remerciements reçus 0
je viens de regarder tes 2 solutions et j'aimerai comprendre certaines des commandes que tu utilises.
Choix 1:
En gros pour chaque attribut tu mets une condition disant que s'il existe une valeur dans mon tableau tu écris la valeur et sinon tu laisses celle qui est dans l'attribut AD en question (je vulgarise pour bien comprendre
En faisant ça {$user.title.trim()} il va ecrire la valeur de mon csv c'est bien ca ? peux tu m'expliquer cette méthode ?
Je pense que tu as fais une erreur de frappe sur
[code:1]Set-ADUser -instance $userusersearch[/code:1]
et que tu voulais plutot mettre
[code:1]Set-ADUser -instance $usersearch[/code:1]
C'est bien ca ?
Dans ce choix que se passe t'il si le champ AD est vide ? cela ne risque t'il pas de générer une erreur ?
Choix 2:
ce choix ne fonctionne pas chez moi.
il doit y avoir une erreur dans cette partie
[code:1]else {
$attribAD | foreach {
if ($user.\"$_\".trim() -ne \"\"«») {
Set-ADUser usersearch -Clear $_
Set-ADUser usersearch -Add @{$_=$user.\"$_\"}
}
}[/code:1]
je ne comprends pas le $attribAD | foreach
il ne manque pas quelque chose avant $attribAD ??
Aussi a la place set-aduser usersearch cela ne devrait pas etre set-aduser $usersearch ?
Peux tu m'expliquer en quoi correspond la methode.trim ?
j'aimerai comprendre pour apprendre et eviter de t'ennuyer encore
Merci d'avance
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
exact ça resemble a ton code avec les conditions mais en plus courtEn gros pour chaque attribut tu mets une condition disant que s'il existe une valeur dans mon tableau tu écris la valeur et sinon tu laisses celle qui est dans l'attribut AD en question (je vulgarise pour bien comprendre )
le trim() sert a enlevé les espaces avant et apres la valeur, c'est une habitude que j'ai. tu te retrouve donc avec la valeur de \"title\" sans risque d'avoir des espaces au debut ou à la finEn faisant ça {$user.title.trim()} il va ecrire la valeur de mon csv c'est bien ca ? peux tu m'expliquer cette méthode ?
Peux tu m'expliquer en quoi correspond la methode.trim ?
oui bien vueJe pense que tu as fais une erreur de frappe
en faite ce code modifie des valeurs dans des variables quelle vide ou non, ce qui ne provoque pas d'erreur.Dans ce choix que se passe t'il si le champ AD est vide ? cela ne risque t'il pas de générer une erreur ?
apres Set-ADUser -instance ce debrouille choixis si il faut ajouter/remplcer/supprimmer la valeur dans l'attributs
oui il manque le $ à la variable $usersearchce choix ne fonctionne pas chez moi.
il doit y avoir une erreur dans cette partie
Aussi a la place set-aduser usersearch cela ne devrait pas etre set-aduser $usersearch ?
none ne comprends pas le $attribAD | foreach
il ne manque pas quelque chose avant $attribAD ??
cette ligne utilise le pipeline
ça demende de prendre chaque element du tableau $attribAD et de les mettre un par un dans le pipeline(|). il arrive un par un dans dans la varaible $_ et dans le notre cas dans la boucle foreach et execute les actions de la boucle
tu ne m'ennuie pas si tu viens pour apprendre et si j'arrive a t'expliqué !j'aimerai comprendre pour apprendre et eviter de t'ennuyer encore
il faut simplement que j'ai du temps
Connexion ou Créer un compte pour participer à la conversation.
- gaudefroy
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 32
- Remerciements reçus 0
Je comprends mieux les scripts que tu me proposes avec ces explications.
Autre question qui est en rapport à cela. Sais tu s'il est possible depuis powershell AD de réinitialiser les valeurs d'un champ.
Je m'explique, on peut supprimer le texte d'un champ correspondant à un attribut AD (par défaut s'il n'est pas remplie il indique <non défini>).
Ce que je souhaiterai c'est que si la valeur de mon csv est nulle ou vide, je souhaiterai que cela remette le champ de l'attribut en question à vide.
Est ce faisable et si oui avec quelle méthode ?
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
c'est le clear qui fait çaCe que je souhaiterai c'est que si la valeur de mon csv est nulle ou vide, je souhaiterai que cela remette le champ de l'attribut en question à vide. <non défini>
par contre c'esst l'inverse d'une de tes demandes
les deux solutions donner fonctionne normalement apres une modifor moi je veux qu'il les prennent en compte à l'exception des valeurs nulles.
la premiere il faut remplacer les $usersearch.attribut par $null
la deuxieme utilise le -clear de Set-ADUser avec une petite modification que je te laisse trouver si dessous
[code:1]Import-Module ActiveDirectory
$users = Import-Csv -Path C:\users\administrateur\Desktop\Modif_users.csv -delimiter \";\"
$attribAD = \"Department\", \"Description\", \"st\", \"title\", \"physicalDeliveryOfficeName\", \"telephoneNumber\"
foreach ($user in $users) {
$usersearch = Get-ADUser -Filter \"samaccountname -eq '$($user.samAccountName)'\"-Properties mail, department, Description, st, title, office, telephoneNumber
if ($usersearch -eq $null) {
write-host \"l'utilisateur \"$user.samaccountname\" n'existe pas\" -ForegroundColor Red
}
else {
$attribAD | foreach {
Set-ADUser $usersearch -Clear $_
if ($user.\"$_\".trim() -ne \"\"«») {
Set-ADUser $usersearch -Add @{$_ = $user.\"$_\"}
}
}
Write-Host \"Compte modifié pour\"$user.samaccountname\"\" -ForegroundColor green
}
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] Script modification attributs AD