2017-08-30 110 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參數值是否正確? –

相關問題