Um Benutzer schnell und einfach zu migrieren können folgende Schritte durchgeführt werden.
Export der Benutzer:
Über Powershell mit folgendem Befehl alle Benutzer inkl. deren Informationen in ein CSV-File exportieren. Dabei den Pfad C:\temp\* beachten.
Get-ADUser -Filter * -Properties * | Select-Object * | Export-Csv -Path "C:\temp\adusers.csv" -NoTypeInformation
Bereinigung der CSV-Datei
Die CSV-Datei enthält alle im Active Directory vorhandenen Daten zu den Benutzern. Viele davon können, individuell nach Kunde, bereinigt werden. Folgende Attribute sind mindestens notwendig um neue Benutzer zu erstellen:
- SamAccountName: Der Login-Name für den Benutzer zur Anmeldung („j.doe“)
- Name: Der vollständige Name des Benutzers („John Doe“)
- GivenName: Vorname („John“)
- Surname: Nachname („Doe“
- UserPrincipalName: Name zur authentifzierung des Benutzers („j.doe@contoso.com“)
- DisplayName: Anzeigenamen („John Doe“)
- AccountPassword: Passwort des Benutzers
- Enabled: Ob der Benutzer aktiviert oder deaktiviert ist
- Path: Der distinguishedName (DN) oder LDAP Pfad unter dem der Benutzer erstellt werden soll (“ az.contoso.com -> OU=Users,DC=az,DC=contoso,DC=ch“)
Der OU/LDAP Pfad kann im Active Directory folgendermassen einfach gefunden werden:
- Active Directory öffnen
- Unter Ansicht „Erweiterte Features“ aktivieren
- Rechtsklick auf den gewünschten Ordner in den die Benutzer sollen
- In das Untermenü „Attribut-Editor“
- Der gewünschte Pfad ist unter „distinguishedName“ zu finden
Export der CSV-Datei in ein brauchbares Format
Nachdem bearbeiten der CSV-Datei (am einfachsten Excel) können die Daten wieder als CSV exportiert werden.
- WICHTIG: Die Daten müssen mit Komma (,) getrennt sein und nicht mit einem Semikolon (;).
- WICHTIG: Die Schreibweise der Werte zu den Attributen müssen mit denen des PowerShell Skriptes übereinstimmen!
Import der CSV-Datei und aller darin befindlichen Benutzer
Folgendes PowerShell Skript kann auf dem gewünschten Domänencontroller ausgeführt werden. Das Passwort wird ebenfalls aus der CSV-Datei gelesen. Dabei arbeitet es folgende Schritte ab:
- Nach Ausführen kann die gewünschte CSV-Datei ausgewählt werden
- Die Daten werden importiert
- Diverse Attribute die individuell eingestellt werden können werden entsprechend der CSV-Datei übernommen und dabei in der Konsole dokumentiert
- Wenn Attribute leer sind gibt es eine Meldung
- Eine Tabelle mit allen pro Benutzer erfassten Attributen und dazugehörigen Werten wird ausgegeben (Passwort wird lediglich als „SecureString“ angezeigt)
- Falls ein Benutzer bereits vorhanden ist wird dieser übersprungen
- Meldung wenn der Benutzer erfolgreich erstellt wurde
- WICHTIG: Spezialzeichen wir ä, ö, ü werden leider nicht unterstützt und müssen manuell korrigiert werden
# Import Active Directory module Import-Module ActiveDirectory # Open file dialog # Load Windows Forms Add-Type -AssemblyName System.Windows.Forms # Create and show open file dialog $dialog = New-Object System.Windows.Forms.OpenFileDialog $dialog.InitialDirectory = $StartDir $dialog.Filter = "CSV (*.csv)| *.csv" if ($dialog.ShowDialog() -eq 'OK') { $CSVFile = $dialog.FileName } else { Write-Host "File dialog was closed without selecting a file." Exit } # Import file into variable # Lets make sure the file path was valid # If the file path is not valid, then exit the script if ([System.IO.File]::Exists($CSVFile)) { Write-Host "Importing CSV..." $CSV = Import-Csv -LiteralPath "$CSVFile" Write-Host "CSV imported successfully." } else { Write-Host "File path specified was not valid" Exit } # Write whole CSV in console Write-Host $CSV # Loop through each user foreach ($user in $CSV) { Write-Host $user try { # Define the parameters using a hashtable $userProperties = @{ Name = "$($user.'FirstName') $($user.'LastName')" DisplayName = $user.DisplayName GivenName = $user.FirstName Surname = $user.LastName SamAccountName = $user.UserLogonName UserPrincipalName = $user.UserPrincipalName AccountPassword = ConvertTo-SecureString $user.Password -AsPlainText -Force EmailAddress = $user.EmailAddress Path = $user.OrganizationalUnit OfficePhone = $user.Phone StreetAddress = $user.Street City = $user.City PostalCode = $user.Zip Country = $user.Country Department = $user.Department #ProxyAddresses = $user.ProxyAddresses Enabled = $true #User is active ChangePasswordAtLogon = $false #Set the "User must change password at next logon" CannotChangePassword = $true #User cannot change password PasswordNeverExpires = $true #Set password never expires } # Check for null or empty values in user properties $userProperties.GetEnumerator() | ForEach-Object { if ([string]::IsNullOrEmpty($_.Value)) { Write-Host "Property '$($_.Key)' is null or empty for user $($user.Username). Skipping user creation." -ForegroundColor Yellow return } } # Display user properties Write-Host "Creating user with the following properties:" $userProperties | Format-Table -AutoSize # Check to see if the user already exists in AD if (Get-ADUser -Filter "SamAccountName -eq '$($user.UserLogonName)'") { # Give a warning if user exists Write-Host "A user with username $($user.UserLogonName) already exists in Active Directory." -ForegroundColor Yellow } else { # User does not exist then proceed to create the new user account # Account will be created in the OU provided by the $user.OrganizationalUnit variable read from the CSV file New-ADUser @userProperties Write-Host "The user $($user.UserLogonName) is created successfully." -ForegroundColor Green } } catch { # Handle any errors that occur during account creation Write-Host "Failed to create user $($user.UserLogonName) - $($_.Exception.Message)" -ForegroundColor Red Write-Host "Property '$($_.Key)' is null or empty for user $($user.Username). Skipping user creation." -ForegroundColor Yellow } }
Zusätzlich: ProxyAddresses exportieren/importieren
Auch ProxyAddresses können mit PowerShell einfach exportiert sowie importiert werden. Dazu sind lediglich 2 Befehle nötig.
1) Gibt eine Liste aus aller Benutzer die ProxyAddresses hinterlegt haben. Hier muss lediglich die entsprechende OU angepasst werden (siehe oben):
get-aduser -filter * -SearchBase "OU=Users,DC=az,DC=contoso,DC=ch" -Properties ProxyAddresses | select SamAccountName, ProxyAddresses
2) Exportiert eine Liste aller Benutzer mit ProxyAddresses als CSV-Datei unter dem Pfad C:\temp\userproxy.csv in folgendem Format:
- Spalte – SamAccountName („j.doe“) zur identifizierung des Benutzers
- Spalte – Liste aller ProxyAddresses (WICHTIG: muss auch Kommagetrennt (,) sein
Get-ADUser -Filter * -Properties proxyaddresses | Select-Object SamAccountName, @{L = "ProxyAddresses"; E = { ($_.ProxyAddresses -like 'smtp:*') -join ";"}} | Export-Csv -Path C:\temp\AdUsersProxyAddresses.csv -NoTypeInformation
3) Kontrolle der Einträge sowie der Identifier. Die Identifier müssen sein: „samaccountname“ sowie „Proxyaddresses“ für den korrekten Import.
4) Import aller ProxyAddresses mit folgendem PowerShell Befehl:
Import-Csv "C:\temp\ADUsers-ProxyAddresses.csv" | foreach {Set-ADUser -Identity $_.samaccountname -add @{Proxyaddresses=$_.Proxyaddresses -split ","}}
5) Mit Hilfe des unter 1. Punkt beschriebenen Befehls kann der Import einfach überprüft werden. Die Liste sollte nun erneut alle Benutzer anzeigen mit den entsprechend importierten ProxyAddresses