2010-01-26 14 views
32

Estoy escribiendo los siguientes métodos para agregar y eliminar usuarios del directorio activo en C#.Agregar y eliminar usuarios de grupos de Active Directory en .NET

void AddUserToGroup(string userId, string groupName); 
void RemoveUserFromGroup(string userId, string groupName); 

¿Cuál es la mejor manera de implementar estos métodos?

Aquí hay un código de CodeProject. Sin embargo, no puedo ver dónde se especifica el servidor AD en estos ejemplos. (¿Es provisto implícitamente por .NET Framework cuando se usa el protocolo LDAP?). ¿Vale la pena seguir estos ejemplos?

public void AddToGroup(string userDn, string groupDn) 
{ 
    try 
    { 
     DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + groupDn); 
     dirEntry.Properties["member"].Add(userDn); 
     dirEntry.CommitChanges(); 
     dirEntry.Close(); 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 


public void RemoveUserFromGroup(string userDn, string groupDn) 
{ 
    try 
    { 
     DirectoryEntry dirEntry = new DirectoryEntry("LDAP://" + groupDn); 
     dirEntry.Properties["member"].Remove(userDn); 
     dirEntry.CommitChanges(); 
     dirEntry.Close(); 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 

Respuesta

61

Uf. LDAP. Si está utilizando .Net Framework 3.5 o superior, le recomiendo usar el espacio de nombres System.DirectoryServices.AccountManagement. Eso hace que las cosas sean tan fáciles.

public void AddUserToGroup(string userId, string groupName) 
{ 
    try 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "COMPANY")) 
     { 
      GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, groupName); 
      group.Members.Add(pc, IdentityType.UserPrincipalName, userId); 
      group.Save(); 
     } 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 

public void RemoveUserFromGroup(string userId, string groupName) 
{ 
    try 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "COMPANY")) 
     { 
      GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, groupName); 
      group.Members.Remove(pc, IdentityType.UserPrincipalName, userId); 
      group.Save(); 
     } 
    } 
    catch (System.DirectoryServices.DirectoryServicesCOMException E) 
    { 
     //doSomething with E.Message.ToString(); 

    } 
} 
+2

System.DirectorServices.AccountManagement solo está disponible en> = 3.5, en lugar de de 3.0 – regex

+2

Debajo del código funcionó para mí *** group.Members.Remove (UserPrincipal.FindByIdentity (pc, userId)); *** en lugar de *** "group.Members.Remove (pc, IdentityType.UserPrincipalName, userId) ; "***. Nota: mi ID de usuario es solo "NOMBRE DE USUARIO" sin agregar el nombre de dominio – Rama

+0

Sí, esa sobrecarga también funciona, es solo una llamada adicional al servicio LDAP para obtener la identidad del usuario antes de enviar la llamada eliminada. Francamente, es posible que sean equivalentes en su función, ya que la API probablemente llama al LDAP para la identidad basada en el nombre de usuario antes de eliminarlo también. –

2

El servidor es parte de la DNGrupo valor de la variable. Por ejemplo:

LDAP: //myServer/CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com

Todo esto es la ruta LDAP para el grupo. La primera parte (myServer) es el nombre del servidor.

La parte después del nombre del servidor (por ejemplo, CN = ...) es el DN (nombre completo) del grupo.

+0

Lo único que diría es que en una buena configuración de AD, no debería tener que especificar el servidor. Las llamadas .NET AD/AD de nivel bajo deben resolver el servidor disponible más cercano para usted. Pero esto es más configuración de AD/dominio y no tanto código. Si su configuración de AD es sólida, debería poder excluir el servidor (por ejemplo, LDAP: //CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com) –

+1

Lo siento, realmente no contestó sus preguntas. sí, los ejemplos parecen limpios. Si aún no está seguro, le recomiendo la Guía del desarrollador de .NET para la programación de servicios de directorio (http://www.amazon.com/gp/product/0321350170) –

1

Puede poner el servidor LDAP en el argumento de ruta a DirectoryEntry, por lo que "LDAP: //" + ldapServer + ldapQuery.

Uso de la (ruta String, String ID de usuario, contraseña String) DirectoryEntry si es necesario para autenticar

2

Al eliminar un miembro en public void RemoveUserFromGroup(string userDn, string groupDn)

dirEntry.Properties["member"].Remove(userDn) no funciona para mí.

dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn)) funciona.

+0

¿Qué es la variable 'dn'? – fripp13

+0

@ fripp13, en el contexto de un Active Directory, dn casi siempre significa DistinguishedName. –

Cuestiones relacionadas