Поиск подгрупп Active Directory - PullRequest
       18

Поиск подгрупп Active Directory

1 голос
/ 12 сентября 2011

Мне нужна корневая группа AD, и мне нужно перечислить все ее подгруппы. У меня есть код, который подключается к серверу AD и пытается получить список подгрупп.

Вот код:

        private IEnumerable<SearchResult> GetSubGroups(string groupId)
        {
            using (var searcher = new DirectorySearcher(new DirectoryEntry(adServerName, adLogin, adPassword)))
            {

                searcher.Filter = string.Format("(&(objectClass=group)({0}))", groupId);
                //Get the Root Group
                var result = searcher.FindOne();
                object resultMembers = result.GetDirectoryEntry().Invoke("Members", null);

                foreach(var member in ((IEnumerable) resultMembers))
                {
                    var memberEntry = new DirectoryEntry(member);

                    var subgroupsSearcher = new DirectorySearcher(memberEntry);
                    subgroupsSearcher.Filter = "(objectClass=group)";
                    subgroupsSearcher.PropertiesToLoad.Add("samaccountname");
                    subgroupsSearcher.PropertiesToLoad.Add("name");

                    var foundSubGroupResult = subgroupsSearcher.FindOne();

                    ...
                }

                return new List<SearchResult> {result};
            }
    }

При перечислении результатов Invoke («Members», null) я создаю еще один DirectoryEntry для каждого результата. Проблема в том, что когда вызывается subgroupSearcher.FindOne(), он заканчивается DirectoryServicesCOMException.

Here's the exception stack trace:
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
at System.DirectoryServices.DirectorySearcher.FindOne()
...other methods...

Свойство «Сообщение об исключении» гласит: "An operations error occured" Я зарегистрировал код ошибки, это -2147016672

Я также попытался неявно инициализировать свойство UserName при создании объекта DirectoryEntry из объекта подгруппы:

foreach(var member in ((IEnumerable) resultMembers))
                    {
                        var memberEntry = new DirectoryEntry(member);
                        memberEntry.Username = adLogin;
                        var subgroupsSearcher = new DirectorySearcher(memberEntry)

                        ...
                    }

Но это дало тот же результат.

Что я делаю не так? Любая помощь заметна.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

Не уверен, почему вы звоните Invoke ("участники"). Вы бы хотели, чтобы DirectorySearcher вернул вам атрибут участника группы. Две вещи, с которыми вам нужно иметь дело:

0 голосов
/ 12 сентября 2011

Вот кусок кода.Это позволяет использовать рекурсивный фильтр, см. Синтаксис поискового фильтра , чтобы получить всех членов группы класса 'group' (то, что вы называете подгруппами)

static void Main(string[] args)
{
  /* Connection to Active Directory
   */
  string sFromWhere = "LDAP://WM2008R2ENT:389/dc=dom,dc=fr";
  DirectoryEntry deBase = new DirectoryEntry(sFromWhere, "dom\\jpb", "test.2011");

  /* To find all the groups 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 a AND Bit filter on userAccountControl
   */
  DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
  dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpSec,OU=MonOu,DC=dom,DC=fr)(objectClass=group))";
  dsLookFor.SearchScope = SearchScope.Subtree;
  dsLookFor.PropertiesToLoad.Add("cn");

  SearchResultCollection srcGroups = dsLookFor.FindAll();

  /* Just to write some result
   */
  foreach (SearchResult srcGroup in srcGroups)
  {
    Console.WriteLine("{0}", srcGroup.Path);
  }

  Console.ReadLine();
}
...