Question
Gestion d'exception
- Dupuis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 16
- Remerciements reçus 0
Contexte: Je dois renseigner le champ adresse de messagerie pour chaque utilisateur de mon AD depuis un fichier CSV exporter d'un serveur mail Lotus.
Forme du fichier CSV:
[code:1]NOM PRENOM MAIL
DUS Jean Claude Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.[/code:1]
et voici mon script:
[code:1]import-module activedirectory
#Specify the OU you want to search for inactive accounts
$SearchOU=\"OU=CB,dc=lulu,dc=priv\"
$Fichier=Import-CSV C:\Users\test\Desktop\test.csv –Delimiter “;”
foreach($User in $Fichier){
$Nom = $user.nom
$Prenom = $user.prenom
$Mail = $user.mail
$Sam=Get-Aduser -Filter {Surname -eq $Nom -and Givenname -eq $Prenom} -SearchBase $SearchOU | select SamAccountname,Surname,GivenName
Set-ADUser $Sam.SamAccountName -EmailAddress $Mail
}[/code:1]
Ce script semble tourner correctement, malheureusement quand un utilisateur n'a pas de mail renseigné dans le fichier CSV j'obtiens le message d'erreur suivant:
[code:1]Set-ADUser : replace
+ Set-ADUser <<<< $Sam.SamAccountName -EmailAddress $Mail
+ CategoryInfo : InvalidOperation: (rdus:ADUser) [Set-ADUser], ADInvalidOperationException
+ FullyQualifiedErrorId : replace,Microsoft.ActiveDirectory.Management.Commands.SetADUser[/code:1]
Ou si l'utilisateur n'existe pas dans l'AD:
[code:1]Set-ADUser : Impossible de valider l'argument sur le paramètre « Identity ». L'argument est null. Indiquez un argument non-null et réessayez.
Set-ADUser <<<< $Sam.SamAccountName -EmailAddress $Mail
+ CategoryInfo : InvalidData: (:«») [Set-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.SetADUser[/code:1]
J'aimerai pouvoir facilement récupérer dans un fichier ses erreurs sous forme:
Nom utilisateur adresse mail non renseignée
Nom utilisateur compte AD inexistant
Je voulais le faire avec des conditions
if ($mail -eq \"\") alors je renvois mail non renseigné
mais je ne parviens pas a faire l'imbrication correctement
j'ai essayé avec try catch mais je ne parviens pas a récupérer mes exception.
J’espère avoir été suffisamment claire 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 tu cherche sur ce site, il y a quelque jour KaAzZ01 a eu un probleme proche dans ce sujet : Soucis de modifications Set-ADuser
ci dessous le code qui peut t'aider :
[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]
reviens vers nous si tu comprend pas
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Tu peux valider tes données avant un traitement à l'aide de cette fonction .J'aimerai pouvoir facilement récupérer dans un fichier ses erreurs sous forme:
Nom utilisateur adresse mail non renseignée
Nom utilisateur compte AD inexistant
Une fois créée et testée les règles propres à ton entreprise tu peux les réutiliser. Si tu as un doute sur la gestion du versionning des règles, tu peux livrer un script AVEC ses règles sans créer de dépendances (règles communes à plusieurs scripts).
Cette approche permet d'alléger la gestion d'exception dans le script, car ainsi on part du principe que les données traitées sont toutes valides.<br><br>Message édité par: Laurent Dardenne, à: 17/02/15 13:21
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Dupuis
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 16
- Remerciements reçus 0
Même si l'utilisation me semble assez complexe à mettre en place je suis encore débutant ^^!
Me revoila, alors je m’étais déjà un peu inspiré du script de KaAzZ01
je me suis pour l'instant dépatouillé ainsi :
[code:1]import-module activedirectory
#Nettoyage du fichier log
clear-content c:\LogAddMail.txt
#Specify the OU you want to search for inactive accounts
$SearchOU=\"OU=CB,dc=test,dc=priv\"
$Fichier=Import-CSV C:\Users\test\Desktop\testdp.csv –Delimiter “;”
foreach($User in $Fichier){
$Nom = $user.nom
$Prenom = $user.prenom
$Mail = $user.mail
#On recherche un utilisateur à partir du nom et prenom fournit dans le CSV et on récupère son SamAccountname
$Sam=Get-Aduser -Filter {Surname -eq $Nom -and Givenname -eq $Prenom} -SearchBase $SearchOU | select SamAccountname,Surname,GivenName
#Verification
if($Sam -eq $null -and $Mail -eq \"\"«»){ \"Pas de compte AD et Mail absent : $User\" | out-file c:\LogAddMail.txt -Append }
elseif($Sam -eq $null){ \"Pas de compte AD: $User\" | out-file c:\LogAddMail.txt -Append}
elseif($Mail -eq \"\"«»){\"Mail absent dans le fichier CSV: $User\" | out-file c:\LogAddMail.txt -Append}
else{Set-ADUser $Sam.SamAccountName -EmailAddress $Mail}
}[/code:1]
C'est peut être pas très propre mais semble fonctionner si vous avez des remarques je prends car je cherche à m’améliorer malheureusement il est pas toujours évident de trouver des sujets à traiter en powershell ^^!
Message édité par: stabz, à: 17/02/15 15:00<br><br>Message édité par: stabz, à: 18/02/15 10:07
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
J'aurais pas mieux fait !C'est peut être pas très propre mais semble fonctionner si vous avez des remarques je prends
Débutant mais déjà une l'analyse d'un code d'un autre et son adaptation à tes besoins ! bon boulot !je cherche à m’améliorer malheureusement il est pas toujours évident de trouver des sujets à traiter en powershell ^^!
peut être une mise en forme avec indentation et quelques espace entre les commandes pourrais aidé à la lecture !? et plus des commentaires aussi.
mais chacun fait comme il veut :[code:1]
import-module activedirectory
# Nettoyage du fichier log
clear-content c:\LogAddMail.txt
# Specifie l'OU ou commence la recherche dans l'AD
$SearchOU = \"OU=CB,dc=ciffreobona,dc=priv\"
# Lecture du fichier avec les emails
$Fichier = Import-CSV C:\Users\pdupuis\Desktop\testdp.csv –Delimiter “;”
# parcours du fichier
foreach ($User in $Fichier) {
$Nom = $user.nom
$Prenom = $user.prenom
$Mail = $user.mail
# On recherche un utilisateur à partir du nom et prenom fournit dans le CSV et on récupère son SamAccountname
$Sam = Get-Aduser -Filter {Surname -eq $Nom -and Givenname -eq $Prenom} -SearchBase $SearchOU | select SamAccountname,Surname,GivenName
# Verification si l'utilisateur est present dans l'AD et le mail saisie dans le fichier
if ($Sam -eq $null -and $Mail -eq \"\"«») {
\"Pas de compte AD et Mail absent : $User\" | out-file c:\LogAddMail.txt -Append
}
elseif ($Sam -eq $null) {
\"Pas de compte AD : $User\" | out-file c:\LogAddMail.txt -Append
}
elseif ($Mail -eq \"\"«») {
\"Mail absent dans le fichier CSV : $User\" | out-file c:\LogAddMail.txt -Append
}
else {
Set-ADUser $Sam.SamAccountName -EmailAddress $Mail
}
}
[/code:1]
Par contre comme nous dirais Laurent : si le nombre d'utilisateurs dans le fichier et la fréquence d'utilisation est important, tu pourrais optimisé du coté du Get-ADUser comme avec KaAzZ01 pour ne pas trop sollicité le serveur AD
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
pour évité les problèmes dû aux homonymes, essai d'utilisé le SamAccountName plutôt que le nom et prénom pour get-aduser et donc aussi dans le fichier CSV
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Gestion d'exception