【问题标题】:TFS API - How to get a Team's Adminstrator?TFS API - 如何获得 Teams 管理员?
【发布时间】:2014-03-27 23:41:04
【问题描述】:

我正在尝试以编程方式检索团队的管理员用户

例如,在图片中的设置中,我如何才能让“Billy”成为团队“QC Manager”的管理员?

我已经有了通过 IIdentityManagementService 的 ListApplicationGroups 获取团队中所有用户的代码,使用 FirstOrDefault 获取组...然后通过 ReadIdentities 获取其用户。

【问题讨论】:

  • 我怀疑它是团队 TeamFoundationIdentity 的扩展属性,类似于团队图像的存储方式:blog.jessehouwing.nl/2013/01/…
  • 谢谢你,杰西。恐怕需要其他方法,我查询了 [Tfs_Configuration].[dbo].[tbl_PropertyDefinition],虽然我找到了您访问的属性以获取团队的图像,但我找不到任何与团队管理员。

标签: c# api tfs tfs-sdk


【解决方案1】:

我在 Team Web Access 程序集中进行了一些探索,目前这似乎仅在服务器端可用(没有可用的 Rest 或 Client Object Model 选项)。代码如下所示:

TeamFoundationIdentity identity;
string token = service.GetSecurableToken(requestContext, teamIdentity.Descriptor, out identity);
AccessControlList list = requestContext.GetService<SecurityService>().QueryAccessControlLists(requestContext, FrameworkSecurity.IdentitiesNamespaceId, token, null, false, false).FirstOrDefault<AccessControlList>();
List<IdentityDescriptor> list2 = new List<IdentityDescriptor>();
if (list != null)
{
    foreach (AccessControlEntry entry in list.AccessControlEntries)
    {
        if ((entry.Allow & 8) == 8)
        {
            list2.Add(entry.Descriptor);
        }
    }
}
return service.ReadIdentities(requestContext, list2.ToArray());

GetSecurableToken 的样子:

internal static string CreateSecurityToken(TeamFoundationIdentity group)
{
    return (group.GetAttribute(IdentityAttributeTags.LocalScopeId, string.Empty) + FrameworkSecurity.IdentitySecurityPathSeparator + group.TeamFoundationId.ToString());
}

从这里您应该能够拼凑代码来读取和写入这些列表。要自己四处寻找,请查找Microsoft.TeamFoundation.Server.Core.dllMicrosoft.TeamFoundation.Server.Core.TeamFoundationTeamService 类。

如果您能够将其重写为有用的东西,我将不胜感激,并且可能会将其粘贴到 TfsTeamTools 中,目前我没有太多时间来学习它。

【讨论】:

  • Jesse,为什么不简单地检查一下 [PROJECT]\Project Administrators 成员资格?
  • @GiulioVian 因为团队管理员与项目管理员不同。
  • 非常感谢您,杰西。我会尝试合并它,并让你知道它是如何进行的。我正在研究一个自动错误/问题分配例程,该例程查看“区域”字段,将其与团队匹配,并将错误分配给团队的管理员,在未填充“分配给”字段的情况下。
【解决方案2】:

找到这个帖子TFS11 API: Managing Team Administrators;我复制代码以便于参考,完整信息请参阅原始帖子。

static void Main(string[] args)
{
    // Connect to the TFS server and get the team project URI.
    var collection = GetServer("server_uri");
    var projectUri = GetProjectUri(collection, "project_name");

    // Retrieve the default team.
    TfsTeamService teamService = collection.GetService<TfsTeamService>();
    TeamFoundationTeam defaultTeam = teamService.GetDefaultTeam(projectUri, null);

    // Get security namespace for the project collection.
    ISecurityService securityService = collection.GetService<ISecurityService>();
    SecurityNamespace securityNamespace = securityService.GetSecurityNamespace(FrameworkSecurity.IdentitiesNamespaceId);

    // Use reflection to retrieve a security token for the team.
    MethodInfo mi = typeof(IdentityHelper).GetMethod("CreateSecurityToken", BindingFlags.Static | BindingFlags.NonPublic);           
    string token = mi.Invoke(null, new object[] { defaultTeam.Identity }) as string;

    // Retrieve an ACL object for all the team members.
    var allMembers = defaultTeam.GetMembers(collection, MembershipQuery.Expanded).Where(m => !m.IsContainer);
    AccessControlList acl = securityNamespace.QueryAccessControlList(token, allMembers.Select(m => m.Descriptor), true);

    // Retrieve the team administrator SIDs by querying the ACL entries.
    var entries = acl.AccessControlEntries;
    var admins = entries.Where(e => (e.Allow & 15) == 15).Select(e => e.Descriptor.Identifier);

    // Finally, retrieve the actual TeamFoundationIdentity objects from the SIDs.
    var adminIdentities = allMembers.Where(m => admins.Contains(m.Descriptor.Identifier));       
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多