51

我正在编写以下方法来在 C# 的活动目录中添加和删除用户。

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

如何最好地实施这些方法?

这是来自 CodeProject 的一些代码。我看不到在这些示例中指定 AD 服务器的位置吗?(在使用 LDAP 协议时,它是由 .NET 框架隐式提供的吗?)。这些例子值得学习吗?

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

4 回答 4

97

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

    }
}
于 2010-01-27T00:26:22.223 回答
4

服务器是groupDn变量值的一部分。例如:

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

整个事情就是组的 LDAP 路径。第一部分 (myServer) 是服务器名称。

服务器名称(例如 CN=...)之后的部分是组的 DN(专有名称)。

于 2010-01-26T22:15:23.330 回答
3

删除成员时 public void RemoveUserFromGroup(string userDn, string groupDn)

dirEntry.Properties["member"].Remove(userDn)对我不起作用。

dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn))作品。

于 2012-01-26T09:36:34.720 回答
1

您可以将 LDAP 服务器放在 DirectoryEntry 的路径参数中,因此“LDAP://”+ ldapServer + ldapQuery。

如果需要进行身份验证,请使用 DirectoryEntry(String path, String userId, String password)

于 2010-01-26T22:16:17.077 回答