web-dev-qa-db-ja.com

特定の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グループの全員だけが必要な場合、フィルターはどのように見える必要がありますか?

私はこれについてすべて間違っていますか?

19
wcm

あなたの検索を見て、私はあなたのためにいくつかのポイントを持っています。まず、検索では、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

単一のドメインではそれほど問題は発生しませんが、複数のドメイン環境で検索を実行しようとすると、この追加を行わないと噛み付きます。これがあなたの目標に近づくのに役立つことを願っています。

34
Dscoduc

私はいつも見つけました 方法:(ほとんど)C#を介したActive Directoryのすべて ADのほとんどの質問に役立ちます。

11
nzpcmad

グループへのADパスが既にわかっている場合は、おそらくその上でDirectoryEntryを開く方が簡単でしょう。そこからDirectorySearcherを実行します。

using (DirectoryEntry de = new DirectoryEntry("LDAP://somedomain/CN=FooBar"))
{
   DirectorySearcher search = new DirectorySearcher(de, ("(objectClass=user)"));
}

サブコンテナにドリルダウンするかどうかのサーチャーのフラグもあり、手元にある名前を忘れてしまいました。

6
Rob McCready

私は次のコードを使用します(- 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;
    }
3
Petr
    //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();
            }
        }
    }
}
0