Dans cet article, nous verrons comment créer un formulaire de réinitialisation de mot de passe pour Azure Entra ID avec Microsoft Graph et PowerShell Universal. Nous utiliserons les modules Microsoft.Graph.Authentication et Microsoft.Graph.Users pour nous connecter à Graph en tant qu’utilisateur actuel et réinitialiser le mot de passe d’un autre utilisateur.
Configuration Azure Entra ID
La première étape consiste à configurer un enregistrement d’application Azure Entra ID pour PowerShell Universal. Cela permettra aux utilisateurs de se connecter avec OpenID Connect et leurs identifiants Entra ID. Nous configurerons aussi les permissions d’API pour donner accès à Microsoft Graph.
Dans l’enregistrement d’application, définissez le chemin de rappel vers le serveur PowerShell Universal. HTTPS est obligatoire; le port peut être celui sur lequel PowerShell Universal écoute. Incluez un chemin de rappel de connexion. Vous configurerez la même valeur dans PowerShell Universal.
Ensuite, assurez-vous que les types de jetons suivants sont sélectionnés.
Configurez maintenant les permissions que vous déléguerez à l’application et à l’utilisateur qui se connecte. Ces permissions sont requises pour rechercher des utilisateurs et réinitialiser leurs comptes. La permission Directory.AccessAsUser.All est requise pour définir le mot de passe d’un autre utilisateur. Elle ne peut pas être accordée à une application et doit être fournie par délégation. Les utilisateurs du groupe Global Administrator ont cette permission.
Enfin, générez un nouveau secret client pour l’utiliser dans PowerShell Universal.
Configurer l’authentification dans PowerShell Universal
Maintenant que l’enregistrement d’application est dans Entra ID, configurez PowerShell Universal pour authentifier l’utilisateur et fournir un jeton d’accès à Microsoft Graph. Cliquez sur Security > Authentication et ajoutez OpenID Connect à la liste des méthodes. Dans les propriétés, reliez l’enregistrement d’application à PowerShell Universal.
Vous devrez indiquer les valeurs suivantes. Ce sont des exemples; les vôtres différeront selon votre locataire:
- Callback Path:
https://localhost:5001/signin-oidc. C’est la même URL que dans votre enregistrement d’application. - Client ID:
21a267e2-893d-4e0d-a85e-ff21757f082b. L’ID de l’enregistrement d’application, sur la page Overview. - Client Secret:
xyz123. Le secret client que vous avez généré dans l’enregistrement d’application. - Authority:
https://login.microsoftonline.com/3eca8ff3-f62f-431b-88f5-b40183116004. Le service de connexion Microsoft Entra ID. Le GUID est l’ID de votre locataire. - Resource:
https://graph.microsoft.com. La ressource à laquelle le jeton d’accès doit donner accès. - Save Tokens:
true. PowerShell Universal doit enregistrer le jeton d’accès pour que l’appli puisse l’utiliser. - Response Type:
id_token token. Entra ID doit renvoyer des jetons pour que vous puissiez déléguer l’accès plus tard. - Scope:
openid profile groups offline_access. Les jetons d’accès doivent inclure l’appartenance aux groupes et les infos de profil.
Une fois la configuration terminée, vous pourrez vous connecter à PowerShell Universal avec OpenID Connect. Pour valider, déconnectez-vous de votre compte et cliquez sur le bouton de connexion OpenID Connect.
Installer les modules Microsoft Graph
Vous devrez installer les modules Graph suivants pour utiliser cet exemple. Les versions utilisées ici sont indiquées ci-dessous.
Microsoft.Graph.Authentication2.26.1Microsoft.Graph.Users2.26.1
Vous pouvez le faire en allant à Platform > Modules > Galleries dans la console d’administration. Nous avons utilisé la version suivante de PowerShell Universal pour cette démo.
- PowerShell Universal 5.5.0
Appli de réinitialisation de mot de passe
Maintenant que l’authentification est configurée, nous pouvons créer l’appli de réinitialisation de mot de passe. D’abord, stockez quelques variables pour accéder à Microsoft Graph via l’enregistrement d’application. Allez à Platform > Variables et créez les variables suivantes.
- PSUMgTenantId:
3eca8ff3-f62f-431b-88f5-b40183116004. Le même ID de locataire que dans la configuration OIDC. - PSUMgClientSecret: un identifiant PS Credential dont le nom d’utilisateur est l’ID de l’enregistrement d’application (
21a267e2-893d-4e0d-a85e-ff21757f082b) et dont le mot de passe est le secret client.
Une fois ces variables créées, allez à Apps > Apps et créez une nouvelle appli. Cliquez sur Edit Code pour définir le contenu de l’appli.
# 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’appli se connecte à Graph en tant qu’application au démarrage, avec Connect-MgGraph et la portée de contexte de processus pour ne pas affecter les autres applis. Le formulaire recherche des utilisateurs avec Get-MgUser, valide que les mots de passe correspondent, puis met en cache le jeton d’accès de l’utilisateur connecté et le nouveau mot de passe. Le cache évite de stocker le jeton d’accès en texte clair dans l’historique des tâches et utilise le cache temporaire pour que les valeurs ne survivent pas aux redémarrages.
Le formulaire appelle ensuite MgResetPassword.ps1 avec Invoke-PSUScript. Un script isole la connexion Microsoft Graph pour qu’elle soit liée uniquement à cet utilisateur (plusieurs personnes peuvent utiliser l’appli en même temps) et fournit un historique automatique des tâches indiquant quel opérateur a réinitialisé quel compte.
L’appli résultante ressemble à ceci.
Script de réinitialisation
Maintenant que l’interface utilisateur est définie, configurez le script de réinitialisation qui exécute l’opération. Cliquez sur Automation > Scripts et créez un nouveau script. Nommez le script MgResetPassword.ps1. Cliquez sur l’onglet Execution et définissez l’environnement à PowerShell 7. Une fois créé, cliquez sur Edit Code et entrez ce qui suit.
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
}
Le script lit le mot de passe et le jeton d’accès de l’opérateur actuel dans le cache, se connecte à Graph avec ce jeton, recherche l’utilisateur cible, puis appelle Update-MgUser avec un profil de mot de passe. Il retire ensuite le mot de passe du cache.
Une fois le script créé, essayez l’appli. Vous devrez vous connecter comme un utilisateur qui a les permissions Entra ID nécessaires pour ces opérations. Après avoir cliqué sur soumettre dans le formulaire, vous verrez une notification de succès et une nouvelle tâche dans l’historique.
Prêt à construire? Téléchargez PowerShell Universal.

Adam Driscoll