Добавление и удаление пользователей из групп Active Directory в .NET

Я пишу следующие методы для добавления и удаления пользователей из активного каталога в 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)

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

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

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

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

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

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

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

При использовании .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(); 

    }
}
 Ju66ernaut30 июн. 2015 г., 20:17
Возникла проблема, аналогичная описанной выше. Мне пришлось изменить строку, которая удаляет пользователя из группы с IdentityType.UserPrincipalName на IdentityType.SAMAccountName
 forcewill28 сент. 2016 г., 11:45
Единственная проблема сSystem.DirectorServices.AccountManagement в том, что если машина не находится в домене, я получаю сообщение об ошибке>. <
 regex26 сент. 2012 г., 01:48
System.DirectorServices.AccountManagement доступен только в>= 3,5, а не 3,0
 Jacob Proffitt04 февр. 2013 г., 18:36
Да, эта перегрузка тоже работает,Это просто дополнительный вызов в службу LDAP для получения идентификатора пользователя перед отправкой вызова удаления. Честно говоря, этовозможно, что ониэквивалентен по функции, так как API, вероятно, также вызывает LDAP для идентификации на основе имени пользователя перед выполнением удаления.
 Kiquenet16 февр. 2016 г., 09:39
Что такоеИдентификатор пользователя ?
 codeMonkey12 апр. 2017 г., 00:25
@ Рама, я бы опубликовал это как отдельный ответ - это мне очень помогло!
 Aravin05 нояб. 2017 г., 13:00
Что значитcompany значит в этом оба метода?
 vapcguy24 окт. 2016 г., 17:23
При удалении из группы - если пользователь никогда не входил в группу, он неисключение - он просто пройдет через.Save() операция, независимо. Вы должны проверить, еслиUserPrincipal объект для пользователя.IsMemberOf(group), чтобы обнаружить это. Представлено редактирование.userId должен быть вDOMAIN\username Форма для отправкиUserPrincipal.FindByIdentity(pc, userId);Однако, что потребуетSamAccountName в .IdentityType
 Ram04 февр. 2013 г., 07:02
Ниже код работал для меняgroup.Members.Remove (UserPrincipal.FindByIdentity (pc, userId)); вместо "group.Members.Remove (pc, IdentityType.UserPrincipalName, userId); " , Примечание: мой идентификатор пользователя простоUSERNAME» без добавления с доменным именем
 vapcguy24 окт. 2016 г., 16:53
Я знаю, что это было сказано в комментариях выше, но это не былот уточнил. Если вы отправите вDOMAIN\someUserId как ваш пользователь, этос, когда вы должны изменить его наIdentityType.SamAccountName, вместоUserPrincipalName, Последний даст вам исключение:No principal matching the specified parameters was found, Но обратите внимание, это также даст вам исключение сSamAccountName, если пользователь уже находится в группе.

public void RemoveUserFromGroup(string userDn, string groupDn)

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

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

 Mathias Maes26 февр. 2018 г., 15:00
@ fripp13, в контексте Active Directory, dn почти всегда означает DistinguishedName.
 fripp1328 мар. 2017 г., 13:39
Чтоdn переменная?

Ваш ответ на вопрос