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 : 39
Users Yesterday : 44
Users Last 7 days : 233
Users Last 30 days : 1002
Users This Month : 842
Users This Year : 15668
Total Users : 93472
Views Today : 50
Views Yesterday : 53
Views Last 7 days : 288
Views Last 30 days : 1274
Views This Month : 1050
Views This Year : 21255
Total views : 131190
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);