Team Foundation 服务器使用 Java SDK 获取项目用户

Team foundation server getting users of a project using Java SDK

我试图通过 Java 版本 11.0.0 的 SDK 获取属于一个项目的所有用户,但我被卡住了。 使用该代码,我检索了集合和项目:

TeamFoundationServerEntity teamFoundationServer=configurationServer.getTeamFoundationServerEntity(true);
if (teamFoundationServer != null)
{
        ProjectCollectionEntity[] projectCollections = teamFoundationServer.getProjectCollections();
        for (ProjectCollectionEntity pce : projectCollections) {
            System.out.println("Collection: "+pce.getDisplayName()+"  "+pce.getDescription());
            TeamProjectEntity[] tpe=pce.getTeamProjects();
            for (TeamProjectEntity teamProjectEntity : tpe) {
                System.out.println("    teamProjectEntity: "+teamProjectEntity.getDisplayName()+" * "+teamProjectEntity.getProjectURI());
            }
        }
}

还有以下代码取自下载的 zip 中的示例并具有组信息:

GUID[] resourceTypes = new GUID[]{
        CatalogResourceTypes.PROJECT_COLLECTION
    };
    CatalogResource[] resources =
        configurationServer.getCatalogService().queryResourcesByType(resourceTypes, CatalogQueryOptions.NONE);

    if (resources != null)
    {
        for (CatalogResource resource : resources)
        {
            String instanceId = resource.getProperties().get("InstanceId");
            TFSTeamProjectCollection tpc = configurationServer.getTeamProjectCollection(new GUID(instanceId));

            System.out.println("TFSTeamProjectCollection");
            System.out.println("\tName: " + tpc.getName().toString());
            System.out.println("\tURI: " + tpc.getBaseURI());

            ProjectCollection pc=tpc.getWorkItemClient().getProjects();

            for (Project project : pc) {
                System.out.println("---"+project.getName()+" * "+project.getID());

                String[] grps=tpc.getWorkItemClient().getGroupDataProvider(project.getName()).getGroups();
            }
       }
   }

我找到了 class IdentityManagementService

IdentityManagementService ims=new IdentityManagementService(configurationServer);

但我不知道如何使用 listApplicationGroupsreadIdentities 方法,这些方法可能对找到解决方案有用。 有没有人有想法让每个项目组中的用户?

@Cece - MSFT 回答并查看 blog and the book Microsoft Team Foundation Server 2015 Cookbook 之后再进行几次试验。使用此代码

TeamFoundationIdentity[] appGroups=ims.listApplicationGroups(project.getURI(), ReadIdentityOptions.EXTENDED_PROPERTIES);
for (TeamFoundationIdentity group : appGroups) 
{
    System.out.println(group.getDisplayName());
    TeamFoundationIdentity[] groupMembers= ims.readIdentities(new IdentityDescriptor[]{group.getDescriptor()}, MembershipQuery.EXPANDED, ReadIdentityOptions.EXTENDED_PROPERTIES);
    for (TeamFoundationIdentity member : groupMembers) 
    {
        for(IdentityDescriptor memberID : member.getMembers())
        {
            TeamFoundationIdentity memberInfo=ims.readIdentity(IdentitySearchFactor.IDENTIFIER, memberID.getIdentifier(), MembershipQuery.EXPANDED, ReadIdentityOptions.EXTENDED_PROPERTIES);
            System.out.println(memberInfo.getDisplayName());
        }
    }
}

变量 appGroups 始终为空。也许project.getURI()这个方法不合适?如果我把 null

TeamFoundationIdentity[] tfi=ims.listApplicationGroups(null, ReadIdentityOptions.INCLUDE_READ_FROM_SOURCE);
for (TeamFoundationIdentity teamFoundationIdentity : tfi) {
    System.out.println(teamFoundationIdentity.getDisplayName());
    System.out.println(teamFoundationIdentity.getDescriptor().getIdentityType());
    IdentityDescriptor[] mbs=teamFoundationIdentity.getMembers();
    for (IdentityDescriptor mb : mbs) {
        TeamFoundationIdentity mbi=ims.readIdentity(mb, MembershipQuery.EXPANDED, ReadIdentityOptions.EXTENDED_PROPERTIES);
        System.out.println(mbi.getProperties());
    }
}

输出是

[DefaultCollection]\Project Collection Administrators
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Build Administrators
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Build Service Accounts
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Proxy Service Accounts
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Service Accounts
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Test Service Accounts
Microsoft.TeamFoundation.Identity
[DefaultCollection]\Project Collection Valid Users
Microsoft.TeamFoundation.Identity

为什么我无法在 listApplicationGroups 方法中使用 project.getURI() 获取贡献者、读者和其他组?我只能用

得到它们
String[] grps=tpc.getWorkItemClient().getGroupDataProvider(project.getName()).getGroups();

检查 this 博客。在这篇博客中,作者使用了IGroupSecurityService服务来获取应用组列表,并获取用户所属组的详细信息。

但是现在,IGroupSecurityService已经过时了。您需要改用 IIdentityManagementServiceISecurityService

代码片段应如下所示:

var sec = tfs.GetService<IIdentityManagementService>();
Identity[] appGroups = sec.ListApplicationGroups(Scope Uri);


foreach (Identity group in appGroups)
{
     Identity[] groupMembers = sec.ReadIdentities(SearchFactor.Sid, new string[] { group.Sid }, QueryMembership.Expanded);

     foreach (Identity member in groupMembers)
     {
         var groupM = new GroupMembership {GroupName = member.DisplayName, GroupSid = member.Sid};

         if (member.Members != null)
         {
             foreach (string memberSid in member.Members)
             {
                 Identity memberInfo = sec.ReadIdentity(SearchFactor.Sid, memberSid, QueryMembership.Expanded);

                 var userName = memberInfo.Domain + "\" + memberInfo.AccountName;

详细步骤,可以查看博客

任何对这两个 link 感兴趣的人都有答案: get groups of project and get members of a group