Gruppenmitgliedschaft im Active Directory temporär zuweisen mit PowerShell-GUI

    Temporäre Mitgliedschaft in AD-Gruppen mit PowerShell-GUI verwaltenSeit Server 2016 ist es mög­lich, Be­nutzer tem­porär in AD-Gruppen aufzu­nehmen und so ihre Berech­tigungen zeit­lich zu be­schränken. Die Bord­mittel sehen dafür nur Power­Shell vor. Mein hier beschrie­benes Script bietet aber eine GUI, so dass auch tech­nisch nicht versierte User diese Aufgabe über­nehmen können.

    Temporäre Gruppen­mitglied­schaften setzen einen Forest Functional Level von Server 2016 und die Aktivierung des PAM-Features voraus. Die Grundzüge dieser Technologie sowie die einzelnen Schritte zu ihrer Nutzung hat mein Kollege Marcel Küppers bereits in diesem Beitrag beschrieben.

    Gängige Anwendungsfälle

    Der Bedarf an zeitlich begrenzten Berech­tigungen ist zum Beispiel gegeben, wenn externe Consultants an einem Projekt arbeiten oder wenn Auszu­bildende regelmäßig die Abteilung wechseln.

    Bei Azubis kommt es sonst oft vor, dass sie die Rechte aus der alten Abteilung behalten und jene für die neue zusätzlich bekommen. Am Ende ihrer Ausbildungs­zeit haben sie dann mehr Berech­tigungen im System als jeder andere Mitarbeiter.

    Kein GUI-Tool unter den Bordmitteln

    Server 2016 bringt eine eigene Lösung für die zeitliche Beschränkung von Berechtigungen mit. Das Problem daran ist aber leider, dass diese Funktion nur über PowerShell zu steuern ist und viele Kollegen immer noch Berührungs­ängste damit haben.

    Die Vergabe von zeitlich begrenzen Gruppen­mitglied­schaften eignet sich für die Delegierung an die Personal- oder eine andere Fachabteilung, weil die Mitarbeiter dort in der Regel besser wissen, wie lange ein externer Berater oder ein Azubi in einem Projekt bzw. in einer Abteilung tätig ist. Bei solchen nicht-technischen Anwendern wird es mit der reinen PowerShell noch schwieriger.

    Meistens wird dann eine Software von einem Drittanbieter gekauft, welche diese Aufgabe über eine grafische Oberfläche vereinfacht. Mit ein bisschen Aufwand lässt sich aber in PowerShell dieses Ziel ebenfalls erreichen.

    Eigene GUI mit PowerShell 

    Ich habe mir hierzu ein paar Gedanken gemacht, heraus­gekommen ist eine kleine GUI, welche jeder berechtigte Benutzer leicht bedienen kann. Wie man mit PowerShell grundsätzlich eine grafische Oberfläche entwickelt, habe ich bereits in diesem Beitrag beschrieben.

    PowerShell-GUI zum Eintragen einer temporären Mitgliedschaft in AD-Gruppen.

    Bevor das Script dem Benutzer eine die Auswahl von Konten oder eines Datums erlaubt, überprüft es, ob das Feature Privileged Access Management (PAM) überhaupt aktiviert wurde:

    If((Get-ADOptionalFeature -Identity 'Privileged Access Management Feature').EnabledScopes.Count -eq 0){
    # Fehlermeldung und Ende
    }

    Sollte dies nicht der Fall sein, dann bricht die Ausführung mit dem entsprechenden Hinweis ab.

    Ist diese Bedingung jedoch erfüllt, dann kann der Benutzer auszuwählen, welcher User in welche Gruppe aufge­nommen werden soll. Im Kalender legt er dann fest, wie lange die Gruppen­mitglied­schaft erhalten bleibt.

    Auswahl des Datums, zu dem die temporäre Mitgliedschaft ablaufen soll.

    Normalerweise muss man den Zeitraum für die Mitgliedschaft ("Time to live") in Tagen, Stunden oder Minuten angeben. Mein Script berechnet diesen Wert auf Basis des gewählten Datums im Hintergrund selbst.

    Nach dem Klicken auf OK prüft das Script, ob der Benutzer bereits Mitglied in der ausgewählten Gruppe ist. Trifft dies zu, dann gibt es eine entsprechende Rückmeldung:

    Das Script bricht ab, wenn das Konto schon Mitglied in der vorgesehenen AD-Gruppe ist.

    Ist das nicht der Fall und sollte ansonsten alles in Ordnung sein, dann sieht der Benutzer folgende Bestätigung für seine Aktion.

    Bestätigung, das der Benutzer erfolgreich in die AD-Gruppe aufgenommen wurde. 

    Das Script ist insgesamt ein ganz einfaches Tool, welches man verschieden Benutzer oder IT-Kollegen an die Hand geben kann, um temporäre Berechtigungen zu setzen.

    5 Kommentare

    Bild von Dominik P
    Dominik P sagt:
    6. Juli 2018 - 10:48

    Hallo Roland,
    danke für den Einblick und das Tool.

    Das wird es vielen erleichtern die wichtige Hürde zu nehmen und die Anfangsängste bei dem Thema abzulegen.

    Leider hat sich in Deinem Skript ein Fehler eingeschlichen.

    Hier die Fehlermeldung:

    New-TimeSpan : Cannot bind parameter 'Minutes' to the target. Exception setting "Minutes": "Cannot convert null to type "System.Int32"."
    At C:\Skripte\JiT-GUI.ps1:128 char:134
    + ... m -MemberTimeToLive (New-TimeSpan -Minutes (($Tag1 - $Tag2).Minutes))
    + ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : WriteError: (:) [New-TimeSpan], ParameterBindingException
    + FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerShell.Commands.NewTimeSpanCommand

    Der Benutzer ist auch nicht in der Gruppe.

    Viele Grüße
    Dominik

    Bild von Roland
    Roland sagt:
    6. Juli 2018 - 11:41

    Hallo Dominik,
    danke für deinen Post, da hast du natürlich recht, da habe ich statt der Totalminuten nur die Minuten ausgelesen und falsch platziert.

    Anbei damit sollte es gehen. Der Code wird hier natürlich auch noch angepasst.

    # Message setzen und Gruppe dem Benutzer hinzufügen bzw. abprüfen

    $mgm1 = "Der ausgewählte Benutzer",$objCombobox.SelectedItem,"ist bereits in der ausgewählten Gruppe",$objCombobox1.SelectedItem, "enthalten!"
    $mgm2 = "Benutzer wurde in die Gruppe",$objCombobox1.SelectedItem,"hinzugefügt! Gültigkeit bis",$calendar.SelectionStart

    if (Get-ADGroupMember $objCombobox1.SelectedItem | Where-Object {$_.SamAccountName -eq $objCombobox.SelectedItem})
    {
    $Result = [System.Windows.Forms.MessageBox]::Show($mgm1,"Frage an den Benutzer",0)
    }
    else
    {
    $Tag1 = $calendar.SelectionStart
    $Tag2 = Get-Date
    $Tag = ($Tag1 - $Tag2).TotalMinutes

    Add-ADGroupMember -Identity $objCombobox1.SelectedItem -Members $objCombobox.SelectedItem -MemberTimeToLive (New-TimeSpan -Minutes $Tag)
    $Result = [System.Windows.Forms.MessageBox]::Show($mgm2,"Frage an den Benutzer",0)

    }

    })

    Grüße
    Roland

    Bild von Dominik P
    Dominik P sagt:
    6. Juli 2018 - 13:34

    Hallo Roland,

    jetzt passt es, danke Dir!

    Viele Grüße
    Dominik

    Bild von Marcel Küppers
    6. Juli 2018 - 15:24

    Klasse Idee!

    Bild von Marc R.
    Marc R. sagt:
    6. Juli 2018 - 18:41

    Was für eine coole Idee, genau auf sowas habe ich gewartet.
    Frage, könntest du das Skript noch etwas erweitern? z.B. Auslesen eines Users wie lange die Gruppe noch bei ihm gültig ist (Restzeit) und ggf. das man auch eine Verlängerung der Gruppenmitgliedschaft setzen kann bevor diese ausläuft?
    Das wäre obercool.