10

特別な多値属性を取得しました。ourOwnManagedBy現在のグループを管理するユーザーまたはグループ (その DN) を含めることができるものと呼びましょう。

特定のユーザーが管理するすべてのグループのリストを取得するにはどうすればよいですか (managedByおよび を使用ourOwnManagedBy)?

例えば。ユーザーがグループ GlobalAdministrators のメンバーであり、グループ ApplicationAdministrators のメンバーとして GlobalAdministrations があるとします。ourOwnManagedBy最後に、属性に ApplicationAdministrators を持つグループ MyApplicationです。

  • UserのメンバーですGlobalAdministrators
  • GlobalAdministratorsのメンバーですApplicationAdministrators
  • MyApplication入っApplicationAdministratorsourOwnManagedBy

その情報を使用して、特定のユーザーが管理するすべてのグループを見つけるにはどうすればよいですか? カスタム属性 (ユーザーとグループの DN を含む) である種の再帰チェックを行うことは可能ですか?

アップデート

次のようなディレクトリ検索フィルターを使用しようとしました。

string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn);

しかし、私は何を誤解しているかもしれ1.2.840.113556.1.4.1941ませんか? ( MSDN ページ)

4

3 に答える 3

1

残念ながら、これは 1 つの LDAP クエリだけでは実現できません。それをサブクエリに分割し、それぞれを個別に実行する必要があります。これにより、反復するものがたくさんある場合、ドメイン コントローラーがチョークします。

説明した方法で実行しようとしましたが、少なくとも .NET 用の利用可能なモジュールを使用して実行すると、パフォーマンスは最悪でした。

于 2012-08-28T12:45:54.897 に答える
0

再帰がなく、パフォーマンスがどのように機能するかがわからず、バグがある可能性があります。

        string user = "username";
        //get domain
        DirectoryEntry de = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry();
        //get users dn first
        string userDN;
        using (var searcher = new DirectorySearcher(de))
        {
            searcher.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", user);
            searcher.PropertiesToLoad.Add("distinguishedName");
            userDN = searcher.FindOne().Properties["distinguishedName"][0].ToString();
        }

        //get list of all users groups
        List<string> groups;
        //see http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp
        using (var searcher2 = new DirectorySearcher(de))
        {
            searcher2.Filter = String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN);
            searcher2.SearchScope = SearchScope.Subtree;
            searcher2.PropertiesToLoad.Add("distinguishedName");

            SearchResultCollection src = searcher2.FindAll();

            groups = (from SearchResult c in src
                      select c.Properties["distinguishedName"][0].ToString()).ToList();
        }

        //build giant search query
        SearchResultCollection srcGroups;
        using (var searcher = new DirectorySearcher(de))
        {
            string baseString = "(|{0})";
            string managedbybase = "(managedBy={0})";
            //I've read that you can search multivalued lists using a standard ='s.
            string ourOwnManagedByBase = "(ourOwnManagedBy={0})";

            StringBuilder sb = new StringBuilder();

            //add user DN to list of group dn's
            groups.Add(userDN);

            foreach (string g in groups)
            {
                sb.AppendFormat(managedbybase, g);
                sb.AppendFormat(ourOwnManagedByBase, g);
            }

            searcher.Filter = string.Format(baseString, sb.ToString());
            srcGroups = searcher.FindAll();
        }

正直に言うと、これは実際にはうまくいきません :) しかし、ドメインの構成方法が原因だと思います。他に何もなければ、それはあなたを正しい方向に押しやるでしょう。

于 2012-08-30T16:51:00.167 に答える
0

次のページには、3.1.1.3.4.4 LDAP マッチング ルール (extensibleMatch)が記載されており、使用している LDAP_MATCHING_RULE_TRANSITIVE_EVAL が Windows 2008 以降のエディションで機能することが示されています。2003 を使用している場合、動作しない可能性があります。

于 2012-08-27T22:11:04.480 に答える