tfsteamprojectcollection teamfoundationserver microsoft extendedclient c# api tfs tfs2012

c# - tfsteamprojectcollection - microsoft teamfoundationserver extendedclient



API de TFS: cómo obtener el administrador de un equipo? (2)

Estoy tratando de recuperar programáticamente los usuarios de administrador de un equipo .

Por ejemplo, en una configuración como en la imagen ¿cómo puedo obtener a ''Billy'' como administrador del equipo ''QC Manager''?

Ya tengo el código que reúne a todos los usuarios en un equipo a través de ListApplicationGroups de IIdentityManagementService, haciendo que el grupo use FirstOrDefault ... y luego obtenga sus usuarios a través de ReadIdentities.


He hecho algunos hurgues en los ensamblajes de Team Web Access, y esto parece estar disponible solo en el lado del servidor en este momento (no hay opción Rest or Client Object Model disponible). El código se ve así:

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());

Donde GetSecurableToken se ve así:

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

Desde aquí, debería ser capaz de reconstruir el código para leer y escribir estas listas. Para ir por ahí, busque Microsoft.TeamFoundation.Server.Core.dll , Class Microsoft.TeamFoundation.Server.Core.TeamFoundationTeamService para ser específico.

Si puede volver a escribir en algo útil, estaría agradecido y podría incluirlo en las herramientas de TfsTeam, por el momento no tengo mucho tiempo en mis manos para recoger esto.


Encontré este post API de TFS11: Administración de administradores de equipo ; Duplico el código para una fácil referencia, vea la publicación original para obtener información completa.

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)); }