In questo articolo vedremo come creare un modulo di reimpostazione password per Azure Entra ID con Microsoft Graph e PowerShell Universal. Useremo i moduli Microsoft.Graph.Authentication e Microsoft.Graph.Users per connetterci a Graph come utente corrente e reimpostare la password di un altro utente.
Configurazione di Azure Entra ID
Il primo passo è configurare una registrazione app Azure Entra ID per PowerShell Universal. In questo modo gli utenti potranno accedere con OpenID Connect e le credenziali Entra ID. Configureremo anche i permessi API per dare accesso a Microsoft Graph.
Nella registrazione app, imposti il percorso di callback verso il server PowerShell Universal. HTTPS è obbligatorio; la porta può essere quella su cui è in ascolto PowerShell Universal. Includa un percorso di callback di accesso. Configurerà lo stesso valore in PowerShell Universal.
Poi si assicuri che siano selezionati i seguenti tipi di token.
Configuri ora i permessi da delegare all’applicazione e all’utente che accede. Questi permessi sono necessari per cercare gli utenti e reimpostare i loro account. Il permesso Directory.AccessAsUser.All è necessario per impostare la password di un altro utente. Non può essere concesso a un’applicazione e deve essere fornito per delega. Gli utenti del gruppo Global Administrator hanno questo permesso.
Infine, generi un nuovo client secret da usare in PowerShell Universal.
Configurare l’autenticazione in PowerShell Universal
Ora che la registrazione app è in Entra ID, configuri PowerShell Universal per autenticare l’utente e fornire un token di accesso a Microsoft Graph. Faccia clic su Security > Authentication e aggiunga OpenID Connect all’elenco dei metodi. Nelle proprietà, colleghi la registrazione app a PowerShell Universal.
Dovrà specificare i seguenti valori. Sono esempi; i suoi differiranno in base al tenant:
- Callback Path:
https://localhost:5001/signin-oidc. È lo stesso URL della registrazione app. - Client ID:
21a267e2-893d-4e0d-a85e-ff21757f082b. L’ID della registrazione app, nella pagina Overview. - Client Secret:
xyz123. Il client secret generato nella registrazione app. - Authority:
https://login.microsoftonline.com/3eca8ff3-f62f-431b-88f5-b40183116004. Il servizio di accesso Microsoft Entra ID. Il GUID è l’ID del tenant. - Resource:
https://graph.microsoft.com. La risorsa a cui il token di accesso deve dare accesso. - Save Tokens:
true. PowerShell Universal deve salvare il token di accesso così l’app può usarlo. - Response Type:
id_token token. Entra ID deve restituire token per poter delegare l’accesso in seguito. - Scope:
openid profile groups offline_access. I token di accesso devono includere l’appartenenza ai gruppi e le informazioni di profilo.
Al termine della configurazione, potrà accedere a PowerShell Universal con OpenID Connect. Per convalidare, si disconnetta dal proprio account e faccia clic sul pulsante di accesso OpenID Connect.
Installare i moduli Microsoft Graph
Dovrà installare i seguenti moduli Graph per usare questo esempio. Le versioni usate qui sono indicate di seguito.
Microsoft.Graph.Authentication2.26.1Microsoft.Graph.Users2.26.1
Può farlo andando su Platform > Modules > Galleries nella console di amministrazione. Per questa demo abbiamo usato la seguente versione di PowerShell Universal.
- PowerShell Universal 5.5.0
App di reimpostazione password
Ora che l’autenticazione è configurata, possiamo creare l’app di reimpostazione password. Prima, memorizzi alcune variabili per accedere a Microsoft Graph tramite la registrazione app. Vada su Platform > Variables e crei le seguenti variabili.
- PSUMgTenantId:
3eca8ff3-f62f-431b-88f5-b40183116004. Lo stesso ID tenant della configurazione OIDC. - PSUMgClientSecret: una credenziale PS Credential il cui nome utente è l’ID della registrazione app (
21a267e2-893d-4e0d-a85e-ff21757f082b) e la cui password è il client secret.
Dopo aver creato queste variabili, vada su Apps > Apps e crei una nuova app. Faccia clic su Edit Code per definire il contenuto dell’app.
# 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
}
}
L’app si connette a Graph come applicazione all’avvio, con Connect-MgGraph e l’ambito di contesto di processo per non influire sulle altre app. Il modulo cerca gli utenti con Get-MgUser, verifica che le password coincidano, poi mette in cache il token di accesso dell’utente connesso e la nuova password. La cache evita di memorizzare il token di accesso in testo chiaro nella cronologia dei job e usa la cache temporanea così i valori non persistono ai riavvii.
Il modulo chiama poi MgResetPassword.ps1 con Invoke-PSUScript. Uno script isola la connessione Microsoft Graph in modo che sia legata solo a questo utente (più persone possono usare l’app contemporaneamente) e fornisce una cronologia automatica dei job su quale operatore ha reimpostato quale account.
L’app risultante appare così.
Script di reimpostazione
Ora che l’interfaccia utente è definita, configuri lo script di reimpostazione che esegue l’operazione. Faccia clic su Automation > Scripts e crei un nuovo script. Nomini lo script MgResetPassword.ps1. Faccia clic sulla scheda Execution e imposti l’ambiente su PowerShell 7. Una volta creato, faccia clic su Edit Code e inserisca quanto segue.
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
}
Lo script legge la password e il token di accesso dell’operatore corrente dalla cache, si connette a Graph con quel token, cerca l’utente di destinazione e chiama Update-MgUser con un profilo password. Poi rimuove la password dalla cache.
Con lo script creato, provi l’app. Dovrà accedere come utente con i permessi Entra ID necessari per queste operazioni. Dopo aver inviato il modulo, vedrà una notifica di successo e un nuovo job nella cronologia.
Pronto a iniziare a creare? Scarichi PowerShell Universal.

Adam Driscoll