c#中使用DirectorySearcher的LDAP查询不返回任何东西

本文关键字:查询 返回 任何东 LDAP DirectorySearcher | 更新日期: 2023-09-27 18:15:56

我使用绑定到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名称中的特殊字符有关。

c#中使用DirectorySearcher的LDAP查询不返回任何东西

我假设OU的名称是)(*&^%'#@$!'#$%^,因为它出现在活动目录用户和计算机中。如果你打开属性编辑器,你会发现下面的disishedname属性值:OU=)(*&^%'''#@$!'''#$%^,OU=....(注意这里反斜杠的数量翻了一倍,并且增加了一个额外的反斜杠)。

基于此MSDN页面,(, ), *, '(以及其他)需要转义。

  • *变成'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=...