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