【问题标题】:LDAP with objectCategory query problemLDAP 与 objectCategory 查询问题
【发布时间】:2011-02-15 23:33:42
【问题描述】:
我想创建 LDAP 查询以按名称、位置和型号过滤打印机
deSearch.Filter = String.Format("(&(&(&(&(objectCategory=printQueue)(printername={0}))(location={1}))(driverName={2})))", queueName, location, modelNumber);
我创建了这个,但它没有正确运行
- 第一个问题是按所有搜索条件一起搜索
- 如果条件之一为空或null,我将其设置为*以获得所有结果。是否正确?
欢迎所有想法
【问题讨论】:
标签:
c#
active-directory
ldap
directoryservices
【解决方案1】:
您只需要一个 & 运算符。它们是 LDAP 过滤器表达式中的 n 元而非二进制运算符:
(&(objectCategory=printQueue)(printername={0})(location={1})(driverName={2}))
(RFC 2254 将 &(或 |) 后面的内容定义为 SET OF 过滤器,而不是两个过滤器。这是我能看出他们为什么选择那种可怕的前缀表示法的唯一充分理由。)
我个人也会在这样的查询中提供“printQueue”作为参数。
'*' 将匹配任何属性值,但它要求该属性实际存在,即 objectClass 具有这样的属性。
【解决方案2】:
根据 EJP 的回复,我在这里创建了代码
StringBuilder filter=new StringBuilder("(&(objectClass=printQueue)");
if (!string.IsNullOrEmpty(queueName))
filter.Append("(printerName=*"+queueName+"*)") ;
if (!string.IsNullOrEmpty(location))
filter.Append("(location=*" + location + "*)");
if (!string.IsNullOrEmpty(modelNumber))
filter.Append("(driverName=*" + modelNumber + "*)");
filter.Append(")");
deSearch.Filter = filter.ToString();