Active Directory, извлекающая членов группы из группы, кажется, попала в бесконечный цикл - PullRequest
0 голосов
/ 21 мая 2019

У меня есть следующий код ниже.Каждый раз, когда вызывается directoryEntryGroupMembers.Properties["member"];, он возвращается с тем же списком.В результате цикл while застрял в бесконечном цикле.Я подозреваю, что есть проблема с тем, как группа настраивается в самой AD, в отличие от кода.Кто-нибудь знает, как решить эту проблему?

Примечание. Мне известны циклические вложенные группы в нашей AD, но это до сих пор не вызывало проблем.Итак, я не знаю, является ли вложение круговой группы проблемой.

string strDirectoryEntryPath = null;
const int intIncrement = 1500; // https://msdn.microsoft.com/en-us/library/windows/desktop/ms676302(v=vs.85).aspx
string strDsFilter = null;
string[] strDsProperties = null;
List<Guid> lstGroupMemberGuid = null;
DataTypeConverter objConverter = null;
DirectoryEntry directoryEntryGroupMembers = null;
SearchResultCollection searchResultCollection = null;
DirectorySearcher directorySearcher = null; 

objConverter = new DataTypeConverter();

lstGroupMemberGuid = new List<Guid>();

strDirectoryEntryPath = strActiveDirectoryHost + "/<GUID=" + strPropertyValue + ">";

directoryEntryGroupMembers = new DirectoryEntry(strDirectoryEntryPath, null, null, AuthenticationTypes.Secure);

while (true)
{
    intCountIteration = intCountIteration + 1;

    var varGroupMemberDns = directoryEntryGroupMembers.Properties["member"];

    foreach(string strMemberDn in varGroupMemberDns)
    {
        if (dctObjectGuidDn.TryGetValue(strMemberDn, out Guid gidMemberGuid))
        {
            lstGroupMemberGuid.Add(gidMemberGuid);
        }
    }

    if (varGroupMemberDns.Count < intIncrement)
    {
        break;
    }

    directoryEntryGroupMembers.RefreshCache(new[] { string.Format("member;range={0}-*", lstGroupMemberGuid.Count) });
}

1 Ответ

1 голос
/ 21 мая 2019

Проблема в том, что varGroupMemberDns.Count не уменьшается и не должно уменьшаться.Я полагаю, что вам может понадобиться записать счет ДО цикла, а затем уменьшать его с каждой итерацией.

var recordCount = varGroupMemberDns.Count;
while (true)
{
recordCount--;
...
  if (recordCount < intIncrement)
  {

  }
  ...
}
...