首页 > 解决方案 > DirectorySearcher 类超出范围异常

问题描述

当我对 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。

标签: c#active-directorydirectorysearcherbitlocker

解决方案


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

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

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


推荐阅读