Question [Résolu] Script modification attributs AD

Plus d'informations
il y a 6 ans 10 mois #28874 par gaudefroy
Bonjour et merci 6ratgus

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.

Plus d'informations
il y a 6 ans 10 mois #28875 par Philippe
Ok, je n'avais pas bien saisi le problème !

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é :) Ça ralentit le script, change un peu plus l'AD, mais c'est plus simple à maintenir quand tu as beaucoup d'attributs,

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.

Plus d'informations
il y a 6 ans 10 mois #28876 par gaudefroy
Merci pour ton retour,

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.

Plus d'informations
il y a 6 ans 10 mois #28882 par Philippe

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 )

exact ça resemble a ton code avec les conditions mais en plus court

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 ?
Peux tu m'expliquer en quoi correspond la methode.trim ?

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 fin

Je pense que tu as fais une erreur de frappe

oui bien vue B)

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 ?

en faite ce code modifie des valeurs dans des variables quelle vide ou non, ce qui ne provoque pas d'erreur.
apres Set-ADUser -instance ce debrouille choixis si il faut ajouter/remplcer/supprimmer la valeur dans l'attributs

ce 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 ?

oui il manque le $ à la variable $usersearch

e ne comprends pas le $attribAD | foreach
il ne manque pas quelque chose avant $attribAD ??

non
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

j'aimerai comprendre pour apprendre et eviter de t'ennuyer encore

tu ne m'ennuie pas si tu viens pour apprendre et si j'arrive a t'expliqué ! :)
il faut simplement que j'ai du temps :unsure:

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

Plus d'informations
il y a 6 ans 10 mois #28887 par gaudefroy
Tout d'abord merci pour ton aide.

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.

Plus d'informations
il y a 6 ans 10 mois #28889 par Philippe

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. <non défini>

c'est le clear qui fait ça

par contre c'esst l'inverse d'une de tes demandes

or moi je veux qu'il les prennent en compte à l'exception des valeurs nulles.

les deux solutions donner fonctionne normalement apres une modif
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.

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