簡體   English   中英

查找用戶管理的所有組

[英]Finding all groups that a user manages

我們得到了一個特殊的多值屬性。 我們稱之為ourOwnManagedBy ,它可以包含管理當前組的用戶或組(他們的DN)。

如何檢索特定用戶管理的所有組的列表(在managedByourOwnManagedBy的幫助下)?

例如。 假設用戶是GlobalAdministrators組的成員,並且ApplicationAdministrators組具有GlobalAdministrations作為成員。 最后是ourOwnManagedBy組,它在ourOwnManagedBy屬性中有ApplicationAdministrators。

  • UserGlobalAdministrators成員
  • GlobalAdministratorsApplicationAdministrators成員
  • MyApplicationourOwnManagedBy獲得了ApplicationAdministrators

如何使用該信息查找特定用戶管理的所有組? 是否可以對自定義屬性(包含用戶和組的DN)進行某種遞歸檢查?

更新

我試過使用這樣的目錄搜索過濾器:

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

但我可能會誤解1.2.840.113556.1.4.1941作用? MSDN頁面

我擔心,只有一個LDAP查詢無法實現這一點。 您將不得不將其拆分為子查詢並單獨運行每個子查詢,如果有很多要迭代的話,這反過來會阻塞域控制器。

我嘗試按照我描述的方式進行操作,性能非常糟糕,至少使用.NET的可用模塊進行操作。

以下頁面說明3.1.1.3.4.4 LDAP匹配規則(extensibleMatch)表示您使用的LDAP_MATCHING_RULE_TRANSITIVE_EVAL在Windows 2008及更高版本中可以正常工作。 如果您使用的是2003,則可能無效。

沒有遞歸,不知道它將如何表現性能,可能有錯誤。

        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();
        }

我會誠實地說,這實際上並不適合我:)但我認為這是因為我們的域配置方式。 如果沒有其他可能它會推動你在正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM