Question Soucis de modifications Set-ADuser

Plus d'informations
il y a 11 ans 1 mois #18950 par Dupont
Bonjour à tous ,

J'ai encore un soucis , je ne peux maintenant plus me passer de vous quand je galère mdr( ca fait bien 2 heures )

Mon objectif est de changer les propriétés du genre Description , Nom , Prénom etc... d'un compte utilisateur déjà existant en fonction des propriétés qui lui sont renseignées dans un fichier Csv ( donc présent aussi dans la liste des users du csv ) , je sais pas si je me suis bien fait compris :p

Voici le code , j'ai laissé en commentaire toutes mes diverses et insignifiantes tentatives ^^
[code:1]Import-Module ActiveDirectory



$OU = \"OU=Test,DC=TEST,DC=LO\"
$Path = \"C:\Projet2\\"
$compteExistant = Get-ADUser -Filter * -Properties * -SearchBase $OU | select SamAccountName
$pass = ConvertTo-SecureString -String \"Azerty01!\" -AsPlainText –Force #Convertit le mot de passe en châine sécurisée afin qu'il puisse être utilisé lors de la création
$users = Import-Csv -Encoding UTF8 -Path $Path\DomainUsers.csv
$users | Get-Member

foreach ($User in $users)
{
$Name = $User.name
$Firstname = $User.Firstname
$Lastname = $User.LastName
$Detailedname = $Firstname +\" \" + $Lastname
$logonName = $User.LogonName
$SAM = $User.SamAccountName
$upn = \"$SAM\" + \"@TEST.LO\" # Changer ce qui est entre guillemets par votre nom de domaine ex: \"@CA01.fr\"
$description = $User.Description
$company = $User.Company


try {
New-ADUser -Name $SAM -SamAccountName $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description -AccountPassword $pass -Enabled $true -ChangePasswordAtLogon $true -Path $OU
}
catch [Microsoft.ActiveDirectory.Management.ADIdentityAlreadyExistsException]
{
Write-Host \"L'utilisateur\"$SAM \"était déjà présent , mais cela n'affecte pas la création des autres utilisateurs\"
}
finally
{
Set-ADUser -Identity $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description
}
<#if ($compteExistant -eq $SAM)
{
Set-ADUser -Identity $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description
<#-Replace @{GivenName = $Firstname}
@{Surname = $Lastname}
@{DisplayName = $Detailedname}
@{UserPrincipalName =$logonName}
@{Company = $company}
@{Description =$description}
}#>

<#$compteExistant | foreach { Set-ADUser -Identity $_.SamAccountName -Surname $Lastname -GivenName $Firstname
}#>

}
#$Error > C:\Projet2\error.txt # Vous pouvez consulter ce fichier pour voir les erreurs mais normalement il n'y a que le message d'erreur lié à un utilisateur existant
[/code:1]

J'ai essayé dans le bloc finally , avec un if , avec un autre foreach ( il y a eu un résultat mais le script bouclait pendant 30 plombes ) et avec un replace ( j'ai eu un changement de nom qui ne lui appartenait pas , c'est toujours ca ... )

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

Plus d'informations
il y a 11 ans 1 mois #18953 par Philippe
salut KaAzZ01

je ne peux maintenant plus me passer de vous quand je galère mdr( ca fait bien 2 heures )

2 heures seulement ? ta pas cherché ;)
t'avais pourtant tout fais presque bien

j'ai changé le get-ADUser pour plusieurs raison :
1) le plus important tu doit prendre tous les utilisateurs du domaine pour ne pas avoir d'erreur de création d'un utilisateur avec le même SamAccountName dans une autre OU.
si ta plusieurs Domaine ne met que les DC (le nom du domaine sur lesquel tu travail)
2) pour le test de comparaison (le if) tu doit avoir un tableau de chaine de caractère pour que ca fonctionne, d'où le [string[]] et le ).SamAccountName
3) le -Properties * est inutile et consommateur de mémoire et ralentie le get surtout que tu ne garde que le SamAccountName au final

j'ai donc repris ton if sans rien changer d'autre et sans le replace

petit conseil :
utilise le try/catch que quand tu doit géré une erreur que tu ne peut pas évité sinon tu risque de ne plus voir des erreurs importantes
de plus on rajoute la gestion d'erreur quand la partie du script fonctionne comme on le veux et pas pour géré une erreur qu'on ne comprend pas

Attention le set-aduser modifie utilisateur quelque soit l'OU de l'utilisateur car l'identifient est le SamAccountName,
le SamAccountName est unique dans un domaine
donc avant de faire des test soit sur de ton fichier DomainUsers car tu peut changer des utilisateurs en exploitation si il on le même login (SamAccountName) que dans ton fichier


[code:1]
Import-Module ActiveDirectory

$OU = \"OU=BO,OU=TEST,DC=domaine,DC=lan\"
$Path = \"C:\\"
$compteExistant =[string[]](Get-ADUser -Filter *).SamAccountName
$pass = ConvertTo-SecureString -String \"Azerty01!\" -AsPlainText –Force #Convertit le mot de passe en châine sécurisée afin qu'il puisse être utilisé lors de la création
$users = Import-Csv -Encoding UTF8 -Path $Path\DomainUsers.csv

foreach ($User in $users) {
$Name = $User.name
$Firstname = $User.Firstname
$Lastname = $User.LastName
$Detailedname = $Firstname +\" \" + $Lastname
$logonName = $User.LogonName
$SAM = $User.SamAccountName
$upn = \"$SAM\" + \"@domaine.lan\" # Changer ce qui est entre guillemets par votre nom de domaine ex: \"@CA01.fr\"
$description = $User.Description
$company = $User.Company

if ($compteExistant -eq $SAM) {
Set-ADUser -Identity $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description
}
else {
New-ADUser -Name $SAM -SamAccountName $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description -AccountPassword $pass -Enabled $true -ChangePasswordAtLogon $true -Path $OU
}
}
[/code:1]

le script fonctionne bien chez moi mais dans le new-ADUser ton logonName dans l'UserPrincipalName diffèrent du SamAccountName n'est pas une bonne idée
mais c'est toi qui voi ;)

à demain !

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

Plus d'informations
il y a 11 ans 1 mois #18955 par Dupont
J'ai fait un try catch car c'est une erreur que je ne pourrais pas éviter , on me demande de scripter pour pas faire la migration à la main , mais les mecs le font à la main quand même mdr , et les autres erreurs seront vues puisque je n'ai spécifié seulement cette erreur , j'ai essayé tkt pas :p
Je sais pas ce qui te fait penser que j'essaye de gérer une erreur que je ne comprends pas ( j'ai lu tout le chapitre ou presque sur la gestion d'erreur de la bible xD )

Attention le set-aduser modifie utilisateur quelque soit l'OU de l'utilisateur car l'identifient est le SamAccountName,

le SamAccountName est unique dans un domaine

donc avant de faire des test soit sur de ton fichier DomainUsers car tu peut changer des utilisateurs en exploitation si il on le même login (SamAccountName) que dans ton fichier


C'était bien le but ;)

En tout cas merci encore , t'as tout bien expliqué , le seul truc que j'ai pas saisi c'est sur le tableau avec le string[]

Edit : Oui en fait le try catch ne sert à rien ^^<br><br>Message édité par: KaAzZ01, à: 6/02/15 08:46

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

Plus d'informations
il y a 11 ans 1 mois #18956 par Philippe

Edit : Oui en fait le try catch ne sert à rien ^^

la gestion d'erreur sert toujours mais il y faut l'évité si il y a une autre solution pour rendre le script plus lisible et evolutif B)
les commentaires aussi aide même si j'en met rarement !! :whistle:

le seul truc que j'ai pas saisi c'est sur le tableau avec le string[]

c'est un truc pour forcé (convertir) le format du (Get-ADUser -Filter *).SamAccountName en tableau de string
le [] pour la partie tableau
et [string] pour chaine de caractères

c'est pour être plus sûre mais en faite ici ca marche sans le cast [string[]]

on me demande de scripter pour pas faire la migration à la main , mais les mecs le font à la main quand même mdr

manque de rapidité et confiance, mais ca va venir
quand ils y aura quelques milliers d'utilisateur à crée, tu sera prêt ! ;)

les autres erreurs seront vues puisque je n'ai spécifié seulement cette erreur , j'ai essayé tkt pas

ta tout compris B) :)<br><br>Message édité par: 6ratgus, à: 6/02/15 09:47

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

Plus d'informations
il y a 11 ans 1 mois #18957 par Dupont
oki merci pour les explications :D

Après un truc qui me pousse à violenter mon poste c'est que ça marche chez toi et pas chez moi !
Mon code est le même :angry:
[code:1]Import-Module ActiveDirectory



$OU = \&quot;OU=Test,DC=TEST,DC=LO\&quot;
$Path = \&quot;C:\Projet2\\&quot;
$compteExistant =[string[]](Get-ADUser -Filter * -Properties * -SearchBase $OU).SamAccountName
$pass = ConvertTo-SecureString -String \&quot;Azerty01!\&quot; -AsPlainText –Force #Convertit le mot de passe en châine sécurisée afin qu'il puisse être utilisé lors de la création
$users = Import-Csv -Encoding UTF8 -Path $Path\DomainUsers3.csv
$users | Get-Member

foreach ($User in $users)
{
$Name = $User.name
$Firstname = $User.Firstname
$Lastname = $User.LastName
$Detailedname = $Firstname +\&quot; \&quot; + $Lastname
$logonName = $User.LogonName
$SAM = $User.SamAccountName
$upn = \&quot;$SAM\&quot; + \&quot;@TEST.LO\&quot; # Changer ce qui est entre guillemets par votre nom de domaine ex: \&quot;@CA01.fr\&quot;
$description = $User.Description
$company = $User.Company


&lt;# try {
New-ADUser -Name $SAM -SamAccountName $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description -AccountPassword $pass -Enabled $true -ChangePasswordAtLogon $true -Path $OU
}
catch [Microsoft.ActiveDirectory.Management.ADIdentityAlreadyExistsException]
{
Write-Host \&quot;L'utilisateur\&quot;$SAM \&quot;était déjà présent , mais cela n'affecte pas la création des autres utilisateurs\&quot;
}#&gt;

if ($compteExistant -eq $SAM) { Write-Host \&quot;L'utilisateur\&quot; $SAM \&quot;existe déjà , ces données seront modifiées par celles contenues dans le fichier Csv\&quot;
Set-ADUser -Identity $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description
}
else {
New-ADUser -Name $SAM -SamAccountName $SAM -GivenName $Firstname -Surname $Lastname -DisplayName $Detailedname -UserPrincipalName $logonName -Company $company -Description $description -AccountPassword $pass -Enabled $true -ChangePasswordAtLogon $true -Path $OU
}

}
[/code:1]
J'ai juste rajouté l'OU spécifique à la génération du tableau string pour éviter qu'ils me prennent les comptes de service , et on peut pas les éditer je crois en plus donc en imaginant qu'ils soient dans mon csv ( ils le sont pas ) ça foutrait le bordel ^^

J'ai une erreur bizarre, je creuse mais je trouve pas grand chose , la seule chose que j'ai réussie à faire c'est changé le prénom avec un : -Replace @{GivenName=$FirstName}
j'ai donc essayé avec toutes les autres infos que je voulais changer ( c'est pour ca que j'ai rajouté le -Properties * pour pas avoir l'erreur que le champ n'existe pas ) --&gt; Mais la je suis à côté de la plaque je pense xD

Et l'erreur c'est :
Set-ADUser : replace
Au caractère C:\Projet2\New user.ps1:34 : 9
+ Set-ADUser -Identity $SAM -GivenName $Firstname -Surname $Lastname -Disp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation : (backelas01d:ADUser) [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Alors est-ce que c'est parce que je veux modifier des valeurs non nulles , ou que certaines sont vides ? J'ai vu que ça pouvait foutre un peu la **** mais je sais pas si avec cette commande ça devrait ^^

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

Plus d'informations
il y a 11 ans 1 mois #18960 par Laurent Dardenne
Salut,
je me permets une remarque.
6ratgus écrit:

petit conseil :
utilise le try/catch que quand tu doit géré une erreur que tu ne peut pas évité sinon tu risque de ne plus voir des erreurs importantes

Oui, mais son usage premier est de protéger le code des erreurs, les nôtres, celles des autres qui n'en tiennent pas compte et celle du système.
Cela évite en cas d'erreur imprévue ou d'erreur de conception/d'analyse de ne pas passer 2 heures à débugger ton script en production.
Le Try/Catch/Finally c'est Ceinture/Bretelle/Parachute.
6ratgus écrit:

de plus on rajoute la gestion d'erreur quand la partie du script fonctionne comme on le veux

Non, pour ce type de traitement il faut l'implémenter dés le départ, ne serait-ce que pour aider lors de sa mise au point.

Tutoriels PowerShell

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

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