特定のADグループのActive Directoryからユーザーのリストを取得する
部門のすべてのユーザーを検索するコードがあります。
string Department = "Billing";
DirectorySearcher LdapSearcher = new DirectorySearcher();
LdapSearcher.PropertiesToLoad.Add("displayName");
LdapSearcher.PropertiesToLoad.Add("cn");
LdapSearcher.PropertiesToLoad.Add("department");
LdapSearcher.PropertiesToLoad.Add("title");
LdapSearcher.PropertiesToLoad.Add("memberOf");
LdapSearcher.Filter = string.Format("(&(objectClass=user)(department={0}))", Department);
SearchResultCollection src = LdapSearcher.FindAll();
「Manager Read Only」ADグループの全員だけが必要な場合、フィルターはどのように見える必要がありますか?
私はこれについてすべて間違っていますか?
あなたの検索を見て、私はあなたのためにいくつかのポイントを持っています。まず、検索では、objectCategory(インデックス付き)ではなく、objectClass(インデックスなし)を使用します。そのクエリの大きなパフォーマンスの問題。ほとんどの場合、取得しようとしているものに応じて、この2つを結合する必要があります。
(&(objectCategory=person)(objectClass=user)) = All users (no contacts)
(&(objectCategory=person)(objectClass=contact)) = All contacts (no users)
(&(objectCategory=person)) = All users and contacts
グループ内のユーザーを検索する場合と同様に、特定のグループのメンバーオブジェクトのリストを列挙できます。グループオブジェクトのメンバー属性には、各ユーザーの識別名があります。
この記事では、グループのメンバーの列挙について説明します...
LDAPクエリでこれを処理するデフォルトの方法がないため、親グループのネストされたグループを処理する必要がある場合があることを忘れないでください。そのために、メンバーオブジェクトがグループかどうかを評価し、その子グループのメンバー属性を取得する必要がある場合があります。
最後に、クエリにDNSプレフィックスを指定する習慣を身に付ける必要があります。
DNS接頭辞なし:
LDAP://ou=ouname,dc=domain,dc=com
DNSプレフィックス(3つすべてが機能):
LDAP://servername/ou=ouname,dc=domain,dc=com
LDAP://servername.domain.com/ou=ouname,dc=domain,dc=com
LDAP://domain.com/ou=ouname,dc=domain,dc=com
単一のドメインではそれほど問題は発生しませんが、複数のドメイン環境で検索を実行しようとすると、この追加を行わないと噛み付きます。これがあなたの目標に近づくのに役立つことを願っています。
私はいつも見つけました 方法:(ほとんど)C#を介したActive Directoryのすべて ADのほとんどの質問に役立ちます。
グループへのADパスが既にわかっている場合は、おそらくその上でDirectoryEntryを開く方が簡単でしょう。そこからDirectorySearcherを実行します。
using (DirectoryEntry de = new DirectoryEntry("LDAP://somedomain/CN=FooBar"))
{
DirectorySearcher search = new DirectorySearcher(de, ("(objectClass=user)"));
}
サブコンテナにドリルダウンするかどうかのサーチャーのフラグもあり、手元にある名前を忘れてしまいました。
私は次のコードを使用します(- http://blogs.technet.com/b/brad_rutkowski/archive/2008/04/15/c-getting-members-of-a-group-the-easy-way- with-net-3-5-discussion-groups-nested-recursive-security-groups-etc.aspx )それは正常に動作します。
IList<string> getMembers(string domainName, string groupName)
{
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName);
if (grp == null) {
throw new ApplicationException("We did not find that group in that domain, perhaps the group resides in a different domain?");
}
IList<string> members = new List<String>();
foreach (Principal p in grp.GetMembers(true))
{
members.Add(p.Name); //You can add more attributes, samaccountname, UPN, DN, object type, etc...
}
grp.Dispose();
ctx.Dispose();
return members;
}
//Search for Group and list group members
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices.AccountManagement;
namespace ExportActiveDirectoryGroupsUsers
{
class Program
{
static void Main(string[] args)
{
if (args == null)
{
Console.WriteLine("args is null, useage: ExportActiveDirectoryGroupsUsers OutputPath"); // Check for null array
}
else
{
Console.Write("args length is ");
Console.WriteLine(args.Length); // Write array length
for (int i = 0; i < args.Length; i++) // Loop through array
{
string argument = args[i];
Console.Write("args index ");
Console.Write(i); // Write index
Console.Write(" is [");
Console.Write(argument); // Write string
Console.WriteLine("]");
}
try
{
using (var ServerContext = new PrincipalContext(ContextType.Domain, ServerAddress, Username, Password))
{
/// define a "query-by-example" principal - here, we search for a GroupPrincipal
GroupPrincipal qbeGroup = new GroupPrincipal(ServerContext, args[0]);
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);
// find all matches
foreach (var found in srch.FindAll())
{
GroupPrincipal foundGroup = found as GroupPrincipal;
if (foundGroup != null)
{
// iterate over members
foreach (Principal p in foundGroup.GetMembers())
{
Console.WriteLine("{0}|{1}", foundGroup.Name, p.DisplayName);
// do whatever you need to do to those members
}
}
}
}
//Console.WriteLine("end");
}
catch (Exception ex)
{
Console.WriteLine("Something wrong happened in the AD Query module: " + ex.ToString());
}
Console.ReadLine();
}
}
}
}