Problème nom composé script de créations utilisateurs en masse fichier csv via PowerShell

Bonjour,

J’ai crée un script de création d’utilisateur en masse d’Active Directory via un fichier .csv. Après plusieurs tests le script en lui même fonctionne et créer les utilisateurs. Cependant, lorsque je tombe sur un nom composé comme par exemple Jean-Claude en prénom ou Dupont-Castel en nom, le script me dit que le nom n’est pas correctement configuré. J’imagine donc qu’il y a une particularité à insérer dans le script.
Pour plus de visibilité pour vous je vous copie-colle le script que j’ai créé (je précise que je suis débutant dans le milieu de l’informatique et encore plus en ce qui concerne les scripts et le PowerShell donc n’hésitez pas à me faire des retours dessus) afin que vous puissiez me dire où cela coince.

Le script :

$CSVfile = #chemin complet du fichier CSV
$CSVData = Import-CSV -Path $CSVfile -Delimiter « ; » -Encoding Default

Foreach($Utilisateur in $CSVData){

$UtilisateurPrenom = $Utilisateur.Prenom
$UtilisateurNom = $Utilisateur.Nom
$UtilisateurLogin = ($UtilisateurPrenom).ToLower() + "." + $UtilisateurNom.ToLower () # ToLower force l'écriture en minuscule ex : sophie.fonfek
$UtilisateurEmail = "[email protected]"
$UtilisateurMotDePasse = "Peyrot2022"
$UtilisateurFonction = $Utilisateur.Fonction
$UtilisateurDescription = $Utilisateur.Description

# Vérifier présence de l'utilisateur dans l'AD
if (Get-ADUser -Filter {SamAccountName -eq $UtilisateurLogin})
{
    Write-Warning "L'identifiant $UtilisateurLogin existe déjà dans l'annuaire Active Directory" 
}
else
{
    New-ADUser - Name "$UtilisateurNom $UtilisateurPrenom" `
                   -DisplayName "UtilisateurNom $UtilisateurPrenom" `
                   -GivenName $UtilisateurPrenom `
                   -Surname $UtilisateurNom `
                   -SamAccountName $UtilisateurLogin `
                   -UserPrincipalName "[email protected]" `
                   -EmailAddress $UtilisateurEmail `
                   -Title $UtilisateurFonction `
                   -Description $UtilisateurDescription `
                   -AccountPassword(ConvertTo-SecureString $UtilisateurMotDePasse -AsPlainText -Force) `
                   -ChangePasswordAtLogon $true `
                   -Enable $true 

    Write-Output "Création de l'utilisateur : $UtilisateurLogin ($UtilisateurNom $UtilisateurPrenom) effectuée"

}

}

Merci d’avance pour vos retours et bonne fin de journée !

Bonjour Gravuski,
Pour quelqu’un qui n’ as beaucoup d’expérience en scripting Powershell, c’est déjà un bon boulot. Tu as même fait un début de gestion des erreurs (utilisateur déjà existant), et utilisé du Write-Output ou du Write-Warning et pas du Write-Host, et c’est très bien.
Nota : tu peux utiliser du Write-Host, mais uniquement quand le script est destiné à une utilisation interactive (quelqu’un l’exécute).
Nota2 : Fais-moi plaisir stp. Oublies tout de suite les backticks en fin de ligne, cela ne sert strictement à rien. PS « sait tout seul comme un grand » quand une ligne de commandes est terminée, même si elle s’étend sur plusieurs lignes.
Nota3 : Tu pourrais ajouter lors de la création des compte le paramètre -Path qui détermine ou le compte doit être créé (C’est un DistinguishedName qu’il faut mettre). SI non précisé le compte est créé dans le UserContainer par défaut, soit Users. Et ce n’est pas bien, car tu ne peux appliquer de GPO sur ce container (tout comme Computers), à l’exception des GPOs liées au domaine.

Tu as mis le doigts dessus, c’est bien la manière dont tu définies le SAMAccountName qui pose pb. En fait dans le principe c’est bien, sauf que … là, tu ne gères pas les erreurs :slight_smile: . Le pb ne vient pas de toi, mais des données en Input. « Jean-Claude », ca va mais "Jean-Claude ", ça ne va pas. Il te faut supprimer les espaces blancs à la fin avec un Trim() ou un TrimEnd(). Perso je préfère le Trim qui fait TrimStart et le TrimEnd.

tu peux faire comme ceci :

($Prenom).trim().ToLower() + "." + $Nom.trim().ToLower()
($Prenom.Trim() + "." + $Nom.trim()).ToLower()

Je préfère la seconde syntaxe, plus concise :slight_smile:

Attention : cependant, cela ne gère pas encore les "Jean Claude " avec un espace blanc dedans, juste au début ou à la fin. Tu peux donc faire un test (if) comme ceci :

$Prenom = "Jean Claude "
if ($Prenom.trim().Contains(" ")) 
    {
    Write-Output "Le prénom [$Prenom] contient un espace blanc au milieu. Le compte ne sera pas créé"
    }

Naturellement, cela s’applique aussi au nom.

N’oublies pas le -Path et éventuellement -HomeDirectory et -HomeDrive, voire d’autres propriétés pour le compte à créer.

Un dernier point pendant que j’y pense : Quand tu as une cmdlet pour laquelle tu dois passer un grand nombre de paramètres (disons plus de 4), et c’est le cas, penses à utiliser la technique du Splatting ou splat. Cela rend la lecture plus facile, l’ajout ultérieur de nouvelles propriétés également, …
Un petit exemple :

$UserParams = @{Name           = "$UtilisateurNom $UtilisateurPrenom"
               DisplayName    = "UtilisateurNom $UtilisateurPrenom"
               GivenName      = $UtilisateurPrenom
               Surname        = $UtilisateurNom
               SamAccountName = $UtilisateurLogin
               #...
               }
New-ADUser @UserParams

Notes bien le @UserParams et pas $UserParams. D’ailleurs, tu peux mixer les 2 méthodes et faire un truc comme MaCmdlet @ParamCommuns -AutreParamètre valeur

Cordialement.
PS. : ca ira comme propose pour un 1 Novembre :slight_smile:

Woah merci beaucoup pour ta réponse très complète surtout pour un 1er Novembre ! :sweat_smile:

Merci de m’avoir fait un retour sur mon travail et pour tous les conseils que tu m’as donné, je vais m’y atteler tout de suite et si cela ne te dérange pas, je te ferai un retour sur ce que j’ai appris ainsi que sur les erreurs que je pourrais (vais) rencontrer.

Très cordialement

« la connaissance s’accroit quand on la partage » comme on dit. J’ai juste partagé la mienne. N’en doutes pas, tu as surement des expériences à partager aussi.

Pour les erreurs : très souvent les messages d’erreurs te donnent des éléments de réponse.
« Access Denied » ==> Mer… j’aurais du exécuter en RunAsAdmin.
un paramètre qui demande à être peuplé par une variable de tel ou tel type, ou par tel ou tel info, ou qui est obligatoire et pas passé, …
==> Get-Help -ShowWindows pour voir ce qui est attendu. En plus tu as des exemples (si aide pas à jour Update-Help et ça roule).

Happy Powershell