2016-06-05 24 views
1

Das Problem:Abfragen von LDAP nach Datum

Bestimmte LDAP Datumsfelder, wie createTimestamp oder pwdChangedTime, werden in einem "generalized datetime format" gehalten:

{"createTimestamp": "20100226142156Z"} 

die sowohl Datum und Uhrzeit Komponenten im Inneren enthält.

Die Frage:

Was ist der üblicher Weg, LDAP Aufzeichnungen von einem bestimmten Datum abgefragt werden?

Beispiel Anwendungsfall: Erhalten Sie alle Benutzer gestern erstellt.

Antwort

2

Zunächst einmal brauchen wir eine wiederverwendbare Funktion von Datetime zu einem generalisierten Zeitformat konvertieren:

def convert_datetime_to_generalized_time(dt): 
    """Convert datetime object to generalized time format.""" 
    dt = dt.timetuple() 
    gtime = str(dt.tm_year) + ''.join('0' * (2 - len(str(item))) + str(item) 
             for item in (dt.tm_mon, dt.tm_mday, dt.tm_hour, dt.tm_min, dt.tm_sec)) 
    return gtime + 'Z' 

Nun gibt keine direkte Möglichkeit ist das Datum Komponente eines verallgemeinerten Zeitstempels zu filtern. Die Idee wäre, um das Datum zu fragen zu sein:

  • größer oder gleich als Datum mit einem 0.00.00 Zeit Teil
  • weniger als oder gleich Datum mit einem 23.59.59 Zeitteil

Umsetzung:

import datetime 

def get_ldap_date_range_query(dt): 
    start_date = dt.replace(hour=0, minute=0, second=0) 
    end_date = dt.replace(hour=23, minute=59, second=59) 

    return "(&(createTimestamp>=%s)(createTimestamp<=%s))" % (convert_datetime_to_generalized_time(start_date), 
                   convert_datetime_to_generalized_time(end_date)) 

print(get_ldap_date_range_query(datetime.datetime.now() - datetime.timedelta(days=1))) 

Dies würde eine LDAP-Abfrage drucken, die alle Benutzer gestern erstellt würde passen:

(&(createTimestamp>=20160604000000Z)(createTimestamp<=20160604235959Z)) 

Hoffe, dass würde jemand in der Zukunft helfen.