2

我正在尝试使用 API 获取 TFS 2012 中特定用户的电子邮件地址。我在个人资料部分设置了用户首选电子邮件地址。我在网上做了很多搜索,并有以下代码。

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)

这段代码既是成功的,也是失败的。成功检索到指定用户为成功;但是,问题是电子邮件属性为空。当我分析成员变量时,我注意到那里列出了“邮件”属性并且它是空的。然后我注意到还有另外两个名为“ConfirmedNotificationAddress”和“CustomNotificationAddress”的属性,其中有我的首选电子邮件地址。

我想知道为什么我似乎无法使用首选电子邮件地址正确加载“邮件”变量,因为我需要此代码才能在很多人的服务器上工作。

4

2 回答 2

2

尝试使用Mail而不是Email属性名称 - 这对我有用。

此外,如果这不起作用,请检查member.GetProperties()- 也许这会给你正确的名字来使用的结果。

对我来说,GetProperty("Mail")也有效。

于 2013-11-11T17:13:55.440 回答
0

我遇到了同样的问题,我通过使用以下代码从 AD 获取我的用户电子邮件地址找到了解决方法。

    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;
            }
        }
    }

但是后来我发现当我的用户不在我的域中时它会抛出异常。所以这段代码帮助我有了第二个来源。如果我在 AD 中找不到,我会去使用 IdentityManagementService。

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

然后我会简单地使用这个执行。

    var ownerMail = GetUserEmail(checkinEvent.Resource.CheckedInBy.DisplayName);
    if (string.IsNullOrEmpty(ownerMail))
    {
       ownerMail = GetUserByAccountName(checkinEvent.Resource.CheckedInBy.DisplayName).GetProperty("Mail").ToString();
    }
于 2017-02-09T08:31:03.257 回答