onsdag 23 maj 2012

Skapa användare i AD från en CSV-fil med Powershell.

Importera användare till Active Directory från en csv-fil med hjälp av Powershell kan vara väldigt enkelt men några vanliga fällor kan dyka upp. Här är några av mina lösningar.

 CSV-filen
· Formatet på infilen, dessa verkar alltid vara olika. I vissa fall kan de lösas med delimiter parametern på import-csv (finns från och med version 2 av Powershell)
exempel : 
import-csv .\test.csv -Delimiter ";"
· Ett annat fel som jag stött på är om första raden (kolumnhuvuden) avslutas med ett skiljetecken. Detta verkar inte Powershell inte kunna hantera.
Exempel:
Name;ålder;längd;
Jim;42;185
Radera semikolonet efter längd så kommer de fungera.
·  Teckenformatet klara inte åäö i datat. En lösning på detta problemet är att köra "get-content" och skicka de till en ny fil.
Exempel:
get-content .\test.csv > .\test_fixed.csv
Lösenordet.
 Se till att de lösenordet du försöker sätta följer lösenordspolicyn i domänen. De går inte att skicka med lösenordet som en sträng i klartext. Här är två exempel på hur du kan göra.
· Om lösenordet ska vara enligt ett fält från csv-filen måste de konverteras till ett System.Security.SecureString-format.  I detta exempel är lösenordet sparat i "Password" kolumnen vilket inte kommer fungera utan att byta namn på parametern enligt exempel i nästa sektion.
import-csv .\test.csv -Delimiter ";" |
% {$_.password = $_.password |
ConvertTo-SecureString -AsPlainText -Force;$_}
· Om de är en större mängd konton som ska skapas med samma lösenord, skapa variablen först exempel:
$UsrPwd = convertto-securestring "Password-1" -asplaintext -force
Variabeln kan sen användas med New-ADUser cmdlet.
Exempel:
New-ADUser -Name "Jimmy" -AccountPassword $UsrPwd

Parameternamnen ska matcha kolumnhuvuden.
Snyggast är de när objektet som kommer i pipen mappar sina attribut direkt till rätt parametrar. För att få rätt kolumn till rätt parameter kan de krävas att namnen ändras. Om de är en engångsföreteelse är de nog enklast att byta kolumnnamn i csv-filen. I andra fall kan powershell mappa om parametrar med  Select-object cmdlet. Exempelet nedan mappar om 'Efternamn' till 'Surname' och 'Password' till 'AccountPassword'.  

 
Import-Csv -Path $sPath -Delimiter ";"| Select @{Name="Surname";Expression={$_."Efternamn"}}, @{Name="AccountPassword";Expression={$_."Password"}} | New-ADUser
I vissa fall kan man behöva lägga till flera attribut direkt i pipen med data som inte kommer från csv-filen. Exempel:

Import-Csv -Path $sPath -Delimiter ";" | Add-Member -name AccountPassword -type noteproperty -value $Password –PassThru | New-ADUser


1 kommentar:

  1. Stort tack för tipset! Fick totalt hjärnsläpp och insåg inte att import-csv kanske klagade på filens teckenkodning :-) Slutade med detta script (som passar ihop med exempel-CSVn under)

    PS-scriptet->

    $Users = Import-Csv -Delimiter ';' -Path "C:\import-users-fixed.csv"
    foreach ($User in $Users)
    {
    $Displayname = $User.'Firstname' + " " + $User.'Lastname'
    $UserFirstname = $User.'Firstname'
    $UserLastname = $User.'Lastname'
    $OU = $User.'OU'
    $SAM = $User.'SAM'
    $UPN = $User.'Firstname' + "." + $User.'Lastname' + "@" + $User.'Maildomain'
    $Description = $User.'Description'
    $Password = $User.'Password'
    New-ADUser -Name "$Displayname" -DisplayName "$Displayname" -SamAccountName "$SAM" -UserPrincipalName "$UPN" -GivenName "$UserFirstname" -Surname "$UserLastname" -Description "$Description" -AccountPassword (ConvertTo-SecureString "$Password" -AsPlainText -Force) -Enabled $true -Path "$OU" -ChangePasswordAtLogon $false –PasswordNeverExpires $true -server localhost
    }

    CSV-filen->

    Firstname;Lastname;Maildomain;SAM;OU;Password;Description
    User;Test01;contoso.com;utest01;OU=Users,DC=domain,DC=loc;P@ssw0rd;Test User 1
    User;Test02;contoso.com;utest02;OU=Users,DC=domain,DC=loc;P@ssw0rd31;Test User 2

    SvaraRadera