DirectorySearcher类超出范围异常

时间:2018-12-03 16:02:57

标签: c# active-directory directorysearcher bitlocker

在执行目录搜索中的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查找其他属性,例如用户帐户或计算机名称,但这给我带来了麻烦。我了解错误是什么,我只是不知道是什么导致了该错误,而且我似乎也找不到其他涵盖该主题的答案。任何输入表示赞赏。

以下是例外: 索引超出范围。必须为非负数并且小于集合的大小。参数名称:索引。

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

1 个答案:

答案 0 :(得分:1)

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

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

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