1. Home
  2. Active Directory – Bulk Import/Export

Active Directory – Bulk Import/Export

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:

  1. Active Directory öffnen
  2. Unter Ansicht „Erweiterte Features“ aktivieren
  3. Rechtsklick auf den gewünschten Ordner in den die Benutzer sollen
  4. In das Untermenü „Attribut-Editor“
  5. 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.

  1. WICHTIG: Die Daten müssen mit Komma (,) getrennt sein und nicht mit einem Semikolon (;).
  2. 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:

  1. Spalte – SamAccountName („j.doe“) zur identifizierung des Benutzers
  2. 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

Updated on 11. März 2024

War dieser Artikel hilfreich?

Need Support?
Can't find the answer you're looking for?
Contact Support