C# DirectorySearcher类超出范围异常

C# DirectorySearcher类超出范围异常,c#,active-directory,directorysearcher,bitlocker,C#,Active Directory,Directorysearcher,Bitlocker,在对BitLocker恢复密钥执行目录搜索时,我似乎无法返回任何有意义的搜索结果 DirectoryEntry entry = new DirectoryEntry("LDAP://OU=MYOU,DC=MYDC", adminUsername, adminPassword); entry.Username = AdminInformation.AdminUsername; entry.Password = AdminInformation

在对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。

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

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

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

是否已验证(使用调试器)res.Properties是否包含所需的值?
res.Properties[“msFVE RecoveryPassword”]
是否存在,如果存在,它的值是什么?如果您提到异常,请包括完整的异常信息,特别是抛出它的源代码行及其调用堆栈。很可能@stijn是正确的,只是不是
result
中的所有项都具有该属性,因此属性索引器或
[0]
索引器将抛出。正如@Stijin指出的,您需要检查
res.properties[“msFVE RecoveryPassword”][0]!=null
@Nilesh如果数组不包含仍将抛出“超出范围”异常dlatikay的任何成员,则我确实检查了计数,并且在搜索中得到了计数1。我还检查了以确保searchresult不包含空值。它在使用您的检查后出现,它不会引发该异常,但仍然没有值。这是用于DirectorySearcher的有效属性吗?在我查找的所有地方,我都发现这是BitLocker密钥要加载的正确属性。是的,该属性存在,并且您根据文档正确拼写了它。表示需要有读取信息的权限,而普通域用户则没有。模拟具有足够权限的帐户。我正在使用我的域管理员凭据(此应用程序的凭据用于“登录”应用程序)。这不是directoryentry构造函数中使用的凭据的用途吗?对。我不认为这是您编写的代码的问题。而不是LDAP中一些文档不足的行为。我建议尝试使用一些可视化LDAP explorer应用程序进行试验,一旦您确定哪些对象有价值,哪些没有价值,请围绕使用该工具发现的查询对您的C#版本进行建模。感谢您的帮助!我很高兴我们查到了真相。