c# - 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。
解决方案
每当我通过 LDAP 从 AD 查询非强制性属性(该属性不一定存在于 DirectorySearcher 找到的所有对象上)时,我都会使用以下模式:
const string propertykey = "msFVE-RecoveryPassword";
if (res.Properties.Contains(propertykey))
{
string value = res.Properties[propertykey][0].ToString();
}
[0]
在单值属性上使用索引通常被认为是安全的;如果您正在处理多值属性(或使用枚举器),您可能需要添加对 Count > 0 的检查。
推荐阅读
- javascript - 我想替换没有黄色铅笔的图标按钮
- java - 如何结合 Spring REST 和 WebSocket?
- sql-server - 从 SQL Server 进行 API 调用时获得空白响应
- javascript - 从按钮 Google 表格重新加载部署的 html 页面
- javascript - Preact 构建模板执行失败:错误:找不到 XMLHttpRequest 兼容库
- javascript - 为什么这个循环删除所有具有类名的元素只删除一半?
- python - 在 Django 上使用一个过滤器过滤多个 ajax 表
- python - 使用 Python 对面板数据进行随机森林
- java - 将 char[][] 转换为 char[]
- c++ - 函数可以是 const 也可以不是,取决于参数