2012-06-26 10 views
5

Estoy usando el espacio de nombres System.DirectoryServices.AccountManagement para encontrar usuarios de dominio y sus correspondientes grupos de seguridad AD. Esto funciona bien¿Buscar grupos locales a los que pertenece un usuario de dominio?

También estoy usando ese espacio de nombres para consultar los grupos de seguridad locales en un servidor remoto. Puedo encontrar un grupo de seguridad y luego enumerar a los usuarios de ese grupo sin problema.

Lo que estoy teniendo problemas con los que se presentan grupos locales pertenece a un usuario de dominio:

PrincipalContext localmachine = new PrincipalContext(ContextType.Machine, "ServerName"); 
PrincipalContext domain = new PrincipalContext(ContextType.Domain); 

// find the user using the domain context (Works fine) 
UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    // The get groups method is the only method that would accept a new context 
    PrincipalSearchResult<Principal> groups = user.GetGroups(localMachine); 

    // no groups are returned .... removed rest of code 
} 

Estoy intentando utilizar el método GetGroups que pasa en el LocalMachine PrincipalContext pero no se devuelven los grupos.

Los usuarios existen solo en el Dominio AD. No hay una entrada para este usuario en los usuarios locales en la máquina local. Los usuarios de dominio se agregan a grupos de seguridad locales.

¿Alguna idea? Me gustaría poder obtener una lista de todos los grupos locales a los que pertenece este usuario de dominio y luego ver si existen ciertos grupos en esa lista. La única opción que funciona ahora es que busque ciertos grupos en el sistema y vea si el usuario del dominio pertenece a ese grupo.

+0

pregunta similar aquí - esperemos que de alguna utilidad - http://stackoverflow.com/questions/4809460/determine-nested-groups-of-windowsidentity-instance – dash

+0

He intentado hacerlo de esa manera. El método FindByIdentity devuelve nulo al buscar al usuario en la máquina. Supongo que esto se debe a que no se creó un usuario local real. Es un usuario de dominio. Intenté pasar el nombre de usuario con y sin el dominio anterior. –

+0

Explorando un viejo código, me parece que lo hice exactamente de la manera que describiste; enumerar los grupos de máquinas locales (a través de DirectorySearcher) y luego enumerarlos para ver si puedo encontrar un grupo del que el usuario es miembro. También teníamos una jerarquía bastante superficial. Lo siento no puede ser de más ayuda. – dash

Respuesta

2

El siguiente código devolverá los grupos locales que un usuario de dominio es miembro de:

 PrincipalContext domain = new PrincipalContext(ContextType.Domain); 
     UserPrincipal user = UserPrincipal.FindByIdentity(domain, userName); 
     foreach (GroupPrincipal group in user.GetAuthorizationGroups()) 
     { 
      if (group.Context.ConnectedServer == serverName) 
       Console.Out.WriteLine("{0}\\{1}", group.Context.Name, group.SamAccountName); 
     } 
+1

Este código de mi máquina local solo devuelve un servidor conectado para aproximadamente 30 grupos. Esperaba que el método GetAuthorizationGroups() solo devolviera grupos desde el contexto especificado en el objeto UserPrincipal. ¿Ese método también consulta la máquina en la que se está ejecutando el código? –

1

sé que mi respuesta es tarde, pero esto funcionó para mí (después he intentado todo tipo de permutaciones):

private static IList<string> GetUserLocalGroups(string userAccountName, string computerName, string domainName) 
{ 
    List<string> groups = new List<string>(); 

    // We have to deal with a local computer 
    DirectoryEntry root = new DirectoryEntry(String.Format("WinNT://{0},Computer", computerName), null, null, AuthenticationTypes.Secure); 


    foreach (DirectoryEntry groupDirectoryEntry in root.Children) 
    { 
    if (groupDirectoryEntry.SchemaClassName != "Group") 
     continue; 

    string groupName = groupDirectoryEntry.Name; 
    Console.WriteLine("Checking: {0}", groupName); 
    if (IsUserMemberOfGroup(groupDirectoryEntry, String.Format("WinNT://{0}/{1}", domainName, userAccountName))) 
    { 
     groups.Add(groupName); 
    } 
    } 

    return groups; 
} 

private static bool IsUserMemberOfGroup(DirectoryEntry group, string userPath) 
{ 
    return (bool)group.Invoke(
     "IsMember", 
     new object[] { userPath } 
    ); 
} 

La llamada es algo como esto:

GetUserLocalGroups("samaccountname", "computerName.yourdomain", "yourdomain"); 
Cuestiones relacionadas