Добавление и удаление пользователей из групп 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. Если вы используете.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();
}
}
Сервер является частью значения переменной groupDn. Например:
LDAP: //myServer/CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com
Все дело в пути LDAP для группы. Первая часть (myServer) - это имя сервера.
Часть после имени сервера (например, CN=...) - это DN (отличительное имя) группы.
При удалении участника вpublic void RemoveUserFromGroup(string userDn, string groupDn)
dirEntry.Properties["member"].Remove(userDn)
не работает для меня
dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn))
работает.
Вы можете поместить сервер LDAP в аргументе пути к DirectoryEntry, так что "LDAP://" + ldapServer + ldapQuery.
Используйте DirectoryEntry(String path, String userId, String password), если вам нужно аутентифицироваться