我正在编写以下方法来在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();
}
}
答案 0 :(得分:76)
唉。 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();
}
}
答案 1 :(得分:3)
服务器是 groupDn 变量值的一部分。例如:
<强> LDAP://myServer/CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com 强>
整个事情是该组的LDAP路径。第一部分(myServer)是服务器名称。
服务器名称后面的部分(例如CN = ...)是该组的DN(可分辨名称)。
答案 2 :(得分:2)
删除中的成员时
public void RemoveUserFromGroup(string userDn, string groupDn)
dirEntry.Properties["member"].Remove(userDn)
对我不起作用。
dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn))
有效。
答案 3 :(得分:1)
您可以将LDAP服务器放在DirectoryEntry的path参数中,这样“LDAP://”+ ldapServer + ldapQuery。
如果需要进行身份验证,请使用DirectoryEntry(String path,String userId,String password)