【问题标题】:LDAP Query in c# using DirectorySearcher does not return anythingc# 中使用 DirectorySearcher 的 LDAP 查询不返回任何内容
【发布时间】:2015-10-05 08:33:38
【问题描述】:

我使用绑定到 AD 根目录的 DirectorySearcher 运行以下 LDAP 查询:

(&(|(objectClass=container)(objectClass=organizationalUnit))(!(distinguishedName=OU=)(*&^%\\\#@$!\\\#$%^,OU=xyxy.yxyx,OU=yyyy,OU=tttt,DC=base,DC=local)))

但是,它不返回任何 OU。当我使用下面的其他 OU 运行相同的查询时,我会在 AD 中获得所有其他 OU:

(&(|(objectClass=container)(objectClass=organizationalUnit))(!(distinguishedName=OU=SOMEOU,OU=xyxy.yxyx,OU=yyyy,OU=tttt,DC=base,DC=local)))

基本上,我正在尝试对排除某些特定 OU 的所有 OU 运行查询。我猜这与 OU 名称中的特殊字符有关。

【问题讨论】:

  • 您要排除的 OU 的名称是什么? *&^%\\\#@$!\\\#$%^,OU=xyxy.yxyx,OU=yyyy,OU=tttt,DC=base,DC=local?
  • 我正在使用的 OU 的名称是:)(*&^%\#@$!\#$%^and that is under OU tttt which is under OU yyyy and the whole thing is under域 base.local。

标签: c# active-directory ldap


【解决方案1】:

我假设 OU 的名称是 )(*&^%\#@$!\#$%^,因为它出现在 Active Directory 用户和计算机中。如果您打开属性编辑器,您会发现以下的 distinctName 属性值:OU=)(*&^%\\\#@$!\\\#$%^,OU=....(注意这里反斜杠的数量增加了一倍,并添加了一个额外的反斜杠)。

基于此MSDN page()*\(和其他)需要转义。

  • * 变为 \2a

  • ( 变为 \28

  • ) 变为 \29

  • \ 变为 \5c

因此,您在 LDAP 过滤器中的 OU 名称应变为 OU=\29\28\2a&^%\5c\5c\5c#@$!\5c\5c\5c#$%^,OU=....

请注意,您需要在此处转义 \ 字符或在 C# 中使用 @ 来创建这样的逐字字符串:

string dn = @"OU=\29\28\2a&^%\5c\5c\5c#@$!\5c\5c\5c#$%^,OU=...

【讨论】:

  • 正如我在问题的评论中提到的,它出现在 Active Directory 下的 OU 名称是 )(*&^%\#@$!\#$%^ 在属性编辑器下看到这个: )(*&^%\\\#@$!\\\#$%^ (对不起,我不知道如何在评论中开始新的一行)。
  • 是的,你是对的。查询前进的方式是错误的。但我希望查询失败并且我的 DirectorySearcher 会抛出异常。相反,它返回了一个空结果。
猜你喜欢
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2021-04-24
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多