【问题标题】:DirectorySearcher Class Out of Range ExceptionDirectorySearcher 类超出范围异常
【发布时间】:2018-12-03 16:02:57
【问题描述】:

当我对 BitLocker 恢复密钥执行目录搜索时,我似乎无法返回任何有意义的搜索结果。

DirectoryEntry entry = new DirectoryEntry("LDAP://OU=MYOU,DC=MYDC", adminUsername,
            adminPassword);
        entry.Username = AdminInformation.AdminUsername;
        entry.Password = AdminInformation.AdminPassword;

        DirectorySearcher search = new DirectorySearcher(entry);
        search.PropertiesToLoad.Add("msFVE-RecoveryPassword");
        search.Filter = $"(&(cn={chosenComputer}))";

        foreach (SearchResult res in result)
        {
            textBoxBitLockerKey.Text = (res.Properties["msFVE-RecoveryPassword"][0].ToString());
        }

基本上,我用包含 BitLocker 密钥的计算机填充了一个列表(我们的组织中只有使用 BitLocker 的笔记本电脑)。用户选择笔记本电脑后,应将关联的 BitLocker 密钥填充到他们可以复制或打印的文本框中,但每次我尝试从所选计算机中获取该密钥时,都会出现越界异常。我一直在使用 DirectorySearcher 来查找其他属性,例如用户帐户或计算机名称,但这给我带来了麻烦。我了解错误是什么,我只是不知道是什么原因造成的,而且我似乎找不到任何其他完全涵盖该主题的答案。任何意见表示赞赏。

这是一个例外: 指数超出范围。必须是非负数且小于集合的大小。参数名称:索引。

经过进一步调查,目录搜索器似乎只搜索封装了 msFVE-RecoveryInformation 属性的属性。如果我尝试根据所选计算机名称添加过滤器,它将不会提供具有实际值的 SearchResult 属性。例如,如果我尝试根据“cn”设置过滤器,它会返回 BitLocker 密钥的 GUID。

【问题讨论】:

  • 您是否(使用调试器)验证res.Properties 包含您期望的值? res.Properties["msFVE-RecoveryPassword"] 是否存在,如果存在,它的价值是什么?
  • 请,如果您提到异常,请包括完整的异常信息,尤其是在哪个源代码行抛出异常,以及它的调用堆栈。 @stijn 很可能是正确的,只是并非result 中的所有项目都具有该属性,因此属性索引器或[0] 索引器会抛出。
  • 正如@Stijin 指出的,您需要检查res.Properties["msFVE-RecoveryPassword"][0] != null
  • @Nilesh 如果数组不包含仍然会抛出“超出范围”异常的任何成员

标签: c# active-directory directorysearcher bitlocker


【解决方案1】:

每当我通过 LDAP 从 AD 查询非强制性属性(该属性不一定存在于 DirectorySearcher 找到的所有对象上)时,我都会使用以下模式:

const string propertykey = "msFVE-RecoveryPassword";
if (res.Properties.Contains(propertykey))
{
    string value = res.Properties[propertykey][0].ToString();
}

在单值属性上使用[0] 索引通常被认为是安全的;如果您正在处理多值属性(或使用枚举器),您可能需要添加对 Count > 0 的检查。

【讨论】:

  • -dlatikay 我确实检查了计数并得到 1 的搜索计数。我还检查以确保搜索结果不包含空值。它在使用您的检查后出现,它不会抛出该异常,但仍然没有任何价值。这是用于 DirectorySearcher 的有效属性吗?我所看到的所有地方都是我发现为 BitLocker 密钥加载的正确属性。
  • 是的,该属性存在,并且您根据文档拼写正确。 this thread 表明需要读取信息的权限,而普通域用户则不会。模拟具有足够权限的帐户。
  • 我正在使用我的域管理员凭据(此应用程序用于“登录”应用程序)。目录入口构造函数中使用的凭据不就是这样吗?
  • 正确。我不认为这是您编写的代码的问题。而是 LDAP 中一些未充分记录的行为。我建议尝试使用一些可视化的 LDAP 资源管理器应用程序,一旦你确定了哪些对象具有价值,哪些没有,就围绕你使用该工具发现的查询对你的 C# 版本进行建模。
  • 感谢您的帮助!我很高兴我们查到了真相。
猜你喜欢
  • 2014-11-12
  • 2014-03-06
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多