Using the TFS 2012 API, how do I get the email address of a user?

匆匆过客 提交于 2019-12-10 10:29:50

问题


I am trying to get the email address of a particular user in TFS 2012 using the API. I have set the users Preferred Email address in the Profile section. I have done plenty of searching online and have the following code.

var userId = "myUserId";
var collection = new TfsTeamProjectCollection(tfsUri, tfsCerd);
var managementService = collection.GetService<IIdentityManagementService>();

var member =
    managementService
        .ReadIdentity(
            IdentitySearchFactor.AccountName,
            userId,
            MembershipQuery.Direct,
            ReadIdentityOptions.ExtendedProperties);

var emailAddress = member.GetAttribute("Mail", null)

This code is both a success and a failure. It is a success in that it successfully retrieves the specified user; however, the problem is that the Email attribute is blank. When I analyzed the member variable, I noticed the "Mail" attribute was listed there and it was empty. I then noticed there were two other attributes called "ConfirmedNotificationAddress" and "CustomNotificationAddress" that had my preferred email address correctly in there.

I am wondering why I can't seem to get the "Mail" variable to load properly with the preferred email address as I will need this code to work on a lot of peoples servers.


回答1:


Try using Mail instead of Email for the attribute name - that works for me.

Also, if that doesn't work, check the results of member.GetProperties() - maybe that will give you the right name to use.

For me, GetProperty("Mail") also worked.




回答2:


I bumped into the same problem, I found a work around by getting my users email address from AD using the following code.

    public string GetUserEmail(string username)
    {
        using (var pctx = new PrincipalContext(ContextType.Domain))
        {
            using (UserPrincipal up = UserPrincipal.FindByIdentity(pctx, username))
            {
                return up != null && !string.IsNullOrEmpty(up.EmailAddress) ? up.EmailAddress : string.Empty;
            }
        }
    }

But then I found that it would throw an exception when my user was not in my domain. So this code helped me have an a second source. If I didn't find in AD i would go and use the IdentityManagementService.

    public TeamFoundationIdentity GetUserByAccountName(string account)
    {
        var ims = _tfServer.GetService<IIdentityManagementService>();
        return ims.ReadIdentity(IdentitySearchFactor.DisplayName, account, MembershipQuery.Expanded, ReadIdentityOptions.ExtendedProperties);
    }

Then I would simply use this execution.

    var ownerMail = GetUserEmail(checkinEvent.Resource.CheckedInBy.DisplayName);
    if (string.IsNullOrEmpty(ownerMail))
    {
       ownerMail = GetUserByAccountName(checkinEvent.Resource.CheckedInBy.DisplayName).GetProperty("Mail").ToString();
    }


来源:https://stackoverflow.com/questions/19911368/using-the-tfs-2012-api-how-do-i-get-the-email-address-of-a-user

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!