我正在尝试从活动目录组中获取用户列表和有关用户的一些属性。
更新
以下是我目前使用的两种方法:
Dim adGroup As New DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com")
Dim adMembers As Object
Dim objUser As ActiveDirectoryUser
Dim objUserList As New List(Of ActiveDirectoryUser)
Dim directoryEntry As DirectoryEntry
adMembers = adGroup.Invoke("Members", Nothing)
For Each adMember As Object In CType(adMembers, IEnumerable)
directoryEntry = New DirectoryEntry(adMember)
objUser = New ActiveDirectoryUser
objUser.UserId = directoryEntry.Properties.Item("sAMAccountName").Value.ToString()
objUser.Contract = directoryEntry.Properties.Item("ou").Value.ToString()
objUser.LastName = directoryEntry.Properties.Item("sn").Value.ToString()
objUser.FirstName = directoryEntry.Properties.Item("givenName").Value.ToString()
objUser.Email = directoryEntry.Properties.Item("mail").Value.ToString()
objUserList.Add(objUser)
Next
第一件作品虽然看起来效率很低。我的内存使用量在执行时上升和爬升,我得到this错误,虽然看起来可以修复。第二种方法:
Dim results As SearchResultCollection
Dim directoryEntry2 As New DirectoryEntry("LDAP://DC=domain,DC=com")
Dim directorySearcher As New DirectorySearcher(directoryEntry2)
directorySearcher.PageSize = 1000
directorySearcher.Filter = "(&(objectCategory=person)" & _
"(objectClass=user)" & _
"(memberOf=CN=MyGroup,OU=Groups,OU=Accounts,OU=All,DC=domain,DC=com))"
directorySearcher.PropertiesToLoad.Add("ou")
directorySearcher.PropertiesToLoad.Add("sn")
directorySearcher.PropertiesToLoad.Add("givenName")
directorySearcher.PropertiesToLoad.Add("sAMAccountName")
directorySearcher.PropertiesToLoad.Add("mail")
results = directorySearcher.FindAll
结果计数似乎与应用程序的每次执行都有所不同,我觉得很奇怪。我不确定这是否是一种让用户恢复的可靠方式,或者我是否需要修改我的搜索内容?
答案 0 :(得分:15)
如果可以,请升级到.NET 3.5并使用新改进的System.DirectoryServices.AccountManagement
命名空间。 Managing Directory Security Principals in the .NET Framework 3.5中可以找到这些新课程的精彩介绍。
有了这个,你的工作就变得微不足道了:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "MyGroup");
PrincipalSearchResult<Principal> members = group.GetMembers();
这对你有用吗?
如果您不能使用.NET 3.5,则应检查该组的member
属性。小组成员不在逻辑上作为子级存储在层次结构中的组下方,因此您无法使用DirectorySearcher
找到它们。
DirectoryEntry group = new DirectoryEntry("LDAP://CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com");
foreach(object groupMemberDN in group.Properties["member"])
{
// grab the group member's DN
}
请参阅MSDN库中的Quick List of C# Code Examples以获取Active Directory(或Visual Basic .NET的相同内容)以获取此代码段。
更新:如果您需要属于特定群组的用户(因为您要更新其属性或其他内容),您可以采取相反的方法:搜索所有具有memberOf
属性的用户,该属性等同于组的DN:
DirectoryEntry root = new DirectoryEntry("LDAP://dc=domain,dc=com");
DirectorySearcher searcher = new DirectorySearcher(root);
searcher.Filter = "(&(objectCategory=user)(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))";
// set other properties on the searcher
foreach(object result in searcher.FindAll())
{
// do whatever you need to do with the entry
}
答案 1 :(得分:2)
扩大搜索范围,无论会员身在何处:
Dim directoryEntry As New DirectoryEntry("LDAP://OU=All,DC=Domain,DC=com")
根据群组成员资格进行过滤:
directorySearcher.Filter = "(&(objectCategory=person)" & _
"(objectClass=user)" & _
"(memberOf=CN=MyGroup,OU=Groups,OU=All,DC=Domain,DC=com))"