Вопрос по .net, ldap, active-directory, active-directory-group, c# – Добавление и удаление пользователей из групп Active Directory в .NET

38

Я пишу следующие методы для добавления и удаления пользователей из активного каталога в C #.

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

Как лучше всего реализовать эти методы?

Вот некоторый код из CodeProject. Я могу'не видно, где в этих примерах указан сервер AD? (это неявно предоставляется платформой .NET при использовании протокола LDAP?). Стоит ли следовать этим примерам?

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

    }
}

Ваш Ответ

4   ответа
72

При использовании .Net Framework 3.5 или выше я настоятельно рекомендую использовать пространство имен System.DirectoryServices.AccountManagement. Это делает вещитак намного легче.

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

    }
}
Ниже код работал для меняgroup.Members.Remove (UserPrincipal.FindByIdentity (pc, userId)); вместо "group.Members.Remove (pc, IdentityType.UserPrincipalName, userId); " , Примечание: мой идентификатор пользователя простоUSERNAME» без добавления с доменным именем Ram
@ Рама, я бы опубликовал это как отдельный ответ - это мне очень помогло! codeMonkey
Возникла проблема, аналогичная описанной выше. Мне пришлось изменить строку, которая удаляет пользователя из группы с IdentityType.UserPrincipalName на IdentityType.SAMAccountName Ju66ernaut
Что значитcompany значит в этом оба метода? Aravin
2

public void RemoveUserFromGroup(string userDn, string groupDn)

dirEntry.Properties["member"].Remove(userDn) не работает для меня.

dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn)) работает.

@ fripp13, в контексте Active Directory, dn почти всегда означает DistinguishedName. Mathias Maes
Чтоdn переменная? fripp13
3

groupDn значение переменной. Например:

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

Все дело в пути LDAP для группы. Первая часть (myServer) - это имя сервера.

Часть после имени сервера (например, CN = ...) - это DN (отличительное имя) группы.

Жаль неЯ действительно отвечаю на ваши вопросы. да, примеры кажутся чистыми. Если вы все еще не уверены, я настоятельно рекомендую .NET Developer 'Руководство по программированию служб каталогов (amazon.com/gp/product/0321350170) Mike Marshall
Единственное, что я хотел бы сказать, это то, что при хорошей настройке AD вам не нужно указывать сервер. .NET AD / вызовы AD низкого уровня должны разрешить ближайший доступный для вас сервер. Но это скорее настройка AD / домена, а не столько кода. Если ваша установка AD является надежной, вы сможете исключить сервер (например, LDAP: //CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com) Mike Marshall
1

так чтоLDAP: //» + ldapServer + ldapQuery.

Используйте DirectoryEntry (String path, String userId, String password), если вам нужно аутентифицироваться

Похожие вопросы