在 .NET 中的 Active Directory 组中添加和删除用户
Posted
技术标签:
【中文标题】在 .NET 中的 Active Directory 组中添加和删除用户【英文标题】:Adding and removing users from Active Directory groups in .NET 【发布时间】:2011-01-09 17:26:13 【问题描述】:我正在编写以下方法来在 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();
【问题讨论】:
【参考方案1】:呃。 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();
【讨论】:
System.DirectorServices.AccountManagement 仅适用于 >= 3.5,而不是 3.0 下面的代码对我有用 group.Members.Remove(UserPrincipal.FindByIdentity(pc, userId)); 而不是 "group.Members.Remove(pc, IdentityType.UserPrincipalName, userId);" .注意:我的用户名只是“用户名”,没有附加域名 遇到了与上述类似的问题。我不得不将从组中删除用户的行从 IdentityType.UserPrincipalName 更改为 IdentityType.SAMAccountName 什么是 userId ? 我知道在上面的cmets中说过,但没有澄清。如果您以用户身份发送DOMAIN\someUserId
,则必须将其更改为IdentityType.SamAccountName
,而不是UserPrincipalName
。后者会给你一个例外:No principal matching the specified parameters was found
。但也要注意,如果用户已经在组中,它也会给你一个 SamAccountName
的例外。【参考方案2】:
删除成员时
public void RemoveUserFromGroup(string userDn, string groupDn)
dirEntry.Properties["member"].Remove(userDn)
不适合我。
dirEntry.Properties["member"].RemoveAt(dn.IndexOf(dn))
有效。
【讨论】:
dn
变量是什么?
@fripp13,在 Active Directory 的上下文中,dn 几乎总是意味着 DistinguishedName。【参考方案3】:
服务器是 groupDn 变量值的一部分。例如:
LDAP://myServer/CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com
整个就是组的 LDAP 路径。第一部分 (myServer) 是服务器名称。
服务器名称后的部分(例如 CN=...)是组的 DN(可分辨名称)。
【讨论】:
我唯一想说的是,在良好的 AD 设置中,您不必指定服务器。 .NET AD/低级 AD 调用应该为您解析最近的可用服务器。但这更多的是 AD/域设置,而不是太多代码。如果您的 AD 设置可靠,您应该能够排除服务器(例如 LDAP://CN=MyGroup,CN=Groups,CN=MyContainer,DN=mydomain.com) 很抱歉没有真正回答您的问题。是的,这些例子看起来确实很干净。如果您仍然不确定,我强烈推荐 .NET Developer's Guide to Directory Services Programming (amazon.com/gp/product/0321350170)【参考方案4】:您可以将 LDAP 服务器放在 DirectoryEntry 的路径参数中,因此 "LDAP://" + ldapServer + ldapQuery。
如果您需要进行身份验证,请使用 DirectoryEntry(String path, String userId, String password)
【讨论】:
以上是关于在 .NET 中的 Active Directory 组中添加和删除用户的主要内容,如果未能解决你的问题,请参考以下文章
13Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖
.NET 中的用户组和角色管理与 Active Directory
没有密码的 ASP.Net Core 中的 Active Directory 授权
使用 Active Directory 中的安全组的 Asp.Net 基于角色的身份验证
如何在 .NET Core Web 应用程序的单个实例中使用动态租户对 Azure Active Directory 中的用户进行身份验证?