none
Powershell : mettre l'OU user dans une variable RRS feed

  • Question

  • Bonjour,

    Je tente d'écrire un script de création de compte AD depuis un csv en me basant sur un compte de référence pour définir l'OU , les memberships et le manager,  mais à l’exécution j'obtiens une erreur au moment où je tente de récupérer l'OU.

    Voici mon script:

    $csv = Import-Csv .\NewUsers.csv 
    
    ForEach ($i in $csv) 
    {
    $upn = "$i.Name.$i.FirstName"
    $upn2 = "$upn@domain.lan"
    $FullName = "$i.Name  $i.FirstName"
    $Ou = Get-QADUser -Identity $i.template | ft -hide ParentDN
    
    
    <#
    $DN = $User.distinguishedName
    $Mgr= $User.Manager
    $RefUser = [ADSI]"LDAP://$DN"
    $ou = $RefUser.Parent
    #>
    
    New-QADUser -Name $FullName `
    -SamAccountName $upn `
    -UserPrincipalName  $upn2 `
    -ParentContainer $ou `
    -DisplayName $FullName `
    -FirstName $i.FirstName `
    -LastName $i.Name `
    -UserPassword $i.pwd
    
    Set-QADUser -identity $upn -UserMustChangePassword $true
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix4
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix3
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix2
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix1 -Primary
    
    }
    

    et voici l'erreur:

    Pouvez vous m'aider, je m'arrache les cheveux?


    Orwell

    mardi 8 décembre 2015 15:34

Réponses

  • Bonjour,

    Peut être quelque chose comme çà ? (à améliorer bien sur...)

    Import-module ActiveDirectory
    $csv = Import-Csv .\NewUsers.csv

    function Get-ADParent ([string] $dn) {
         $parts = $dn -split '(?<![\\]),'
         $parts[1..$($parts.Count-1)] -join ','
    }

    ForEach ($i in $csv)
    {
    $SamAccount = $i.Name.Trim() + "." + $i.FirstName.Trim()
    $SamAccount = $SamAccount.ToLower()
    $upn = $SamAccount.Trim() + "@domain.lan"
    $FullName = $i.Name.ToUpper() + " " + $i.FirstName

    $RefUser = Get-QADUser -Identity $($i.Template)
    [string]$OU = Get-ADParent $($RefUser.DN)

    New-QADUser -Name "$FullName" -SamAccountName "$SamAccount" -UserPrincipalName "$upn" -ParentContainer $OU -DisplayName $FullName -FirstName $i.FirstName -LastName $i.Name -Manager $MGR -UserPassword (convertto-securestring "$($i.pwd)" -asplaintext -force ) | Enable-QADUser

    Set-QADUser -identity $upn -UserMustChangePassword $true
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix4
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix3
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix2
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix1 -Primary
    }


    Ludovic CHOLLET | Microsoft System Administrator

    • Marqué comme réponse G-Orwell mercredi 9 décembre 2015 19:42
    mercredi 9 décembre 2015 12:58

Toutes les réponses

  • La commande FT, pour Format-Table, sert a formater l'objet pour l'afficher sur la console. Ce faisant, elle dénature complément l'objet en question, et celui-ci devient inexploitable en dehors de l'affichage.

    Il est plutôt conseillé d'utiliser Select, Where ou d'autres commandes assimilées pour filtrer le contenu de l'objet.


    Bruce Jourdain de Coutance - Consultant MVP Exchange http://blog.brucejdc.fr

    mardi 8 décembre 2015 16:46
  • Bonsoir Bruce,

    Merci pour votre réponse.

    Quand je modifie mon code comme ceci, j'obtiens à peu près la même erreur

    import-module ActiveDirectory
    $csv = Import-Csv .\NewUsers.csv 
    
    ForEach ($i in $csv) 
    {
    $upn = "$i.Name.$i.FirstName"
    $upn2 = "$upn@domain.lan"
    $FullName = "$i.Name  $i.FirstName"
    
    $RefUser = Get-QADUser -identity $i.template
    $DN = $User.distinguishedName
    $MGR= $User.Manager
    $OU = $user.ParentDN
    
    
    New-QADUser -Name $FullName `
    -SamAccountName $upn `
    -UserPrincipalName  $upn2 `
    -ParentContainer $OU `
    -DisplayName $FullName `
    -FirstName $i.FirstName `
    -LastName $i.Name `
    -Manager $MGR `
    -UserPassword $i.pwd
    
    Set-QADUser -identity $upn -UserMustChangePassword $true
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix4
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix3
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix2
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix1 -Primary
    }

    L'erreur:

    Merci de votre aide


    Orwell

    mardi 8 décembre 2015 17:25
  • Bonjour,

    Comme indiqué dans l'erreur, votre variable $OU semble vide ou null.
    Et effectivement, il semble qu'il y ai une coquille entre les variables $RefUser & $user :

    
    $RefUser = Get-QADUser -identity $i.template
    $OU = $user.ParentDN

    Cdt,


    Ludovic CHOLLET | Microsoft System Administrator

    mercredi 9 décembre 2015 08:42
  • Bonjour,

    Merci à vous deux pour vos réponses.

    J'ai bien vu la coquille dans mon dernier code et je pense l'avoir corrigé, toutefois j'ai toujours le problème et je commence à m'énerver sur mon clavier.

    Par pitié pour lui (et pour moi) pouvez vous me corriger mon code?

    import-module ActiveDirectory
    $csv = Import-Csv .\NewUsers.csv 
    
    ForEach ($i in $csv) 
    {
    $upn = "$i.Name.$i.FirstName"
    $upn2 = "$upn@domain.lan"
    $FullName = "$i.Name  $i.FirstName"
    
    
    $RefUser = Get-ADUser -Identity $i.Template 
    $DN = $RefUser.distinguishedName
    $RefUser2 = [ADSI]"LDAP://$DN"
    $OU = $RefUser2.ParentDN
    
    
    
    New-QADUser -Name $FullName `
    -SamAccountName $upn `
    -UserPrincipalName  $upn2 `
    -ParentContainer $OU `
    -DisplayName $FullName `
    -FirstName $i.FirstName `
    -LastName $i.Name `
    -Manager $MGR `
    -UserPassword $i.pwd
    
    Set-QADUser -identity $upn -UserMustChangePassword $true
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix4
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix3
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix2
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $upn$MailSuffix1 -Primary
    }
    

    L'erreur maintenant est

    Merci de votre aide


    Orwell

    mercredi 9 décembre 2015 10:50
  • Bonjour,

    Je ne comprends pas trop votre raisonnement algorithmique et vos choix techniques pour la conception de ce script.

    Vous chargez par exemple le module ActiveDirectory mais vous utilisez les cmdlet du snappin Quest ActiveRoles.

    Afin de répondre correctement à votre besoin, pouvez vous m'indiquer le format de votre fichier CSV d'entré ? (les premiers lignes suffiront).

    Cdt,


    Ludovic CHOLLET | Microsoft System Administrator

    mercredi 9 décembre 2015 12:18
  • Ok, oui c'est vrai que j'ai chargé le module active directory parce que au cours de mes essais j'ai fait des tests avec les cmdlet microsoft mais aussi avec les cmdlet quest. J'ai donc laissé les 2 en têtes pour pouvoir utiliser l'une et/ou l'autre en fonction de ce qui sera le plus simple pour moi.

    Mon csv est ainsi:

    Template,Name,FirstName,pwd,Mailsuffix1,Mailsuffix2,Mailsuffix3,Mailsuffix4
    Template Market,LE BOSS ,C-moi,CquilePatron?,@domain.fr,@domain.it,@domain.es,@domain.be
    Template Sale,TERIEUR,Alex,!Nterieur*,@domain.fr,@domain.it,@domain.es,@domain.be
    Template Compta,TERIEUR,Alain,Xterieur*!,@domain.fr,@domain.it,@domain.es,@domain.be

    Merci de votre aide


    Orwell

    mercredi 9 décembre 2015 12:33
  • Bonjour,

    Peut être quelque chose comme çà ? (à améliorer bien sur...)

    Import-module ActiveDirectory
    $csv = Import-Csv .\NewUsers.csv

    function Get-ADParent ([string] $dn) {
         $parts = $dn -split '(?<![\\]),'
         $parts[1..$($parts.Count-1)] -join ','
    }

    ForEach ($i in $csv)
    {
    $SamAccount = $i.Name.Trim() + "." + $i.FirstName.Trim()
    $SamAccount = $SamAccount.ToLower()
    $upn = $SamAccount.Trim() + "@domain.lan"
    $FullName = $i.Name.ToUpper() + " " + $i.FirstName

    $RefUser = Get-QADUser -Identity $($i.Template)
    [string]$OU = Get-ADParent $($RefUser.DN)

    New-QADUser -Name "$FullName" -SamAccountName "$SamAccount" -UserPrincipalName "$upn" -ParentContainer $OU -DisplayName $FullName -FirstName $i.FirstName -LastName $i.Name -Manager $MGR -UserPassword (convertto-securestring "$($i.pwd)" -asplaintext -force ) | Enable-QADUser

    Set-QADUser -identity $upn -UserMustChangePassword $true
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix4
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix3
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix2
    Get-QADUser -identity $upn | Add-QADProxyAddress -Type SMTP -Address $SamAccount$MailSuffix1 -Primary
    }


    Ludovic CHOLLET | Microsoft System Administrator

    • Marqué comme réponse G-Orwell mercredi 9 décembre 2015 19:42
    mercredi 9 décembre 2015 12:58
  • Merci beaucoup.

    Ca marche parfaitement.


    Orwell

    mercredi 9 décembre 2015 19:42