I dette indlæg gennemgår vi, hvordan du opretter en formular til nulstilling af adgangskode til Azure Entra ID med Microsoft Graph og PowerShell Universal. Vi bruger modulerne Microsoft.Graph.Authentication og Microsoft.Graph.Users til at oprette forbindelse til Graph som den aktuelle bruger og nulstille en anden brugers adgangskode.
Konfiguration af Azure Entra ID
Første trin er at oprette en appregistrering i Azure Entra ID til PowerShell Universal. Det lader brugerne logge ind med OpenID Connect og deres Entra ID-legitimationsoplysninger. Vi konfigurerer også API-tilladelserne, så der er adgang til Microsoft Graph.
I appregistreringen skal du sætte callback-stien til at pege på PowerShell Universal-serveren. HTTPS er påkrævet. Porten kan være den, PowerShell Universal lytter på. Medtag en callback-sti til logon. Du konfigurerer den samme værdi i PowerShell Universal.
Sørg derefter for, at følgende tokentyper er valgt.
Opsæt nu de tilladelser, du delegerer til applikationen og til den bruger, der logger ind. Tilladelserne er nødvendige for at slå brugere op og nulstille deres konti. Tilladelsen Directory.AccessAsUser.All er nødvendig for at sætte en anden brugers adgangskode. Den kan ikke tildeles en applikation og skal gives via delegering. Brugere i gruppen Global Administrator har denne tilladelse.
Generer til sidst en ny klienthemmelighed til brug i PowerShell Universal.
Konfigurer godkendelse i PowerShell Universal
Nu hvor appregistreringen findes i Entra ID, skal du konfigurere PowerShell Universal til at godkende som brugeren og levere et access-token til Microsoft Graph. Klik på Security > Authentication, og tilføj OpenID Connect til listen over metoder. I egenskaberne forbinder du appregistreringen med PowerShell Universal.
Du skal angive følgende værdier. Det er eksempelværdier. Dine er anderledes og afhænger af din tenant:
- Callback Path:
https://localhost:5001/signin-oidc. Det er den samme URL, du angav i appregistreringen. - Client ID:
21a267e2-893d-4e0d-a85e-ff21757f082b. Id’et for appregistreringen på siden Overview. - Client Secret:
xyz123. Den klienthemmelighed, du genererede i appregistreringen. - Authority:
https://login.microsoftonline.com/3eca8ff3-f62f-431b-88f5-b40183116004. Logontjenesten i Microsoft Entra ID. GUID’et er dit tenant-id. - Resource:
https://graph.microsoft.com. Den ressource, access-tokenet skal give adgang til. - Save Tokens:
true. PowerShell Universal skal gemme access-tokenet, så appen kan bruge det. - Response Type:
id_token token. Entra ID skal returnere tokens, så du kan delegere adgang senere. - Scope:
openid profile groups offline_access. Access-tokens skal indeholde gruppemedlemskab og profiloplysninger.
Når du har gennemført konfigurationen, kan du logge ind på PowerShell Universal med OpenID Connect. For at kontrollere det skal du logge ud af din konto og klikke på knappen til logon med OpenID Connect.
Installer Microsoft Graph-moduler
Du skal installere følgende Graph-moduler for at bruge eksemplet. De versioner, der er brugt her, står nedenfor.
Microsoft.Graph.Authentication2.26.1Microsoft.Graph.Users2.26.1
Det gør du ved at gå til Platform > Modules > Galleries i administratorkonsollen. Vi brugte følgende version af PowerShell Universal til denne demo.
- PowerShell Universal 5.5.0
App til nulstilling af adgangskode
Nu hvor godkendelsen er konfigureret, kan vi oprette appen til nulstilling af adgangskode. Gem først nogle variabler til at tilgå Microsoft Graph via appregistreringen. Gå til Platform > Variables, og opret følgende variabler.
- PSUMgTenantId:
3eca8ff3-f62f-431b-88f5-b40183116004. Det samme tenant-id som i OIDC-konfigurationen. - PSUMgClientSecret: en PS Credential, hvis brugernavn er appregistreringens id (
21a267e2-893d-4e0d-a85e-ff21757f082b), og hvis adgangskode er klienthemmeligheden.
Når variablerne er oprettet, skal du gå til Apps > Apps og oprette en ny app. Klik på Edit Code for at definere appens indhold.
# 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
}
}
Appen opretter forbindelse til Graph som applikationen, når den starter, ved hjælp af Connect-MgGraph og processens kontekstscope, så andre apps ikke påvirkes. Formularen søger efter brugere med Get-MgUser, kontrollerer, at adgangskoderne stemmer overens, og cacher derefter den indloggede brugers access-token og den nye adgangskode. Caching undgår, at access-tokenet gemmes som ren tekst i jobhistorikken, og bruger den midlertidige cache, så værdierne ikke overlever genstarter.
Formularen kalder derefter MgResetPassword.ps1 med Invoke-PSUScript. Et script isolerer Microsoft Graph-forbindelsen, så den kun er knyttet til denne bruger (flere personer kan bruge appen samtidig), og giver dig automatisk jobhistorik over, hvilken operatør der nulstillede hvilken konto.
Den færdige app ser sådan ud.
Nulstillingsscript
Nu hvor brugerfladen er defineret, skal du opsætte nulstillingsscriptet, der udfører selve handlingen. Klik på Automation > Scripts, og opret et nyt script. Navngiv scriptet MgResetPassword.ps1. Klik på fanen Execution, og sæt Environment til PowerShell 7. Når det er oprettet, skal du klikke på Edit Code og indtaste følgende.
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
}
Scriptet læser adgangskoden og den aktuelle operatørs access-token fra cachen, opretter forbindelse til Graph med det token, slår målbrugeren op og kalder derefter Update-MgUser med en adgangskodeprofil. Derefter fjerner det adgangskoden fra cachen.
Når scriptet er oprettet, kan du prøve appen. Du skal logge ind som en bruger med de rette Entra ID-tilladelser til at udføre handlingerne. Når du klikker på send i formularen, ser du en succesmeddelelse og et nyt job i jobhistorikken.
Klar til at bygge? Download PowerShell Universal.

Adam Driscoll