特定のADグループ内のすべてのメンバー/ユーザーのリストを取得し、ユーザーが有効(または無効)かどうかを判断する最速の方法は何ですか?
私たちは潜在的に2万人のユーザーについて話しているので、個々のユーザーごとにADにアクセスすることは避けたいと思います。
.NET 3.5以降を使用している場合は、System.DirectoryServices.AccountManagement
(S.DS.AM)名前空間。ここですべてを読んでください:
基本的に、ドメインコンテキストを定義し、ADのユーザーやグループを簡単に見つけることができます。
// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// find the group in question
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");
// if found....
if (group != null)
{
// iterate over members
foreach (Principal p in group.GetMembers())
{
Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
// do whatever you need to do to those members
UserPrincipal theUser = p as UserPrincipal;
if(theUser != null)
{
if(theUser.IsAccountLockedOut())
{
...
}
else
{
...
}
}
}
}
新しいS.DS.AMを使用すると、ADのユーザーとグループを簡単に操作できます。
次のコードを試してください。 検索フィルター構文 を使用して、1つのLDAPクエリで必要なものを再帰的に取得します。興味深いのは、クエリがサーバーで実行されることです。 @marc_sソリューションよりも高速かどうかはわかりませんが、存在し、フレームワーク.NET 2.0(W2K3 SP2以降)で動作します。
string sFromWhere = "LDAP://WM2008R2ENT:389/dc=dom,dc=fr";
DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom\\jpb", "test.2011");
/* To find all the users member of groups "Grp1" :
* Set the base to the groups container DN; for example root DN (dc=societe,dc=fr)
* Set the scope to subtree
* Use the following filter :
* (member:1.2.840.113556.1.4.1941:=CN=Grp1,OU=MonOu,DC=X)
* coupled with LDAP_MATCHING_RULE_BIT_AND on userAccountControl with ACCOUNTDISABLE
*/
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpSec,OU=MonOu,DC=dom,DC=fr)(userAccountControl:1.2.840.113556.1.4.803:=2))";
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");
SearchResultCollection srcUsers = dsLookFor.FindAll();
/* Just to know if user is present in an other group
*/
foreach (SearchResult srcUser in srcUsers)
{
Console.WriteLine("{0}", srcUser.Path);
}