- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个有效的解决方案,但我很确定有一种资源密集度较低的方法,因为当前的解决方案涉及执行查询以获取组成员,然后进行查询以获取每个用户的信息。
这是我的代码:
DirectoryEntry root = new DirectoryEntry( "LDAP://server:port" );
DirectorySearcher searcher = new DirectorySearcher( root );
searcher.Filter = "(&(ObjectClass=Group)(CN=foo-group))";
var members = (IEnumerable)searcher.FindOne()
.GetDirectoryEntry()
.Invoke( "members" );
Dictionary<string , string> results = new Dictionary<string , string>();
foreach( object member in members ) {
DirectoryEntry de = new DirectoryEntry( member );
results.Add( de.Properties[ "SAMAccountname" ][ 0 ].ToString(), de.Properties[ "cn" ][ 0 ].ToString() );
}
理想情况下,我希望能够执行单个查询来获取组中的每个用户,过滤要加载的属性,然后显示它们。所以像这样
DirectoryEntry root = new DirectoryEntry( "LDAP://server:port" );
DirectorySearcher searcher = new DirectorySearcher( root );
searcher.PropertiesToLoad.Add( "cn" );
searcher.PropertiesToLoad.Add( "SAMAccountname" );
searcher.Filter = "(&(ObjectClass=user)(memberof=foo-group))";
foreach( var user in searcher.FindAll() ) {
//do whatever...
}
不幸的是,由于某种原因,这不起作用。
最佳答案
如果可以使用 System.DirectoryServices.AccountManagement
:
var context = new PrincipalContext(ContextType.Domain, "YOUR_DOMAIN_NAME");
using (var searcher = new PrincipalSearcher())
{
var groupName = "YourGroup";
var sp = new GroupPrincipal(context, groupName);
searcher.QueryFilter = sp;
var group = searcher.FindOne() as GroupPrincipal;
if (group == null)
Console.WriteLine("Invalid Group Name: {0}", groupName);
foreach (var f in group.GetMembers())
{
var principal = f as UserPrincipal;
if (principal == null || string.IsNullOrEmpty(principal.Name))
continue;
Console.WriteLine("{0}", principal.Name);
}
}
我有一些 VB 代码也可以用旧方法来完成,但是使用 AccountManagement 肯定更简单。
这是我所指的 VB 代码(同样它不是很漂亮但很实用):
Public Function GetUsersByGroup(de As DirectoryEntry, groupName As String) As IEnumerable(Of DirectoryEntry)
Dim userList As New List(Of DirectoryEntry)
Dim group As DirectoryEntry = GetGroup(de, groupName)
If group Is Nothing Then Return Nothing
For Each user In GetUsers(de)
If IsUserInGroup(user, group) Then
userList.Add(user)
End If
Next
Return userList
End Function
Public Function GetGroup(de As DirectoryEntry, groupName As String) As DirectoryEntry
Dim deSearch As New DirectorySearcher(de)
deSearch.Filter = "(&(objectClass=group)(SAMAccountName=" & groupName & "))"
Dim result As SearchResult = deSearch.FindOne()
If result Is Nothing Then
Return Nothing
End If
Return result.GetDirectoryEntry()
End Function
Public Function GetUsers(de As DirectoryEntry) As IEnumerable(Of DirectoryEntry)
Dim deSearch As New DirectorySearcher(de)
Dim userList As New List(Of DirectoryEntry)
deSearch.Filter = "(&(objectClass=person))"
For Each user In deSearch.FindAll()
userList.Add(user.GetDirectoryEntry())
Next
Return userList
End Function
Public Function IsUserInGroup(user As DirectoryEntry, group As DirectoryEntry) As Boolean
Dim memberValues = user.Properties("memberOf")
If memberValues Is Nothing OrElse memberValues.Count = 0 Then Return False
For Each g In memberValues.Value
If g = group.Properties("distinguishedName").Value.ToString() Then
Return True
End If
Next
Return False
End Function
和用法:
Dim entries = New DirectoryEntry("LDAP://...")
Dim userList As IEnumerable(Of DirectoryEntry) = GetUsersByGroup(entries, "GroupName")
关于c# - 获取 'memberof' 为一组的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603777/
我很困惑 member和 memberOf属性。 假设我有一个名为“ABX”的组,该组具有以下属性值: 成员(member):cn="foo", OU="Groups" 成员:cn="test", O
在我的库中,我使用仅在一处定义的相同方法query 来扩展类型Database 和Transaction。 如果我尝试使用@memberof Database和@memberof Transactio
我们有一个 LDAP,其中包含许多遵循此模式的组: Acme-MyApp-ABC-Admin Acme-MyApp-ABC-Bottlewasher Acme-MyApp-ABC-Cook Acme-
我目前正尝试在 C++ 中执行 LDAP 查询以获取给定用户的 memberOf 属性。我编写了一个函数,如果它们仅在一组中,则可以成功获取该属性。问题是,当他们在多个组中时,它只返回第一个。当我在
我有一个有效的解决方案,但我很确定有一种资源密集度较低的方法,因为当前的解决方案涉及执行查询以获取组成员,然后进行查询以获取每个用户的信息。 这是我的代码: DirectoryEntry root =
我正在阅读 Drools 6.4.0 documentation .我不确定是否理解 contains 和 memberof 运算符之间的区别:两者都适用于集合,似乎唯一的区别是 contains 期
我正在尝试在 Apache 目录中模拟 Active Directory 的 memberOf 属性。我已将 memberOf 的以下条目添加到我的 LDIF 文件中: dn: m-oid=1.3.6
我只需要用户所属组的 commonName。 DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser...."); foreach(str
我是 Powershell 的新手,在使用 Get-ADUser 和 GetADComputer cmdlet 时遇到问题。 我正在尝试使用 Get-ADComputer 和 Get-ADUser 从
我想要创建一个动态 MS365 组,我只想应用以下动态规则 user.memberof -any (group.objectId -in ['objectID1','objectID2']) 当经过d
我想要创建一个动态 MS365 组,我只想应用以下动态规则 user.memberof -any (group.objectId -in ['objectID1','objectID2']) 当经过d
我实际上正在构建一个使用 Spring 处理 LDAP 的应用程序 ( http://projects.spring.io/spring-ldap/ ) 我在尝试修改 memberOf 属性时遇到一些
我正在尝试访问用户是使用 Microsoft Graph API 的成员的组。我遇到了一个问题,因为我认为我的权限设置正确,但是,当我登录应用程序时,我收到消息: AADSTS90093: Calli
我目前正在发现 eclipse 中的 javascript 支持。我感到惊讶/困惑的事情之一是大纲管理。 我在网上读到(当然理解“stackoverflow”;))我应该在方法上添加 @membero
这个问题连续第二天让我抓狂。所以,问题是:我正在尝试将“memberOf”属性用于“组织”,而谷歌结构化数据工具显示存在错误: Error: Page contains property "membe
我的 dynlist/dyngroup 和 memberof 覆盖都在 openldap 中正常工作,但我无法让 memberof 显示通过 dyngroup 覆盖添加用户的组。 有谁知道如何让它工作
我已经尝试了 2 天不让 openldap 的 memberof overlay 工作并给出一些实际结果。我的数据库配置: database bdb suffix "dc=exampl
我使用的 AD 设置具有存储为(多个)安全组成员的用户。 我正在使用读取用户的 memberof 属性的软件来计算访问权限。 在 AD Explorer 中,我可以看到用户的 memberof 属性显
我想找到属于某个 OU 中某个组的所有用户,因此我的过滤器看起来像这样: (&(objectClass=user)(memberOf=*OU=something,OU=yep,DC=dev,DC=lo
我应该指出我正在使用 VSCode 作为我的 IDE 问题 如何记录一个 @typedef 使其成为 @namespace 的成员? (我对 @module 或其他 JSDoc 标签持开放态度来实现这
我是一名优秀的程序员,十分优秀!