使用 Active Directory 图形 API 的用户电子邮件地址操作

本文关键字:用户 电子邮件地址 操作 API Active Directory 图形 使用 | 更新日期: 2023-09-27 18:35:55

我目前正在C#云服务应用程序中使用Microsoft.Azure.ActiveDirectory.GraphClient,该应用程序根据存储在数据库中的信息管理Office 365中的用户预配和用户更新。

我面临的问题是用户邮件地址的设置。在预配新用户时,设置新用户对象的邮件地址属性会导致图形客户端引发错误。设置新用户时,主 SMTP 地址会自动设置为用户的 UPN。以下代码将成功创建新用户,并将主 SMTP 地址设置为与为用户主体名称设置的值相同:

IUser newUser = new User();
newUser.DisplayName = "Firstname Surname";
newUser.UserPrincipalName = "someone@somewhere.com";
newUser.AccountEnabled = true;
newUser.MailNickname = "firstnamesurname";
newUser.ImmutableId = "0k3otwAAEkm8vGSKbJqRZg==";
newUser.PasswordProfile = new PasswordProfile
{
    Password = "somerandompassword",
    ForceChangePasswordNextLogin = true
};
newUser.UsageLocation = "GB";
_activeDirectoryClient.Users.AddUserAsync(newUser).Wait();

很公平 - UPN 和主电子邮件地址不匹配可能会导致自动发现问题。

我遇到的问题是,用户对象的"mail"属性在更新用户时设置时也会引发错误。

以下代码将成功更新用户:

User retrievedUser = new User();
List<IUser> retrievedUsers = null;
retrievedUsers = _activeDirectoryClient.Users
    .Where(searchUser => searchUser.ImmutableId.Equals(0k3otwAAEkm8vGSKbJqRZg==))
    .ExecuteAsync().Result.CurrentPage.ToList();
if (retrievedUsers != null && retrievedUsers.Count == 1)
{
    retrievedUser = (User)retrievedUsers.First();
        retrievedUser.UserPrincipalName = "someone1@somewhere.com";
        retrievedUser.UpdateAsync().Wait();
}

上面的代码将更改用户的 UPN,但不会像添加新用户方案中那样更新主 SMTP 地址。我不明白这一点,因为它可能会导致自动发现问题(因为 UPN 与主 SMTP 地址不同),并否定创建新用户时无法设置邮件地址的任何原因。

我找不到有关如何更新用户的电子邮件地址或将其他电子邮件地址设置为主 SMTP 地址的任何详细信息。此要求的情况包括当用户结婚并且他们希望将新的电子邮件地址作为其主电子邮件地址时。

有没有人有任何关于如何使用Microsoft.Azure.ActiveDirectory.GraphClient管理用户主SMTP地址的信息?我可以找到有关设置其他电子邮件地址的信息,但找不到有关如何更改主 SMTP 地址的信息。

感谢任何帮助!

使用 Active Directory 图形 API 的用户电子邮件地址操作

通过自己对此进行测试,通过 AzureAD 图形 API 对userPrincipalName的更新会自动更新以下属性:

  • mail
  • userPrincipalName
  • proxyAddresses

更新 proxyAddresses 属性以包含新userPrincipalName作为新的主 SMTP 地址,并保留旧的主地址,但不再是主地址。这也反映在Exchange Online上。以 SMTP:(大写)为前缀的proxyAddress是 PrimarySmtpAddress。

作为边缘情况,如果以前的主地址与以前的 UPN 不同,则不会发生此过程。如果 UPN 和 PrimarySmtpAddress 不匹配,则当通过 AzureAD 图形 API 更新 UPN 时,新的 UPN 将添加为非主地址,并且原始地址将保留为主地址。

据我所知,这种行为是没有记录的。但是,此处记录了类似的东西:https://support.microsoft.com/en-us/help/3190357/how-the-proxyaddresses-attribute-is-populated-in-azure-ad。似乎哪个属性确定 PrimarySmtpAddress 的优先级mail> UPN> mailNickName .

一般来说,我认为直接操作proxyAddresses不是一个好主意,因为 Exchange/AD 已经为您做了很多这样的工作。

经过一个随机的想法,我已经想出了如何在上述场景中更改用户的主要电子邮件地址。这是通过在用户的代理地址列表中设置主电子邮件地址来完成的,该地址的前缀为"SMTP:"(请注意,它必须大写):

retrievedUser.ProxyAddresses = new List<string>
{
    "SMTP: someone1@somewhere.com"
};

希望这对其他人有所帮助!