none
[PowerShell] Erreur avec un import-csv et new-ADUser RRS feed

  • Question

  • Bonjour, je réalise en ce moment un script pour Créer l'architecture D'OU et de Groupes de mon AD ainsi que pour le peupler, tout cela via un .CSV

    Le fichier CSV se structure de la manière suivante:

    ID;Firstname;Lastname;country;location;department;
    1;John;Snow;France;Paris;Management;

    Niveau OU et groupe je les créer via les champs country, location et department et je n'ai aucun problème. Par contre dans la dernière partie de mon script, pour l'import des utilisateurs, j'ai été confronté à pas mal d'erreurs differentes selon mes changements:

    -New-ADUSer : The object name has bad syntax.

    -You cannot call a method on a null-valued expression. (Pour la méthode Substring dans le Add-ADGroupMember)

    Ces erreurs ci, allant avec ce script là:

    $global:Credential = Get-Credential
    
    Import-Csv "CSV.csv" -Delimiter ";" | ForEach-Object {
        
        $samaccountname = $_.Firstname.Substring(0,1) + $_.Lastname
        $firstname = $_.Firstname    
    
        if ($_.country -eq "France")
        {
            switch ($_.department)
        	{
                "Management"
        			{  
        				New-ADUser -SamAccountName $samaccountname -Name $firstname `
        				 -ChangePasswordAtLogon 1 -EmployeeID $_.ID `
        				 -City $_.location `
        				 -Country $_.country `
        				 -Path ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan") `
        				 -DisplayName $_.Lastname -Credential $global:Credential;
        				Add-ADGroupMember -identity ("G_" + $_.location.Substring(0,3) + "_management_R") -Member $samaccountname -Credential $global:Credential; 
        			}
            }
        }
    }

    Si je retire les variables et que j'utilise directement les champs $_.Firstname et $_.Lastname il me dit que la valeur des champs sont nul. Or si j'utilise un Write-Host $_.Firstname je vois bien le prénom dans mes logs.

    Si vous avez une petite idée.. 

    Merci d'avance

    samedi 26 avril 2014 17:06

Réponses

  • Je viens de tester ton code. A priori, dans un "Switch", "$_" devient le nom qui a "matché" dans le switch.

    Essaie :

    Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";" | ForEach-Object {
        
        $samaccountname = $_.Firstname.Substring(0,1) + $_.Lastname
        $firstname = $_.Firstname    
    
        if ($_.country -eq "France")
        {
            switch ($_.department)
        	{
                "Management"
        			{  
        				#New-ADUser -SamAccountName $samaccountname -Name $firstname `
        				 #-ChangePasswordAtLogon 1 -EmployeeID $_.ID `
        				# -City $_.location `
        				# -Country $_.country `
        				# -DisplayName $_.Lastname
        				 #-Path ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
        				#Add-ADGroupMember -identity ("G_" + $_.location.Substring(0,3) + "_management_R") -Member $samaccountname -Credential $global:Credential; 
                        ("G_" + $_.location.Substring(0,3) + "_management_R")
                        ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
                        $_
        			}
            }
        }
    }

    Je te conseil donc d'utiliser le scriptword "ForEach" au lieu de la cmdlet "ForEach-Object" :

    #Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";" | ForEach-Object {
    foreach($User in (Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";")){
        $samaccountname = $User.Firstname.Substring(0,1) + $_.Lastname
        $firstname = $User.Firstname    
    
        if ($User.country -eq "France")
        {
            switch ($User.department)
        	{
                "Management"
        			{  
        				#New-ADUser -SamAccountName $samaccountname -Name $firstname `
        				 #-ChangePasswordAtLogon 1 -EmployeeID $_.ID `
        				# -City $_.location `
        				# -Country $_.country `
        				# -DisplayName $_.Lastname
        				 #-Path ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
        				#Add-ADGroupMember -identity ("G_" + $_.location.Substring(0,3) + "_management_R") -Member $samaccountname -Credential $global:Credential; 
                        ("G_" + $User.location.Substring(0,3) + "_management_R")
                        ("OU=users,OU=management,OU=" + $User.location + ",OU=agencies,DC=shiptruck,DC=lan")
                        $_
                        $User
        			}
            }
        }
    }

    Qu'en penses-tu ?


    Blog

    dimanche 27 avril 2014 11:52
  • J'ai commenté ligne par ligne, et c'est le paramètre -Country qui pose problème, sans lui, plus aucun problème.
    Il ne reste plus qu'a savoir pourquoi $User.country n'est pas acceptable pour -Country :-) 

    La réponse est ici :

    http://social.technet.microsoft.com/Forums/en-US/827c4208-834f-4248-b995-51e88c0ee68c/setaduser-update-countryregion-attribute-field-in-aduc?forum=winserverpowershell

    Tente un de rajouter ceci à la place du "-Country"

    -OtherAttributes  @{co=$User.country}


    Blog

    dimanche 27 avril 2014 15:37

Toutes les réponses

  • Bonjour,
    Essaie juste :
    Import-Csv "CSV.csv" -Delimiter ";"
    Le CSV est-il bien interprété ? Personnellement, j'ai eu beaucoup de soucis avec cette cmdlet lorsque mon CSV terminait par des points virgules (colonne vide).

    Blog

    samedi 26 avril 2014 22:24
  • Bonjour et merci, j'ai essayé la commande avec et sans les ; à la fin du csv, et PS me l'interprète de la même façon:

    PS C:\> Import-Csv "CSV.CSV" -Delimiter ";"


    ID         : 1
    Firstname  : John
    Lastname   : Snow
    country    : France
    location   : Paris
    department : Management

    Niveau SamAccountName j'ai le droit de mettre "jsnow" ? 
    dimanche 27 avril 2014 09:47
  • Je viens de tester ton code. A priori, dans un "Switch", "$_" devient le nom qui a "matché" dans le switch.

    Essaie :

    Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";" | ForEach-Object {
        
        $samaccountname = $_.Firstname.Substring(0,1) + $_.Lastname
        $firstname = $_.Firstname    
    
        if ($_.country -eq "France")
        {
            switch ($_.department)
        	{
                "Management"
        			{  
        				#New-ADUser -SamAccountName $samaccountname -Name $firstname `
        				 #-ChangePasswordAtLogon 1 -EmployeeID $_.ID `
        				# -City $_.location `
        				# -Country $_.country `
        				# -DisplayName $_.Lastname
        				 #-Path ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
        				#Add-ADGroupMember -identity ("G_" + $_.location.Substring(0,3) + "_management_R") -Member $samaccountname -Credential $global:Credential; 
                        ("G_" + $_.location.Substring(0,3) + "_management_R")
                        ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
                        $_
        			}
            }
        }
    }

    Je te conseil donc d'utiliser le scriptword "ForEach" au lieu de la cmdlet "ForEach-Object" :

    #Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";" | ForEach-Object {
    foreach($User in (Import-Csv "C:\Users\Administrator\Desktop\csv.csv" -Delimiter ";")){
        $samaccountname = $User.Firstname.Substring(0,1) + $_.Lastname
        $firstname = $User.Firstname    
    
        if ($User.country -eq "France")
        {
            switch ($User.department)
        	{
                "Management"
        			{  
        				#New-ADUser -SamAccountName $samaccountname -Name $firstname `
        				 #-ChangePasswordAtLogon 1 -EmployeeID $_.ID `
        				# -City $_.location `
        				# -Country $_.country `
        				# -DisplayName $_.Lastname
        				 #-Path ("OU=users,OU=management,OU=" + $_.location + ",OU=agencies,DC=shiptruck,DC=lan")
        				#Add-ADGroupMember -identity ("G_" + $_.location.Substring(0,3) + "_management_R") -Member $samaccountname -Credential $global:Credential; 
                        ("G_" + $User.location.Substring(0,3) + "_management_R")
                        ("OU=users,OU=management,OU=" + $User.location + ",OU=agencies,DC=shiptruck,DC=lan")
                        $_
                        $User
        			}
            }
        }
    }

    Qu'en penses-tu ?


    Blog

    dimanche 27 avril 2014 11:52
  • Effectivement je n'avais pas remarqué que $_ donné le match du switch. Je pensais tout de même que cela serait possible avec la cmdlet, mais je vais suivre ton conseil. j'ai supprimé mes $samaccountname et $firstname et corrigé le tout qui donne:

    foreach($User in (Import-Csv "C:\CSV.csv" -Delimiter ";")){
    
        if ($User.country -eq "France")
        {
            switch ($User.department)
        	{
                "Management"
        			{  
        				New-ADUser -SamAccountName ($User.Firstname.Substring(0,1) + $User.Lastname) -Name $User.Firstname `
        				-ChangePasswordAtLogon 1 -EmployeeID $User.ID `
        				-City $User.location `
        				-Country $User.country `
        				-DisplayName $User.Lastname `
        				-Path ("OU=users,OU=management,OU=" + $User.location + ",OU=agencies,DC=shiptruck,DC=lan") ;
        				Add-ADGroupMember -identity ("G_" + $User.location.Substring(0,3) + "_management_R") -Member ($User.Firstname.Substring(0,1) + $User.Lastname) ;
        			}
            }
        }
    }

    Je n'ai plus d'erreur de valeurs nul ou de mauvaise syntaxe ou de mauvaise utilisation de méthode. Par contre il me reste apparemment une valeur non "acceptable". 

    J'ai pensé au SamAccountName "JSnow" d'appliquer la méthode ToLower(); mais sans succès, toujours la même erreur. Pourtant en créant l'utilisateur manuellement avec les même valeur, pas de problème. Et si j’exécute mon script après l'avoir crée manuellement, je n'ai plus la même erreur, mais j'ai directement "l'utilisateur existe déjà". 

    foreach($User in (Import-Csv "C:\CSV.csv" -Delimiter ";")){
    
        $samaccountname = ($User.Firstname.Substring(0,1) + $User.Lastname).ToLower();
    
        if ($User.country -eq "France")
        {
            switch ($User.department)
        	{
                "Management"
        			{  
        				New-ADUser -SamAccountName $samaccountname -Name $User.Firstname `
        				-ChangePasswordAtLogon 1 -EmployeeID $User.ID `
        				-City $User.location `
        				-Country $User.country `
        				-DisplayName $User.Lastname `
        				-Path ("OU=users,OU=management,OU=" + $User.location + ",OU=agencies,DC=shiptruck,DC=lan") ;
        				Add-ADGroupMember -identity ("G_" + $User.location.Substring(0,3) + "_management_R") -Member $samaccountname ;
        			}
            }
        }
    }


    dimanche 27 avril 2014 13:13
  • J'ai commenté ligne par ligne, et c'est le paramètre -Country qui pose problème, sans lui, plus aucun problème.
    Il ne reste plus qu'a savoir pourquoi $User.country n'est pas acceptable pour -Country :-) 
    dimanche 27 avril 2014 13:43
  • J'ai commenté ligne par ligne, et c'est le paramètre -Country qui pose problème, sans lui, plus aucun problème.
    Il ne reste plus qu'a savoir pourquoi $User.country n'est pas acceptable pour -Country :-) 

    La réponse est ici :

    http://social.technet.microsoft.com/Forums/en-US/827c4208-834f-4248-b995-51e88c0ee68c/setaduser-update-countryregion-attribute-field-in-aduc?forum=winserverpowershell

    Tente un de rajouter ceci à la place du "-Country"

    -OtherAttributes  @{co=$User.country}


    Blog

    dimanche 27 avril 2014 15:37