2017-08-30 111 views
1

我正在使用DirectorySearcher在Active Directory中发出LDAP请求,但由于筛选器无效,我一直在抛出ArgumentException。很可能是因为Active Directory中的accountExpires属性的错误形式。我想使用LDAP查找所有过期的帐户,但是如何将DateTime.Now转换为accountExpires格式?这是我所做的,它引发了一个例外。如果我拿出accountExpires属性,它不会产生任何问题:无效搜索在Active Directory中筛选

search.Filter = "(&(objectCategory=person)"+ 
        "(!(objectClass=contact))"+ 
        "(accountExpires>0)"+ 
        "(accountExpires<=129383640000000000)"+ 
        ")"; 

我真的不知道该怎么日期转换为accountExpires格式,我相信来自一个错误的日期格式的问题。

任何想法?

+1

“我真的不知道该怎么日期转换为accountExpires格式”:accountExpires是一个Windows文件时间:你可以转换到/自日期时间使用'DateTime.ToFileTimeUtc' /'DateTime.FromFileTimeUtc' – Joe

+1

'accountExpires'条件是否仅过滤具有展期日期的帐户?如果是,这种情况是否有效? : '(!(|(accountExpires = 0x7FFFFFFFFFFFFFFF)(accountExpires = 0)))'(根据http://ldapwiki.com/wiki/AccountExpires) – Esteban

+0

@Esteban这有效,但它并没有给我所有的结果我需要(15个中只有一个)。但没有例外 –

回答

1

您的筛选似乎与LDAP过滤器语法不兼容,否定应放在条件,而不是作为一个条件:

(objectClass!=contact)应该写成:(!(objectClass=contact))

一点也没有”在我看来,accountExpires条件的语法是错误的,您的条件意味着该帐户有一个到期日期设置,应该是“语法上”有效。

如果你想达到什么是滤除其中确实有到期日,此日期不是“永远”的帐户,你可以使用这个语法: (根据ldapwiki.com/wiki/AccountExpires)

(!(|(accountExpires=0x7FFFFFFFFFFFFFFF)(accountExpires=0)))

(!(|(accountExpires=9223372036854775807)(accountExpires=0)))

+0

属性的作品与第二个选项谢谢! –

1

这必须是因为传递字符串的方式不正确,请尝试在每行之后关闭双引号。

search.Filter = "(&(objectCategory=person)"+ 
         "(objectClass!=contact)"+ 
         "(accountExpires>0)"+ 
         "(accountExpires<=129383640000000000)"+ 
         ")"; 
+0

谢谢,但我实际上已经在一条线上,我只是为了清晰:) :) –

+1

我知道它,它是一个远投。 –

+0

你可以检查accountExpires参数值是否正确? –

相关问题