【问题标题】:Active Directory retrieving group members on a group appears to be caught in an infinite loopActive Directory 检索组中的组成员似乎陷入无限循环
【发布时间】:2023-03-20 19:57:01
【问题描述】:

我在下面有以下代码。每次调用 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) });
}

【问题讨论】:

  • 为什么要增加if 比较中未使用的变量?
  • @devlincarnate 用于测试。我想看看同一个列表有多少次回来。
  • 那么intIncrement 是什么,它在哪里发生了变化?
  • @devlincarnate 我显然发布了太少的代码。我已经更新了我的帖子。 intIncrement 与 Active Directory 中的限制相关联。
  • 好的,所以它是一个静态变量,这意味着varGroupMemberDns.Count 应该改变。你有没有通过这个循环几次来验证它的价值确实下降了?

标签: c# while-loop active-directory infinite-loop


【解决方案1】:

问题是varGroupMemberDns.Count没有减少,也不应该减少。我相信您可能想要的是在循环之前捕获计数,然后在每次迭代时减少该计数。

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

  }
  ...
}

【讨论】:

  • 不需要循环增量。从逻辑上讲,循环以 1,500 个批次运行。如果当前批次的计数小于 1,500,则处理完成,无需刷新缓存。随着工作的完成,问题已经消失。因此,在 AD 中进行了更改,然后进行了更正。感谢您参与并尝试帮助 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多