Question
Soucis de modifications Set-ADuser
- Dupont
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
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
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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
2 heures seulement ? ta pas cherchéje ne peux maintenant plus me passer de vous quand je galère mdr( ca fait bien 2 heures )
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.
- Dupont
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
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 evolutifEdit : Oui en fait le try catch ne sert à rien ^^
les commentaires aussi aide même si j'en met rarement !!
c'est un truc pour forcé (convertir) le format du (Get-ADUser -Filter *).SamAccountName en tableau de stringle seul truc que j'ai pas saisi c'est sur le tableau avec le 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[]]
manque de rapidité et confiance, mais ca va veniron me demande de scripter pour pas faire la migration à la main , mais les mecs le font à la main quand même mdr
quand ils y aura quelques milliers d'utilisateur à crée, tu sera prêt !
ta tout comprisles autres erreurs seront vues puisque je n'ai spécifié seulement cette erreur , j'ai essayé tkt pas
Connexion ou Créer un compte pour participer à la conversation.
- Dupont
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 48
- Remerciements reçus 0
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
[code:1]Import-Module ActiveDirectory
$OU = \"OU=Test,DC=TEST,DC=LO\"
$Path = \"C:\Projet2\\"
$compteExistant =[string[]](Get-ADUser -Filter * -Properties * -SearchBase $OU).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\DomainUsers3.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\"
}#>
if ($compteExistant -eq $SAM) { Write-Host \"L'utilisateur\" $SAM \"existe déjà , ces données seront modifiées par celles contenues dans le fichier Csv\"
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 ) --> 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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
je me permets une remarque.
6ratgus écrit:
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.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
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:
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.de plus on rajoute la gestion d'erreur quand la partie du script fonctionne comme on le veux
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Soucis de modifications Set-ADuser