我在哪里管理TFS用户的电子邮件地址?

时间:2012-02-09 10:24:31

标签: tfs tfs2010

在我的Team Foundation Server中,我有一个包含团队项目的集合。该团队项目有几个贡献者。以下代码行获得该项目的所有贡献者:

TfsTeamProjectCollection collection = new TfsTeamProjectCollection(new Uri("http://tfs:8080/tfs/CollectionName"));

IGroupSecurityService groupSecurityService = collection.GetService<IGroupSecurityService>();

Identity contributors = groupSecurityService.ReadIdentity(SearchFactor.AccountName, "[ProjectName]\\Contributors", QueryMembership.Expanded);

Identity[] members = groupSecurityService.ReadIdentities(SearchFactor.Sid, contributors.Members, QueryMembership.None);

成员中的每个身份都有一个属性 MailAddress ,在我的情况下等于string.Empty。

我在哪里管理这些邮件地址?

我的第一个想法是在Start-&gt;管理工具 - &gt;计算机管理 - &gt;用户

中查看用户

我选择了其中一个用户并打开了他的属性。我以为TFS可能会有一个电子邮件属性。但我找不到一个。

然后我打开了TFS管理控制台,查找了组成员资格并导航到其中一个用户。也无法编辑属性。

有谁知道在哪里设置该电子邮件地址?

5 个答案:

答案 0 :(得分:9)

好问题!有一个TFS作业计划每小时运行一次,以根据Active Directory中的详细信息更新存储在TFS中的安全身份信息。其中一些信息包括显示名称,安全标识符(SID),AD专有名称和电子邮件地址等。您可以通过查看配置数据库中的tbl_security_identity_cache表来查找此详细信息缓存。

警告查询或更改数据库会使您无法获得Microsoft的支持。除非Microsoft支持代表在有效支持案例的上下文中指示,否则建议您不要这样做。您实际上是通过使用TFS SDK来获取此信息。

如果您的TFS环境不在Active Directory环境中,那么它将尝试从运行TFS的本地计算机同步信息。它没有关于要使用的电子邮件地址的详细信息,因此它将留空。

从TFS 2010之后的下一版TFS开始,每个用户都可以使用Team Web Access在其个人资料中更新其通知电子邮件地址。

答案 1 :(得分:3)

以下内容适用于TFS 2013 Update 5

** WARNING ** Getting caught editing the TFS database directly
** will void your Microsoft Support Agreement. **
What follows is not for the uninitiated.  ** Proceed at your own risk. **

找到需要设置电子邮件地址的用户。 Identities表中可能存在重复项。我发现SequenceId位置最高的是有效Identities

Use Tfs_TFSConfiguration
SELECT i1.AccountName, i1.Id FROM tbl_Identity AS i1
LEFT OUTER JOIN tbl_Identity AS i2
    ON (i1.AccountName=i2.AccountName AND i1.SequenceId<i2.SequenceId)
WHERE i2.AccountName IS NULL
    AND i1.AccountName in ('<your first user>','<another user>','<and so on>')

这为您需要更新的帐户提供了GUID格式的最新Id(s)列表。必须将这些GUID重新格式化为ArtifactId(s),这是一种转换后的二进制格式。这是通过反转GUID的字节顺序(从低到高)或前三个部分中的每一个来完成的,但是按顺序保留最后两个部分。 E.g:

Returned 'Id' GUID     =01020304-0506-0708-090A-0B0C0D0E0F10
Byte Swapped GUID      =04030201-0605-0807-090A-0B0C0D0E0F10
Reformatted 'ArtifacId'=0x0403020106050807090A0B0C0D0E0F10

接下来,您必须找到TFS用于电子邮件通知的PropertyId(s)。在TFS 2013 U5中,可以使用以下查询找到它:

USE Tfs_TFSConfiguration
SELECT Name, PropertyId FROM tbl_PropertyDefinition WHERE Name LIKE '%Address%'

这将为PropertyIdConfirmedNotificationAddress提供CustomNotificationAddresses个;这是TFS 2013 U5用于发送通知电子邮件的两个属性字段。

接下来,您必须找到TFS InternalKindId的{​​{1}}框架的Identity

DatabaseCategory

现在把它们放在一起,......

如果您的用户的配置记录已存在,您可以使用以下命令更新设置:

USE Tfs_TFSConfiguration
SELECT Description, InternalKindId FROM tbl_PropertyArtifactKind
WHERE Description='Identity'

注意: USE Tfs_TFSConfiguration UPDATE tbl_PropertyValue SET LeadingStringValue='<user's notification email address>' WHERE ArtifactId=<ArtifactId, reformatted from tbl_Identity query> AND PropertyId IN ('<first PropertyId from tbl_PropertyDefinition>', '<second id>') 是二进制值,基于半字节交换的数据库GUID,并且与ArtifactId查询中的引用值不匹配。即这部分查询看起来像:

UPDATE

下面我假设WHERE ArtifactId=0x90D490F6BF7B31491CB894323F38A91F AND 是'1';在继续对PartitionId表中的记录进行简要扫描之前,应先验证这一点 如果要加载尚未设置的配置设置:

tbl_PropertyValue

注意: USE Tfs_TFSConfiguration INSERT INTO tbl_PropertyValue (PartitionId, ArtifactId, InternalKindId, Version, PropertyId, LeadingStringValue) VALUES ('1', <ArtifactId, reformatted from tbl_Identity query>, '<InternalKindId from tbl_PropertyArtifactKind>', '0', '<first PropertyId from tbl_PropertyDefinition>', '<user's notification email address>'), ('1', <ArtifactId, reformatted from tbl_Identity query>, '<InternalKindId from tbl_PropertyArtifactKind>', '0', '<second PropertyId from tbl_PropertyDefinition>', '<user's notification email address>') 必须是未加引号的二进制值,如上所述,从ArtifactId返回的GUID进行转换。
注意:为每个tbl_Identity创建了两条记录,每条ArtifactId一条记录。

PropertyId

(这对我有用,但是,我没有微软支持协议来宣告无效。)

答案 2 :(得分:2)

如果Active Directory未与TFS同步,并且假设您保留电子邮件地址的目的是发送通知,则可以使用IEventService.GetEventSubscriptions()方法。

var eventService = (IEventService)collection.GetService(typeof(IEventService));

foreach (var member in members)
{
    var subscription = eventService.GetEventSubscriptions(member.DisplayName).First();
    {
        if (subscription != null && string.IsNullOrEmpty(member.MailAddress))
            member.MailAddress = subscription.DeliveryPreference.Address;
    }
}

答案 3 :(得分:1)

我相信这是保存在Active Directory中的。

答案 4 :(得分:0)

对于TFS2017 +,每个用户都可以拥有一个首选电子邮件地址,可以在其个人资料中的Web界面上进行设置。

它可以覆盖或替换Active Directory中设置的电子邮件。它还具有即时更改的优势,无需同步。

将使用在Active Directory中设置的值初始化该字段。同步似乎不再发生。

相关问题