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

时间:2016-02-23 14:57:47

标签: c# azure azure-ad-graph-api

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

我面临的问题是设置用户的邮件地址。在配置新用户时,设置新用户对象的邮件地址属性会导致Graph Client抛出错误。配置新用户时,主SMTP地址将自动设置为用户的UPN。以下代码将成功创建新用户,并将主SMTP地址设置为与UserPrincipalName设置的值相同:

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地址的信息。

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

随机思考后,我已经想出如何在上述场景中更改用户的主电子邮件地址。这是通过在用户的代理地址列表中设置主电子邮件地址来完成的,表示主要地址的前缀为“SMTP:”(注意它必须在CAPS中):

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

希望这有助于其他人!

答案 1 :(得分:0)

自己测试后,通过AzureAD Graph API 自动更新userPrincipalName 会更新以下属性:

  • mail
  • userPrincipalName
  • proxyAddresses

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

作为边缘情况,如果先前的主要地址与先前的UPN相同,则不会发生此过程。如果UPN和PrimarySmtpAddress不匹配,那么当通过AzureAD Graph API更新UPN时, new UPN将作为非主要地址添加,并且原始主要地址仍将是主要地址。

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

一般情况下,我认为直接操纵proxyAddresses并不是一个好主意,因为Exchange / AD已经为您做了很多这样的事情。