我得到了一个可行的解决方案,但是我非常肯定有一个资源密集度较低的方法,因为当前的解决方案涉及到执行查询以获取组成员,然后执行查询以获取每个用户的信息。
下面是我的代码:
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...
}
不幸的是,出于某种原因,这并不奏效。
4条答案
按热度按时间t1rydlwq1#
如果可以使用
System.DirectoryServices.AccountManagement
:我有一些VB代码,也可以用旧的方法来做,但这肯定是更简单的帐户管理。
下面是我提到的VB代码(同样,它不漂亮,但它的功能):
和用法:
izj3ouym2#
我最初使用的方法与您发布的方法非常相似,运行整个公司的AD并获得结果大约需要12分钟。切换到这种方法后,大约需要2分钟。您需要使用我编写ldapserver的ldapserver地址以及用户ID和密码,用户名是您要查找的人的SAMAccountName。
zxlwwiss3#
如果选中HERE,则可以执行以下操作:
pw9qyyiw4#
使用
GroupPrincipal
方法FindByIdentity
会更短,它还提供了多种方法来识别IdentityType
组: