Office365のアカウントパスワードを忘れる社員が多いので、なんとか自動化したいなと思い、以下のようなフローでパスワードリセットを行なう仕組みを考えた。

Microsoft Graphを使用してユーザーのパスワードを強制的に再設定するには、下記のように、PasswordProfileを使用する必要がある。Microsoft Graph APIの.ChangePassword()メソッドを使用するには、旧パスワードが必須なため旧パスワードが分からないと、変更できないので・・・
using Microsoft.Graph;
using Azure.Identity;
・・・
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var cred = new UsernamePasswordCredential(AdminUsername,AdminPassword,TenantId,ServiceId,options);
// scopeにはUser.ReadWrite.All,Directory.ReadWrite.Allが必要
var graphClient = new GraphServiceClient(cred,scopes);
// テンポラリパスワードの生成
string newPassword = GeneratePassword();
// パスワードの変更
try {
User user = new User();
user.PasswordProfile = new PasswordProfile() {
ForceChangePasswordNextSignIn = true, // 次のログイン時にパスワード強制変更
ForceChangePasswordNextSignInWithMfa = false,
Password = newPassword // テンポラリパスワード
};
// パスワード情報の更新
await graphClient.Users[targetaccount]
.Request()
.UpdateAsync(user);
} catch (Exception e) {
Message = $"パスワードリセットに失敗しました。<br/>{e.Message}";
return;
}ちなみに、HTTPメソッドはUpdateAsync()=PATCHを使用する。
備忘録として。





Users Today : 53
Users Yesterday : 65
Users Last 7 days : 340
Users Last 30 days : 1390
Users This Month : 1341
Users This Year : 1341
Total Users : 95856
Views Today : 59
Views Yesterday : 76
Views Last 7 days : 418
Views Last 30 days : 1596
Views This Month : 1544
Views This Year : 1544
Total views : 133990
Who's Online : 0
Microsoft Graph APIの仕様がかなり変更されたようで、nugetで取得できる最新版(5.17.0)では、以下のような形になります。
var request = new User() {
PasswordProfile = new PasswordProfile() {
Password = NewPassword,
ForceChangePasswordNextSignIn = false,
ForceChangePasswordNextSignInWithMfa = false
}
};
await graphClient.Users[TargetUser].PatchAsync(request);