在我的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管理控制台,查找了组成员资格并导航到其中一个用户。也无法编辑属性。
有谁知道在哪里设置该电子邮件地址?
答案 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%'
这将为PropertyId
和ConfirmedNotificationAddress
提供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中设置的值初始化该字段。同步似乎不再发生。