AD-User per Powershell anlegen
AD-Benutzerkonten mit PowerShell anlegen Muss man mehrere Benutzer im Active Directory anlegen, dann ist PowerShell unter den Bordmitteln das Tool der Wahl. Zumeist importiert man dabei die Daten aus einer CSV-Datei, bevor man sie an das Cmdlet New-ADUser übergibt. Das Modul ActiveDirectory enthält unter anderem mehrere Cmdlets für das User-Management. Für das Anlegen neuer Konten ist New-ADUser zuständig. Es akzeptiert insgesamt rund 50 Parameter, deren Namen mit den Attributen im AD übereinstimmen. Dazu zählen etwa Name, GivenName, Enabled, Manager, Office, etc.
User mit den wichtigsten Attributen anlegen
Der simpelste Aufruf könnte so aussehen, wenn man einen Benutzer mit dem SamAccountName Max.Meier erzeugen möchte:
New-AdUser -Name Max.Meier
In der Regel möchte man aber einige weitere Attribute auf einen bestimmten Wert setzen:
New-ADUser -Name Max.Meier -GivenName Max -Surname Meier -Path "OU=Benutzer,DC=contoso,DC=Com"
Der Benutzer wird so mit Vor- und Nachnamen in einer OU angelegt. Er ist allerdings noch deaktiviert, da er noch kein Passwort erhalten hat. Dieses lässt sich nicht im Klartext übergeben, sondern nur als Secure String:
$password = "Password123" | ConvertTo-SecureString -AsPlainText -Force New-ADUser -Name Max.Meirer -GivenName Max -Surname Meier -Path "OU=Benutzer,DC=contoso,DC=com" -Enabled $True -AccountPassword $Password -ChangePasswordAtLogon $True
Dieser Befehl ordnet nun dem Benutzer über den Parameter AccountPassword ein entsprechendes Passwort zu. Es lassen sich jetzt natürlich noch zahlreiche weitere Attribute mit Werten versehen. Für die einfache Benutzeranlage reicht dieses Beispiel allerdings schon jetzt aus, damit sich der User am System anmelden kann.
Benutzerimport per CSV Datei
Bei einer größeren Zahl an Benutzern wird man diese nicht anlegen, indem man New-AdUser für jeden separat aufruft. Am besten eignet hier der Import von Daten aus einer CSV-Datei. Beispiel für die Struktur einer CSV-DAtei für den Import in das Active Directory
Name,Vorname,Nachname,Password,Department Max.Meier,Max,Meier,Password123,Einkauf Uta.Meier,Uta,Meier,Password123,Vertrieb
Import der CSV-Datei:
Import-CSV .\benutzer.csv | New-ADUser -AccountPassword (ConvertTo-SecureString "Password123" -AsPlainText -force)
Diese simple Variante des Scripts verzichtet auf die Verwendung von Parametern beim Aufruf von New-AdUser. In diesem Fall müssen die Spaltenüberschriften in der CSV-Datei aber exakt mit den Namen der Parameter übereinstimmen. Eine Einschränkung dieses Scripts besteht darin, dass man das Passwort separat auf der Kommandozeile übergeben muss, so dass es in diesem Beispiel für alle Konten identisch ist.
Individuelle Passwörter setzen:
Möchte man für jeden Benutzer ein eigenes Kennwort vorgeben, dann kann man dafür über die einzelnen Datensätze der CSV-Datei iterieren:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.Snap $Import =Import-CSV "c:\Benutzer.csv" $OU = "OU=Benutzer,DC=contoso,DC=com" foreach ($user in $Import){ $password = $user.password | ConvertTo-SecureString -AsPlainText -Force New-ADUser -Name $user.name -GivenName $user.Vorname -Surname $user.Nachname -Path $OU -AccountPassword $Password -ChangePasswordAtLogon $True -Enabled $True -UserPrincipalName ($user.Vorname + "." + $user.Nachname + $user.UPN)
Lässt sich die CSV-Datei importieren, dann legt PowerShell die Benutzer in der vorgegebenen Organisationseinheit an. Darüber hinaus bestimmt das Script , dass der User das Passwort beim ersten Anmelden ändern muss.
<WRAP center round box 90% leftalign> Alternativ: PowerShell-Script zum Anlegen mehrerer AD-User:
===PowerShell-Start=== ########################################################### # AUTHOR : Marius / Hican - http://www.hican.nl - @hicannl # DATE : 26-04-2012 # EDIT : 07-08-2014 # COMMENT : This script creates new Active Directory users, # including different kind of properties, based # on an inputcreatead_users.csv. # VERSION : 1.3 ########################################################### # CHANGELOG # Version 1.2: 15-04-2014 - Changed the code for better # - Added better Error Handling and Reporting. # - Changed input file with more logical headers. # - Added functionality for account Enabled, # PasswordNeverExpires, ProfilePath, ScriptPath, # HomeDirectory and HomeDrive # - Added the option to move every user to a different OU. # Version 1.3: 08-07-2014 # - Added functionality for ProxyAddresses # ERROR REPORTING ALL Set-StrictMode -Version latest #---------------------------------------------------------- # LOAD ASSEMBLIES AND MODULES #---------------------------------------------------------- Try { Import-Module ActiveDirectory -ErrorAction Stop } Catch { Write-Host "[ERROR]t ActiveDirectory Module couldn't be loaded. Script will stop!" Exit 1 } #---------------------------------------------------------- #STATIC VARIABLES #---------------------------------------------------------- $path = Split-Path -parent $MyInvocation.MyCommand.Definition $newpath = $path + "\importcreatead_users.csv" $log = $path + "\createadusers.log" $date = Get-Date $addn = (Get-ADDomain).DistinguishedName $dnsroot = (Get-ADDomain).DNSRoot $i = 1 #---------------------------------------------------------- #START FUNCTIONS #---------------------------------------------------------- Function Start-Commands { Create-Users } Function Create-Users { "Processing started (on " + $date + "): " | Out-File $log -append "--------------------------------------------" | Out-File $log -append Import-CSV $newpath | ForEach-Object { If (($_.Implement.ToLower()) -eq "yes") { If (($*.GivenName -eq "") -Or ($*.LastName -eq "") -Or ($_.Initials -eq "")) { Write-Host "\[ERROR\]t Please provide valid GivenName, LastName and Initials. Processing skipped for line $($i)r\n" "\[ERROR\]t Please provide valid GivenName, LastName and Initials. Processing skipped for line $($i)r\n" | Out-File $log -append } Else { # Set the target OU $location = $_.TargetOU + ",$($addn)" # Set the Enabled and PasswordNeverExpires properties If (($_.Enabled.ToLower()) -eq "true") { $enabled = $True } Else { $enabled = $False } If (($_.PasswordNeverExpires.ToLower()) -eq "true") { $expires = $True } Else { $expires = $False } # A check for the country, because those were full names and need # to be land codes in order for AD to accept them. I used Netherlands # as example If($_.Country -eq "Netherlands") { $_.Country = "NL" } Else { $_.Country = "EN" } # Replace dots / points (.) in names, because AD will error when a # name ends with a dot (and it looks cleaner as well) $replace = $_.Lastname.Replace(".","") If($replace.length -lt 4) { $lastname = $replace } Else { $lastname = $replace.substring(0,4) } # Create sAMAccountName according to this 'naming convention': # <FirstLetterInitials><FirstFourLettersLastName> for example # htehp $sam = $_.Initials.substring(0,1).ToLower() + $lastname.ToLower() Try { $exists = Get-ADUser -LDAPFilter "(sAMAccountName=$sam)" } Catch { } If(!$exists) { # Set all variables according to the table names in the Excel # sheet / import CSV. The names can differ in every project, but # if the names change, make sure to change it below as well. $setpass = ConvertTo-SecureString -AsPlainText $_.Password -force Try { Write-Host "\[INFO\]\t Creating user : $($sam)" "\[INFO\]\t Creating user : $($sam)" | Out-File $log -append New-ADUser $sam -GivenName $*.GivenName -Initials $*.Initials \ -Surname $*.LastName -DisplayName ($*.LastName + "," + $*.Initials + " " + $*.GivenName) \ -Office $*.OfficeName -Description $*.Description -EmailAddress $_.Mail \ -StreetAddress $*.StreetAddress -City $*.City -State $_.State \ -PostalCode $*.PostalCode -Country $*.Country -UserPrincipalName ($sam + "@" + $dnsroot) \ -Company $*.Company -Department $*.Department -EmployeeID $_.EmployeeID \ -Title $*.Title -OfficePhone $*.Phone -AccountPassword $setpass -Manager $_.Manager #[SNAP]DOWNLOAD THE SCRIPT FOR THE REST OF THE CODE[/SNAP] } "--------------------------------------------" + "rn" | Out-File $log -append } Write-Host "STARTED SCRIPTrn" Start-Commands Write-Host "STOPPED SCRIPT" ===PowerShell-Ende===
===CSV-Start=== CSV-Datei mit Benutzerdaten: In the Excel file / Input CSV the following (general) structure was used (the values are example values). importcreatead_users.csv # LINE1 (the table headings in the Excel) # Implement,GivenName,LastName,Initials,OfficeName, # Description,Mail,StreetAddress,City,PostalCode, # State,Country,Company,Department,EmployeeID, # ExtensionAttribute1,Title,Phone,Manager,ProfilePath, # ScriptPath,HomeDirectory,HomeDrive,Password, # PasswordNeverExpires,Enabled,TargetOU,ProxyAddresses # LINE2 (first entry, all other entries look the same. As you can see # there are also tables which aren't used, but are no problem for # the script to work! # Yes,Hican,TehPwn,H.,Hican Building,Hican Net, # your@email.com,Hicanstreet 1,Hicancity,1337, # TheStateOfHican,Netherlands,Hican.nl,*,HIC1337,, # CEO,+0000000000,Hican,\\profile\path,\\script\path,\\home\\dir,H:,IDDQD_1337#, # False,True,"OU=Users,OU=Lab","SMTP:CHECK;SMTP:CHECK2" ===CSV-Ende===