【问题标题】:Where do I administer the email addresses of TFS users?我在哪里管理 TFS 用户的电子邮件地址?
【发布时间】:2012-03-01 19:39:06
【问题描述】:

在我的 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);

members 中的每个 Identity 都有一个属性 MailAddress,在我的例子中它等于 string.Empty。

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

我的第一个想法是在开始->管理工具->计算机管理->用户中查看用户

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

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

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

【问题讨论】:

    标签: tfs


    【解决方案1】:

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

    警告查询或更改数据库会使您处于可能无法从 Microsoft 获得支持的境地。建议您不要执行此操作,除非 Microsoft 支持代表在活动支持案例的上下文中指示您这样做。通过使用 TFS SDK 获取此信息,您实际上做得对。

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

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

    【讨论】:

    • 感谢您的详细解答。这些都是好消息。因此,现在我可以在发布构建时自动向每个团队成员发送电子邮件。 :)
    • 如果TFS没有连接AD,真的没有办法管理用户邮箱吗?有没有插件、API 或类似的东西可以做这样的事情?
    • 正确 - 在 TFS 2005、TFS 2008 和 TFS 2010 中。用户可以通过 Team Web Access 中的 Profile Management 在下一版本的 TFS 中更新他们的通知电子邮件地址,但我是不太确定是否会有一个 UI 暴露给管理员来更新它们。下一个版本的 TFS 还没有完成,我们拭目以待!如果它的存储方式可以通过 API 进行编辑,那么有人可能会构建一个自定义工具来执行此操作。
    • 在 Tfs 2012 中,有没有办法在设置团队警报时知道哪些电子邮件被用作 [成员的默认警报地址]?查看我的整个问题here
    【解决方案2】:

    以下内容适用于 TFS 2013 更新 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 的前三个部分中的每一个来完成的,但保留最后两个部分的顺序。例如:

    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%'
    

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

    接下来,您必须为 TFS DatabaseCategoryIdentity 框架找到 InternalKindId

    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>')
    

    注意:ArtifactId 是一个二进制值,基于半字节交换的数据库 GUID,不会匹配 UPDATE 查询中的引用值。 IE。这部分查询看起来像:

    WHERE ArtifactId=0x90D490F6BF7B31491CB894323F38A91F AND
    

    下面我假设PartitionId 是'1';在您继续之前,应通过简要扫描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 必须是一个不带引号的二进制值,从 tbl_Identity 返回的 GUID 转换而来,如上所述。
    注意:为每个ArtifactId 创建两条记录,每个PropertyId 一条记录。

    ** WARNING ** Getting caught editing the TFS database directly
    ** will void your Microsoft Support Agreement. **
    ** Proceed at your own risk. **
    

    (这对我有用,......但是,我没有要失效的 Microsoft 支持协议。)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 赋值member.MailAddress = ... 不是持久化的,后面是否需要调用Save/Update函数?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-14
          • 2019-01-07
          • 1970-01-01
          • 2021-03-16
          • 2019-08-10
          • 2016-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多