2017-08-30 12 views
1

J'utilise DirectorySearcher pour faire une requête LDAP dans Active Directory, mais je continue d'avoir un ArgumentException levé à cause d'un filtre invalide. Probablement à cause d'une mauvaise forme d'attribut accountExpires d'Active Directory. Je voudrais trouver tous les comptes expirés utilisant LDAP, mais comment puis-je convertir DateTime.Now au format accountExpires? C'est ce que j'ai fait et cela soulève une exception. si je prends les accountExpires attribut, il ne crée pas de problème:Filtre de recherche invalide dans Active Directory

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

Je ne sais pas vraiment comment convertir des dates au format accountExpires, et je crois que le problème vient d'un format de date erronée.

Des idées?

+1

"Je ne sais pas vraiment comment convertir des dates au format accountExpires": accountExpires est un temps de fichiers Windows: vous pouvez convertir en/de DateTime utilisant 'DateTime.ToFileTimeUtc' /' DateTime.FromFileTimeUtc' – Joe

+1

Est-ce que le compteExpires conditionne si seul le filtre doit avoir une date d'expiration? Si c'est le cas, cette condition fonctionne-t-elle? : ( '(! (| AccountExpires = 0x7FFFFFFFFFFFFFFF (accountExpires = 0)))' (Selon http://ldapwiki.com/wiki/AccountExpires) – Esteban

+0

@Esteban Cela fonctionne, mais il ne m'a pas tous les résultats J'ai besoin (seulement un sur 15). Mais pas d'exception –

Répondre

1

Votre filtre semble ne pas être compatible avec la syntaxe du filtre LDAP, la négation doit être placé à la condition, non pas comme une condition:

(objectClass!=contact) doit être écrit: (!(objectClass=contact))

Il n » Il me semble que la syntaxe des conditions accountExpires est incorrecte, vos conditions signifient que le compte a une date d'expiration définie et devrait être "syntaxiquement" valide.

Si ce que vous voulez atteindre est de filtrer les comptes qui n'ont une date d'expiration et que cette date ne « jamais », vous pouvez utiliser cette syntaxe: (selon ldapwiki.com/wiki/AccountExpires)

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

ou

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

+0

fonctionne avec la deuxième option merci! –

1

Cela doit être dû à une mauvaise façon de transmettre une chaîne, essayez de fermer les guillemets après chaque ligne.

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

Merci, mais je l'ai en fait tout sur une ligne, je viens de le faire par souci de clarté :) –

+1

Je le savais, il était un tir long.! –

+0

Pouvez-vous vérifier si la valeur de l'argument accountExpires est correcte? –