2010-01-26 6 views
32

J'écris les méthodes suivantes pour ajouter et supprimer des utilisateurs du répertoire actif en C#.Ajout et suppression d'utilisateurs de groupes Active Directory dans .NET

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

Comment mieux implémenter ces méthodes?

Voici un code de CodeProject. Je ne peux pas voir où le serveur AD est spécifié dans ces exemples cependant? (est-il implicitement fourni par le framework .NET lors de l'utilisation du protocole LDAP?). Ces exemples méritent-ils d'être suivis?

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

    } 
} 

Répondre

61

Ugh. LDAP. Si vous utilisez .Net Framework 3.5 ou supérieur, je recommande fortement d'utiliser l'espace de noms System.DirectoryServices.AccountManagement. Cela rend les choses donc beaucoup plus facile.

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 est uniquement disponible dans> = 3.5, plutôt que 3.0 – regex

+2

Ci-dessous le code a travaillé pour moi *** group.Members.Remove (UserPrincipal.FindByIdentity (pc, userId)); *** au lieu de *** "group.Members.Remove (pc, IdentityType.UserPrincipalName, userId) "***. Note: mon identifiant utilisateur est juste "USERNAME" sans ajout de nom de domaine – Rama

+0

Oui, cette surcharge fonctionne aussi, c'est juste un appel supplémentaire dans le service LDAP pour obtenir l'identité de l'utilisateur avant d'envoyer l'appel de suppression. Franchement, il est possible qu'ils soient équivalents en fonction car l'API appelle probablement dans le LDAP pour l'identité basée sur le nom d'utilisateur avant de faire la suppression, aussi. –

2

Le serveur fait partie de la GroupDN valeur variable. Par exemple:

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

L'ensemble est le chemin LDAP pour le groupe. La première partie (myServer) est le nom du serveur.

La partie après le nom du serveur (par exemple CN = ...) est le DN (nom distinctif) du groupe.

+0

La seule chose que je dirais est que dans une bonne configuration AD, vous ne devriez pas avoir à spécifier le serveur. Les appels AD .NET AD/bas niveau doivent résoudre le serveur disponible le plus proche pour vous. Mais c'est plus de configuration AD/domaine et pas tellement de code. Si votre configuration AD est solide, vous devriez être en mesure d'exclure le serveur (par exemple LDAP: //CN=MyGroup,CN=Groups,CN=MyContainer,DN=mondomaine.com) –

+1

Désolé, nous n'avons pas vraiment répondu à vos questions. oui, les exemples semblent propres. Si vous n'êtes toujours pas sûr, je recommande fortement le Guide du développeur .NET pour la programmation des services d'annuaire (http://www.amazon.com/gp/product/0321350170) –

1

Vous pouvez placer le serveur LDAP dans l'argument path de DirectoryEntry, de sorte que "LDAP: //" + ldapServer + ldapQuery.

Utilisez le DirectoryEntry (chemin String, String userId, mot de passe String) si vous devez vous authentifier

2

Lorsque vous supprimez un membre public void RemoveUserFromGroup(string userDn, string groupDn)

dirEntry.Properties["member"].Remove(userDn) ne fonctionne pas pour moi.

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

+0

Qu'est-ce que la variable 'dn'? – fripp13

+0

@ fripp13, dans le contexte d'un Active Directory, dn signifie presque toujours DistinguishedName. –

Questions connexes