Userverwaltung

In diesem Tutorial erstellen wir eine Userverwaltung.

Erstelle eine neue Datei mit dem folgenden Inhalt und speichere diese als .csv ab.

Abteilung;Nachname;Vorname
Einkauf;Schreiber;Florian
Einkauf;Bayer;Maik
Einkauf;Schweitzer;Michelle
Einkauf;Schweitzer;Marco
Verkauf;Seiler;Barbara
Verkauf;Amsel;Anne
Verkauf;Moeller;Stefanie
Verkauf;Moeller;Sven
Verkauf;Moeller;Stefan

Aufgabe 1

Lade die CSV mit dem Befehl Import-Csv und gib die Länge der Liste aus. Zusätzlich gebe jeden Nachname aus (keine duplikate).

Lösung

# -Delimiter ";" - um den trenner zwischen den Daten in einer Zeile festzulegen
# -Encoding Default - damit die Datei als Windows 1251 geöffnet wird (Zeichenkodierung)
$users = Import-Csv -Delimiter ";" -Encoding Default "users.csv"

# $users.length gibt die Länge des Arrays zurück
Write-Host "Es gibt " $users.length " User"

# Mit $users.Nachname wird ein neuer Array erzeugt in welchem nur die Nachname sind
# Dabei exisiteren aber noch die Duplikate
$lastnames = $users.Nachname

# Mit diesem Befehl kann ich nun die eindeutigen Nachnamen ermitteln
$lastnames = $lastnames | Get-Unique

Write-Host $lastnames

Aufgabe 2

Generiere die Benutzernamen für alle Benutzer.

Dabei gibt es die folgenden Reglen: - keine Duplikate - erstes Zeichen von Vorname + Nachname - falls dies nicht möglich ist zwei Zeichen usw.. - falls dies nicht geht soll eine Zahl zwischen dem ganzen Vor- und Nachname eingefügt werden.

Lösung

# -Delimiter ";" - um den trenner zwischen den Daten in einer Zeile festzulegen
# -Encoding Default - damit die Datei als Windows 1251 geöffnet wird (Zeichenkodierung)
$users = Import-Csv -Delimiter ";" -Encoding Default "users.csv"

# Fügt das Feld Username zu den Objekten im Array hinzu
$users | Add-Member Username ""


foreach ($user in $users) {
    $firstname_count = 0 # wird mit 0 initialisiert da es bei der Schleife direkt erhöht wird
    $zahl = 0

    # Im ersten Schritt werden alle Zeichen in Kleinbuchstaben umgewandelt und dann alle Zeichen welche im Benutzernamen nicht zulässig sind entfernt
    # hierfür wird .Replace() verwendet
    $firstname = $user.Vorname.ToLower().Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss")
    $lastname = $user.Nachname.ToLower().Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss")


    do {
        # Erhöht die Anzahl der Zeichen vom Vornamen
        $firstname_count++

        # Prüft ob die Anzahl der Zeichen vom Vornamen größer ist als die Länge des Vornamens
        # falls ja dann wird probiert eine Zahl zwischen Vorname und Nachname einzufügen
        if ($firstname_count -gt $firstname.length) {
            $zahl++
            $username = $firstname + $zahl + $lastname
        } else {
            # $firstname.Substring(0, X) gibt die Zeichen bis X
            # Wenn X gleich 1 ist gibt es das erste Zeichen zurück
            # Wenn X gleich 2 ist gibt es die ersten zwei Zeichen zurück
            $username = $firstname.Substring(0, $firstname_count) + $lastname
        }
        # $users.Username erstellt wieder einen Array mit allen Benutzernamen
        # mit -contains wird geprüft ob der Name in diesem Array existiert
        # dadurch wird die Schleife solange wiederholt bis ein Benutzername frei ist
    } while ($users.Username -contains $username)

    # Setzt den Benutzernamen beim Objekt
    $user.Username = $username
}

# Gibt alle User aus
Write-Host $users

Aufgabe 3

Generiere nun zusätzlich für jeden Benutzer ein Passwort und speichere es anschließend in eine CSV zurück.

Lösung

# -Delimiter ";" - um den trenner zwischen den Daten in einer Zeile festzulegen
# -Encoding Default - damit die Datei als Windows 1251 geöffnet wird (Zeichenkodierung)
$users = Import-Csv -Delimiter ";" -Encoding Default "users.csv"

# Fügt das Feld Username zu den Objekten im Array hinzu
$users | Add-Member Username ""
$users | Add-Member Password ""


foreach ($user in $users) {
    $firstname_count = 0 # wird mit 0 initialisiert da es bei der Schleife direkt erhöht wird
    $zahl = 0

    # Im ersten Schritt werden alle Zeichen in Kleinbuchstaben umgewandelt und dann alle Zeichen welche im Benutzernamen nicht zulässig sind entfernt
    # hierfür wird .Replace() verwendet
    $firstname = $user.Vorname.ToLower().Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss")
    $lastname = $user.Nachname.ToLower().Replace("ä", "ae").Replace("ö", "oe").Replace("ü", "ue").Replace("ß", "ss")


    do {
        # Erhöht die Anzahl der Zeichen vom Vornamen
        $firstname_count++

        # Prüft ob die Anzahl der Zeichen vom Vornamen größer ist als die Länge des Vornamens
        # falls ja dann wird probiert eine Zahl zwischen Vorname und Nachname einzufügen
        if ($firstname_count -gt $firstname.length) {
            $zahl++
            $username = $firstname + $zahl + $lastname
        } else {
            # $firstname.Substring(0, X) gibt die Zeichen bis X
            # Wenn X gleich 1 ist gibt es das erste Zeichen zurück
            # Wenn X gleich 2 ist gibt es die ersten zwei Zeichen zurück
            $username = $firstname.Substring(0, $firstname_count) + $lastname
        }
        # $users.Username erstellt wieder einen Array mit allen Benutzernamen
        # mit -contains wird geprüft ob der Name in diesem Array existiert
        # dadurch wird die Schleife solange wiederholt bis ein Benutzername frei ist
    } while ($users.Username -contains $username)

    # Setzt den Benutzernamen beim Objekt
    $user.Username = $username

    # Dieser Teil ist vom Beispiel "Passwort generieren"
    <#
        > (65..90) - ASCII Code für A-Z
        > (97..122) - ASCII Code für a-z
        mit ((65..90) + (97..122)) werden beide Arrays in einen neuen Array kombiniert.

        > Get-Random -Count 5
        Gibt 5 Einträge aus dem Array zurück

        > ForEach-Object {[char]$_}
        Mit [char]65 wird die Zahl in Text umgewandelt
    #>
    $letters = ((65..90) + (97..122) | Get-Random -Count 5 | ForEach-Object {[char]$_})
    $numbers = ((48..57) | Get-Random -Count 2 | ForEach-Object {[char]$_})
    $special = ((33, 35, 36, 37, 38, 64) | Get-Random -Count 1 | ForEach-Object {[char]$_})

    <#
        > Sort-Object {Get-Random}
        Sortiert die Einträge der Arrays zufällig.

        > -join
        Kombiniert alle Einträge von den Arrays in eine Zeichenkette
    #>
    $user.password = -join ($letters + $numbers + $special | Sort-Object {Get-Random});
}

# -Delimiter ";" - um den trenner zwischen den Daten in einer Zeile festzulegen
# -Encoding Default - damit die Datei als Windows 1251 geöffnet wird (Zeichenkodierung)
$users | Export-Csv -Path "users_with_password.csv" -NoTypeInformation -Delimiter ";" -Encoding Default

Aufgabe 4

User im ActiveDirectory erstellen mit OUs für jede Abteilung. Für dieses Beispiel wird die CSV welche beim Aufgabe 3 erstellt wurde weiterverwendet.

"Abteilung";"Nachname";"Vorname";"Username";"Password"
"Einkauf";"Schreiber";"Florian";"fschreiber";"hB75&cfL"
"Einkauf";"Bayer";"Maik";"mbayer";"&w6ZUM5L"
"Einkauf";"Schweitzer";"Michelle";"mschweitzer";"&M7ep9PR"
"Einkauf";"Schweitzer";"Marco";"maschweitzer";"0M3%qpNb"
"Verkauf";"Seiler";"Barbara";"bseiler";"0BXeQ7!k"
"Verkauf";"Amsel";"Anne";"aamsel";"3WXhQ!M2"
"Verkauf";"Moeller";"Stefanie";"smoeller";"qF7P6!ED"
"Verkauf";"Moeller";"Sven";"svmoeller";"W13Cv!Pq"
"Verkauf";"Moeller";"Stefan";"stmoeller";"aN%36vwh"

Lösung

# -Delimiter ";" - um den trenner zwischen den Daten in einer Zeile festzulegen
# -Encoding Default - damit die Datei als Windows 1251 geöffnet wird (Zeichenkodierung)
$allusers = Import-Csv -Delimiter ";" -Encoding Default "users_with_password.csv"

# Ermittelt alle eindeutigen Abteilungen
$abteilungen = $allusers.Abteilung | Get-Unique

foreach ($abteilung in $abteilungen) {
    # Domäne ist TEST.AT und die User sollen in TEST\Users abgelegt werden
    # der Pfad zur richtigen OU wird rückwärts angegeben
    $path = "OU=Users,OU=TEST,DC=test,DC=at"

    $filter = 'Name -eq "' + $abteilung + '"'

    # Versucht das OU Objekt für die Abteilung zu bekommen
    # falls dies fehlschlägt ist in $org kein Wert
    $org = Get-ADOrganizationalUnit -Filter $filter -SearchBase $path

    # Wenn die OU noch nicht vorhanen ist wird diese mit dem Befehl erstellt
    if (-Not $org) {
        New-ADOrganizationalUnit -Name $abteilung -Path $path -ProtectedFromAccidentalDeletion $False
    }

    # Fügt die neue OU zum Pfad hinzu
    $path = "OU=" + $abteilung + "," + $path

    # Ermittelt alle User mit der gegeben Abteilung
    $users = $allusers | Where-Object {$_.Abteilung -eq $abteilung}

    foreach ($user in $users) {
        # Mit ConverTo-SecureString wird das Passwort gehashed, da bei New-AdUser kein klartext Passwort zulässig ist.
        $password = $user.Password | ConvertTo-SecureString -AsPlainText -Force

        # Erstellt den AdUser
        # -Name - Username
        # -AccountPassword - das gehashte Passwort
        # -ChangePasswordAtLogon - das der User beim Login das Passwort ändern muss
        # -GivenName - Vorname
        # -Surname - Nachname
        # -Path - Pfad im AD
        # -Enable - Ob der Account aktiviert werden soll
        New-AdUser -Name $user.Username -AccountPassword $password -ChangePasswordAtLogon $True -GivenName $user.Vorname -Surname $user.Nachname -Path $path -Enabled $True
    }
}