Créer des utilisateurs de test dans AD avec un mini-script PowerShell


Cet article s’adresse aux débutants en PowerShell. Tout administrateur AD qui fait un peu de PowerShell a sûrement déjà son script équivalent.

J’insiste sur les mots ici : il s’agit de créer des utilisateurs de test avec un petit script PowerShell très simple. En effet le Technet Script Center est très bien fourni en scripts pour Active Directory, utilisables en production, mais mon idée est d’avoir sous la main un petit fichier CSV et un script pour alimenter un AD de test très rapidement.

Un détail qui a son importance est évidemment la sécurité. En production il n’est pas question de stocker des mots de passe en clair dans un fichier CSV ni dans un script. C’est pourquoi la commande PowerShell New-ADUser prévoit de créer des comptes sans mot de passe mais désactivés par défaut. Dans un environnement de test, on accepte que les mots de passe soient exposés et que les comptes soient immédiatement actifs.

Voici donc un exemple de fichier CSV avec quelques utilisateurs, que j’appelle adusers.csv :

GivenName,Surname,SamAccountName
Odile,Deray,odile
Serge,Karamazov,kara
Patrick,Biales,biales
Simon,Jeremi,simon
Jean-Paul,Martoni,martoni

L’idée de ce CSV est de ne contenir que les informations minimales : prénom, nom, alias. Et encore, l’alias aurait été suffisant mais le prénom et le nom aident à donner un air plue réaliste. Les autes attributs indispensables, comme le CN, l’UPN et le mot de passe seront calculés dans le script.

Et voici le script adusers.ps1 que j’utilise :

Import-Module ActiveDirectory
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$ou = "OU=users,OU=demo,DC=demo1,DC=local"
$upnsuffix = "@demo1.local"
$securepwd = ConvertTo-SecureString "Pass/123" -AsPlainText -Force
Import-Csv "$path\adusers.csv" | New-ADUser `
    -Name {$_.GivenName+" "+$_.Surname} -Path $ou `
    -DisplayName {$_.GivenName+" "+$_.Surname} `
    -UserPrincipalName {$_.SamAccountName+$upnsuffix} `
    -AccountPassword $securepwd -Enabled $true

Remarquez que le contenu du CSV est directement envoyé à la commande New-ADUser : les noms des colonnes du CSV doivent correspondre exactement à des noms de paramètres de la commande. D’où l’intérêt de garder l’aide de la commande sous le coude.

Le script est à personnaliser en fonction de l’OU dans laquelle vous voulez créer les utilisateurs (variable $ou), du suffixe UPN ($upnsuffix) et du mot de passe (commun à tous les utilisateurs dans mon cas, voir $securepwd). Il doit être exécuté en tant qu’administrateur du domaine, et le fichier CSV doit se trouver dans le même répertoire que le script.

Comme vous pouvez le constater c’est très basique mais extensible. Par exemple si vous avez besoin d’un champ supplémentaire, vous pouvez ajouter la colonne supplémentaire dans le CSV ; si le champ peut être construit à partir des autres, il est plus simple de l’ajouter dans le script sous la forme d’un paramètre de New-ADUser.

En partant de  cette base minimale, vous pourrez sans doute construire votre propre script en fonction de vos besoins et contraintes.

[mise à jour] Voici une autre version du script, utilisant Select-Object pour ajouter aux objets retournés du CSV les attributs nécessaires pour New-ADUser. C’est peut-être plus élégant ?

Import-Module ActiveDirectory
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$ou = "OU=users,OU=demo,DC=demo1,DC=local"
$upnsuffix = "@demo1.local"
$securepwd = ConvertTo-SecureString "Pass/123" -AsPlainText -Force
Import-Csv "$path\adusers.csv" | Select-Object *,
        @{Name="Name"; Expression={$_.GivenName+" "+$_.Surname}},
        @{Name="Path"; Expression={$ou}},
        @{Name="DisplayName"; Expression={$_.GivenName+" "+$_.Surname}},
        @{Name="UserPrincipalName"; Expression={$_.SamAccountName+$upnsuffix}},
        @{Name="AccountPassword"; Expression={$securepwd}},
        @{Name="Enabled"; Expression={$true}} | New-ADUser
Comments (10)

  1. Anonymous says:

    Dariush2b : merci pour la remarque. C’est vrai sur un système où la "locale" est française (séparateur = point-virgule par défaut parce que la virgule est utilisée comme point décimal). Comme mes systèmes serveurs sont toujours en anglais US je n’ai pas
    pensé à ce cas.

  2. Anonymous says:

    Jenni : la variable $ou est à personnaliser en function de l’environnement, elle contient l’OU dans laquelle on veut créer les utilisateurs.

  3. jenni says:

    Serait-il possible d'expliquer la ligne : $ou = "OU=users,OU=demo,DC=demo1,DC=local"
    Merci.

  4. Anonymous says:

    Cet article fait partie d’une série : BYOD – Montage d’une plateforme de démo dans Azure – 1ère

  5. Dariush2b says:

    Import-Csv "$pathadusers.csv" -Delimiter ","| New-ADUser `
    je pense que c'est mieux avec un delimiter pour lire ton fichier csv :)

  6. Philippe says:

    Bonjour, je voudrais ajouter un utilisateur au groupe comment pourrais je y proceder ?

  7. Jérémy says:

    J’ai utilisé les modèles que vous avez et impossible de créer mes users. L’erreur suivante apparait pour chaque ligne:

    New-ADUser : Objet de l’annuaire non trouvé
    Au caractère C:UsersAdministrateurDesktopScripsPowerShelluser2.ps1:6 : 46
    + Import-Csv "$pathusers.csv" -Delimiter ";"| New-ADUser `
    + ~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (CN=\ ,OU=BIOPA…DC=LOCAL,DC=INT:String) [New-ADUser], ADIdentityNot

    FoundException
    + FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException

    ,Microsoft.ActiveDirectory.Management.Commands.NewADUser

    une idée?
    C’est un AD 2012
    Le fichier csv a pour séparateur les " ; "

    J’ai modifié votre demo en:

    Import-Module ActiveDirectory
    $path = Split-Path -parent $MyInvocation.MyCommand.Definition
    $ou = "OU=XX(c le nom de la société),OU=Utilisateurs,DC=XX,DC=LOCAL,DC=INT"
    $upnsuffix = "@XX.local"
    $securepwd = ConvertTo-SecureString "Laboratoire123*" -AsPlainText -Force
    Import-Csv "$pathusers.txt" -Delimiter ";"| New-ADUser `
    -Name {$_.GivenName+" "+$_.Surname} -Path $ou `
    -DisplayName {$_.GivenName+" "+$_.Surname} `
    -UserPrincipalName {$_.SamAccountName+$upnsuffix} `
    -AccountPassword $securepwd -Enabled $true

    Help!

  8. fred says:

    $upnsuffix = "@XX.local" ne correspond pas à votre chemin plus haut
    $ou = "OU=XX(c le nom de la société),OU=Utilisateurs,DC=XX,DC=LOCAL,DC=INT"

  9. Franck says:

    $ou = "OU=XX(c le nom de la société),OU=Utilisateurs,DC=XX,DC=LOCAL,DC=INT"
    Tu as inversé cette ligne il me semble :
    ce devrait plutot être :

    $ou = "OU=Utilisateurs,OU=XX(c le nom de la société),DC=XX,DC=LOCAL,DC=INT"

Skip to main content