MAIN MENU
Devolutions Blog

Ankündigungen, Aktualisierungen und Einsichten von Devolutions

Devolutions PowerShell Universal Azure Entra ID password reset illustration for the blog.

Ein Azure Entra ID-Formular zum Zurücksetzen des Passworts mit Microsoft Graph und PowerShell Universal erstellen

Registrieren Sie eine Entra ID-App, speichern Sie OIDC-Token in PowerShell Universal 5.5, suchen Sie Benutzer mit Get-MgUser und setzen Sie ein Passwort mit Update-MgUser aus MgResetPassword.ps1 zurück.

In diesem Beitrag zeigen wir, wie Sie ein Formular zum Zurücksetzen des Passworts für Azure Entra ID mit Microsoft Graph und PowerShell Universal erstellen. Wir verwenden die Module Microsoft.Graph.Authentication und Microsoft.Graph.Users, um uns als aktueller Benutzer mit Graph zu verbinden und das Passwort eines anderen Benutzers zurückzusetzen.

Azure Entra ID-Konfiguration

Der erste Schritt besteht darin, eine Azure Entra ID-App-Registrierung für PowerShell Universal einzurichten. Damit können sich Benutzer mit OpenID Connect und ihren Entra ID-Anmeldeinformationen anmelden. Wir konfigurieren außerdem die API-Berechtigungen, um Zugriff auf Microsoft Graph zu gewähren.

In der App-Registrierung setzen Sie den Rückrufpfad auf den PowerShell Universal-Server. HTTPS ist erforderlich; der Port kann der sein, auf dem PowerShell Universal lauscht. Fügen Sie einen Anmelde-Rückrufpfad hinzu. Denselben Wert konfigurieren Sie in PowerShell Universal.

Entra ID app registration redirect URI pointing at the PowerShell Universal sign-in callback.
Rückruf-URL der App-Registrierung für PowerShell Universal

Stellen Sie als Nächstes sicher, dass die folgenden Tokentypen ausgewählt sind.

Entra ID token configuration with ID tokens and access tokens enabled.
ID- und Zugriffstoken-Typen in der App-Registrierung

Richten Sie nun die Berechtigungen ein, die Sie der Anwendung und dem angemeldeten Benutzer delegieren. Diese Berechtigungen sind erforderlich, um Benutzer zu suchen und deren Konten zurückzusetzen. Die Berechtigung Directory.AccessAsUser.All ist erforderlich, um das Passwort eines anderen Benutzers festzulegen. Sie kann keiner Anwendung gewährt werden und muss per Delegation bereitgestellt werden. Benutzer in der Gruppe Global Administrator haben diese Berechtigung.

Entra ID API permissions including Directory.AccessAsUser.All for delegated password reset.
Delegierte Graph-Berechtigungen für Benutzersuche und Passwortzurücksetzen

Erzeugen Sie abschließend ein neues Client Secret für die Verwendung in PowerShell Universal.

Entra ID certificates and secrets page showing a newly created client secret.
Client Secret der PowerShell Universal-App-Registrierung

Authentifizierung in PowerShell Universal konfigurieren

Nachdem die App-Registrierung in Entra ID vorliegt, konfigurieren Sie PowerShell Universal so, dass sich der Benutzer authentifiziert und ein Zugriffstoken für Microsoft Graph bereitstellt. Klicken Sie auf Security > Authentication und fügen Sie OpenID Connect zur Methodenliste hinzu. Verbinden Sie in den Eigenschaften die App-Registrierung mit PowerShell Universal.

Sie müssen die folgenden Werte angeben. Das sind Beispielwerte; Ihre Werte unterscheiden sich je nach Mandant:

  • Callback Path: https://localhost:5001/signin-oidc. Dies ist dieselbe URL wie in Ihrer App-Registrierung.
  • Client ID: 21a267e2-893d-4e0d-a85e-ff21757f082b. Die ID der App-Registrierung auf der Seite Overview.
  • Client Secret: xyz123. Das Client Secret, das Sie in der App-Registrierung erzeugt haben.
  • Authority: https://login.microsoftonline.com/3eca8ff3-f62f-431b-88f5-b40183116004. Der Microsoft Entra ID-Anmeldedienst. Die GUID ist Ihre Mandanten-ID.
  • Resource: https://graph.microsoft.com. Die Ressource, auf die das Zugriffstoken Zugriff geben soll.
  • Save Tokens: true. PowerShell Universal soll das Zugriffstoken speichern, damit die App es nutzen kann.
  • Response Type: id_token token. Entra ID soll Token zurückgeben, damit Sie den Zugriff später delegieren können.
  • Scope: openid profile groups offline_access. Die Zugriffstoken sollen Gruppenmitgliedschaft und Profilinformationen enthalten.

Nach Abschluss der Konfiguration können Sie sich mit OpenID Connect bei PowerShell Universal anmelden. Zum Prüfen melden Sie sich ab und klicken Sie auf die Schaltfläche für die OpenID Connect-Anmeldung.

Microsoft Graph-Module installieren

Sie müssen die folgenden Graph-Module installieren, um dieses Beispiel zu verwenden. Die hier verwendeten Versionen sind unten angegeben.

  • Microsoft.Graph.Authentication 2.26.1
  • Microsoft.Graph.Users 2.26.1

Dazu navigieren Sie in der Admin-Konsole zu Platform > Modules > Galleries. Für diese Demo haben wir die folgende PowerShell Universal-Version verwendet.

  • PowerShell Universal 5.5.0

App zum Zurücksetzen des Passworts

Nachdem die Authentifizierung konfiguriert ist, können wir die App zum Zurücksetzen des Passworts erstellen. Speichern Sie zuerst einige Variablen, um über die App-Registrierung auf Microsoft Graph zuzugreifen. Navigieren Sie zu Platform > Variables und erstellen Sie die folgenden Variablen.

  • PSUMgTenantId: 3eca8ff3-f62f-431b-88f5-b40183116004. Dieselbe Mandanten-ID wie in der OIDC-Konfiguration.
  • PSUMgClientSecret: eine PS Credential, deren Benutzername die App-Registrierungs-ID ist (21a267e2-893d-4e0d-a85e-ff21757f082b) und deren Passwort das Client Secret ist.

Nachdem diese Variablen erstellt sind, navigieren Sie zu Apps > Apps und erstellen Sie eine neue App. Klicken Sie auf Edit Code, um den Inhalt der App festzulegen.

# Connect as the application. Use the process context scope to avoid affecting other apps.
# We are passing in the tenant ID and client secret.
# We are connecting when the app is starting to avoid connecting every time the page is loaded.
Connect-MgGraph -TenantId $PSUMgTenantId -ClientSecretCredential $Secret:PSUMgClientSecret -ContextScope Process -NoWelcome

New-UDApp -Content {

    New-UDForm -Children {
        New-UDAutocomplete -OnLoadOptions {
            Get-MgUser -ConsistencyLevel eventual -Count userCount -Search "`"DisplayName:$Body`"" | ForEach-Object {
                New-UDAutocompleteOption -Name $_.DisplayName -Value $_.Id
            }
        } -Label "User" -Id 'UserId'
        New-UDTextbox -Label 'Password' -Type password -Id 'Password'
        New-UDTextbox -Label 'Confirm Password' -Type password -Id 'ConfirmPassword'
    } -OnValidate {
        if ([string]::IsNullOrEmpty($EventData.UserId)) {
            New-UDValidationResult -ValidationError "User is required"
            return
        }

        if ([string]::IsNullOrEmpty($EventData.Password) -or [string]::IsNullOrEmpty($EventData.ConfirmPassword)) {
            New-UDValidationResult -ValidationError "Password is required"
            return
        }

        if ($EventData.Password -cne $EventData.ConfirmPassword) {
            New-UDValidationResult -ValidationError "Passwords do not match"
            return
        }

        $MgUser = Get-MgUser -UserId $EventData.UserId
        if ($MgUser -eq $null) {
            New-UDValidationResult -ValidationError "Unable to locate user."
            return
        }

        New-UDValidationResult -Valid
    } -OnSubmit {

        if ($AccessToken -eq $null) {
            throw "Access Token is required. Ensure you have Save Tokens enabled in your OpenID Connect authentication method."
        }

        Set-PSUCache -Key "MgAccessToken_$User" -Value $AccessToken

        $PasswordKey = (New-Guid).ToString()
        Set-PSUCache -Key $PasswordKey -Value $EventData.Password -AbsoluteExpiration (Get-Date).AddMinutes(5)

        Invoke-PSUScript -Name 'MgResetPassword.ps1' -Parameters @{
            ResetUser = $EventData.UserId
            PasswordKey = $PasswordKey
        } -Wait -Integrated | Out-Null

        Show-UDSnackbar -Message "Password reset!" -Variant success
    }
}

Die App verbindet sich beim Start als Anwendung mit Graph, über Connect-MgGraph und den Prozess-Kontextbereich, damit andere Apps nicht beeinflusst werden. Das Formular sucht Benutzer mit Get-MgUser, prüft, ob die Passwörter übereinstimmen, und speichert anschließend das Zugriffstoken des angemeldeten Benutzers und das neue Passwort im Cache. Der Cache vermeidet, das Zugriffstoken als Klartext in der Jobhistorie zu speichern, und nutzt den temporären Cache, damit die Werte Neustarts nicht überdauern.

Das Formular ruft anschließend MgResetPassword.ps1 mit Invoke-PSUScript auf. Ein Skript isoliert die Microsoft Graph-Verbindung, sodass sie nur an diesen Benutzer gebunden ist (mehrere Personen können die App gleichzeitig nutzen) und liefert automatisch eine Jobhistorie, welcher Operator welches Konto zurückgesetzt hat.

Die resultierende App sieht so aus.

PowerShell Universal app form with user autocomplete and password reset fields.
Entra ID-Formular zum Zurücksetzen des Passworts in einer Universal-App

Reset-Skript

Nachdem die Benutzeroberfläche definiert ist, richten Sie das Reset-Skript ein, das die eigentliche Operation ausführt. Klicken Sie auf Automation > Scripts und erstellen Sie ein neues Skript. Benennen Sie das Skript MgResetPassword.ps1. Klicken Sie auf die Registerkarte Execution und setzen Sie die Umgebung auf PowerShell 7. Klicken Sie anschließend auf Edit Code und geben Sie Folgendes ein.

param($ResetUser, $PasswordKey)

try {
    $Password = Get-PSUCache -Key $PasswordKey
    if (-not $Password) {
        throw "Target password not found."
    }

    $AccessToken = Get-PSUCache -Key "MgAccessToken_$($UAJob.Identity.Name)"
    if (-not $AccessToken) {
        throw "Access token not found for $($UAJob.Identity.Name)"
    }

    Connect-MgGraph -AccessToken ($AccessToken | ConvertTo-SecureString -AsPlainText -Force) -NoWelcome

    $User = Get-MgUser -UserId $ResetUser

    if ($User -eq $null) {
        throw "Failed to look up user: $ResetUser"
    }

    $password = @{
        Password = $Password
        ForceChangePasswordNextSignIn = $false
    }
    Update-MgUser -UserId $User.Id -PasswordProfile $password
} finally {
    Remove-PSUCache -Key $PasswordKey
}

Das Skript liest das Passwort und das Zugriffstoken des aktuellen Operators aus dem Cache, verbindet sich mit diesem Token mit Graph, sucht den Zielbenutzer und ruft Update-MgUser mit einem Passwortprofil auf. Anschließend entfernt es das Passwort aus dem Cache.

Nachdem das Skript erstellt ist, testen Sie die App. Sie müssen sich als Benutzer mit den erforderlichen Entra ID-Berechtigungen anmelden. Nach dem Absenden des Formulars sehen Sie eine Erfolgsmeldung und einen neuen Job in der Historie.

PowerShell Universal success snackbar and job history after an Entra ID password reset.
Erfolgreiches Passwortzurücksetzen und Jobhistorie

Bereit zum Bauen? PowerShell Universal herunterladen.