DirectorySearcher Class 超出范围异常

DirectorySearcher Class Out of Range Exception

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

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 查找其他属性,例如用户帐户或计算机名称,但这给我带来了麻烦。我知道错误是什么,我只是不知道是什么原因造成的,而且我似乎找不到任何其他完全涵盖该主题的答案。欢迎任何意见。

例外情况: 索引超出范围。必须为非负数且小于集合的大小。参数名称:index.

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

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

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

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