C#中无法访问LDAP DirectoryEntry特定属性问题求助
解决LDAP中DirectoryEntry访问byte[]类型属性抛出COM异常的问题
核心解决方案
直接通过SearchResult获取属性P的原始byte[]值,跳过从DirectoryEntry读取该属性的步骤,直接将值写入目标对象B的DirectoryEntry。
具体步骤
从SearchResult提取属性P的byte[]值
既然SearchResult能正常获取属性P的byte[]数据,直接使用这个值,不要尝试通过A的DirectoryEntry去读取:// 假设已完成对象A的LDAP搜索,得到SearchResult实例 SearchResult aSearchResult = ldapSearcher.FindOne(); byte[] pRawValue = (byte[])aSearchResult.Properties["P"][0];获取目标对象B的DirectoryEntry
通过B的LDAP路径直接创建DirectoryEntry,或者搜索得到B的SearchResult后调用GetDirectoryEntry():// 替换为对象B的实际LDAP路径 DirectoryEntry bEntry = new DirectoryEntry("LDAP://cn=B,dc=yourdomain,dc=com"); bEntry.AuthenticationType = AuthenticationTypes.Secure;将值写入对象B的属性P
根据属性的实际存储规则选择写入方式:- 如果属性底层接受
byte[](与SearchResult返回类型一致):bEntry.Properties["P"].Clear(); bEntry.Properties["P"].Add(pRawValue); - 如果需要转换为字符串(匹配JXplorer的显示格式,比如UTF-8编码):
string pStringValue = Encoding.UTF8.GetString(pRawValue); bEntry.Properties["P"].Clear(); bEntry.Properties["P"].Add(pStringValue);
- 如果属性底层接受
提交修改
bEntry.CommitChanges(); bEntry.Close();
问题原因分析
抛出的0x8000500c COM异常,本质是DirectoryEntry尝试自动解析属性类型时与LDAP属性的实际语法不匹配:
- 属性P在LDAP schema中定义为
Octet String(字节数组类型),但DirectoryEntry默认会尝试将其解析为字符串类型,导致类型转换失败。 SearchResult不会自动解析属性类型,直接返回LDAP服务器返回的原始字节数据,因此能正常获取值。
额外注意事项
- 提前确认目标对象B的属性P支持写入的类型(可通过LDAP schema查看属性的语法定义)。
- 如果转换字符串后JXplorer显示异常,尝试更换编码格式(比如
Encoding.Unicode)。 - 操作LDAP对象时确保拥有足够的读写权限。
内容的提问来源于stack exchange,提问作者Elyasaf755
相关产品推荐
相关产品推荐

