![]() |
AD + LastLogon & pwdLastSet - Hilfe!!!!
Hallo,
ich lese LastLogon & pwdLastSet aus Active Directory aus. Ich kann nur mit dem zurückgegeben Wert nichts anfangen bzw. diese Werte umwandeln. Ich habe die Forensuche schon bemüht und etwas gefunden aber ich werde nicht schlau daraus. Vielleicht kann mir einer etwas Gedankenunterstützung geben. Wäre sehr freundlich. Ich bekomme folgenden Wert zurück: $011C76DC Vielen Dank im voraus. |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Hallo Sven,
beide AD-Attribute (lastlogon und pwdlastset) sind 64-bit Wert, die du als FILETIME weiterverarbeiten kannst.
Delphi-Quellcode:
Getippt und nicht getestet.
function FileTimeToDateTime(ft: TFileTime): TDateTime;
var tzi: TTimeZoneInformation; lt, st: TSystemTime; begin GetTimeZoneInformation(tzi); FileTimeToSystemTime(ft, st); SystemTimeToTzSpecificLocalTime(@tzi, st, lt); Result := SystemTimeToDateTime(lt); end; Freundliche Grüße |
Re: AD + LastLogon & pwdLastSet
Irgendwie will es mir nicht gelingen.
Hier mein Code:
Delphi-Quellcode:
Ich habe schon versucht den Rückgabewert umzuwandeln mit VarTo... Aber leider keinen Erfolg gehabt. Für weitere Hilfestellungen wäre ich dankbar.
function FileTimeToDateTime(ft: TFileTime): TDateTime;
var tzi: TTimeZoneInformation; lt, st: TSystemTime; begin GetTimeZoneInformation(tzi); FileTimeToSystemTime(ft, st); SystemTimeToTzSpecificLocalTime(@tzi, st, lt); Result := SystemTimeToDateTime(lt); end; ... procedure Tfrm_main.GetADSInfo(suchbegriff : string); var rs,conn, com : Variant; strBase, strFilter, strAttributes, strADS : string; begin conn := CreateOleObject('ADODB.Connection'); com := CreateOleObject('ADODB.Command'); try conn.Provider := 'ADsDSOObject'; conn.open; com.ActiveConnection := conn; strBase := '<LDAP://test.com>'; if rb_name.Checked = TRUE then strFilter := '(&(objectCategory=person)(objectClass=user)(displayname='+suchbegriff+'))'; if rb_lanid.Checked = TRUE then strFilter := '(&(objectCategory=person)(objectClass=user)(sAMAccountName='+suchbegriff+'))'; strAttributes := 'givenname,sn,sAMAccountName,lastLogon,pwdLastSet,badPasswordTime,telephoneNumber'; strADS := strBase + ';' + strFilter + ';' + strAttributes + ';subtree'; Com.CommandText := strADS; Com.Properties['Page Size'] := 100000; Com.Properties['Searchscope'] := 2; Com.Properties['Cache Results'] := False; rs := Com.Execute; if Not rs.EOF then begin lbl_vorname.Caption := rs.Fields['givenname'].Value; lbl_nachname.Caption := rs.Fields['sn'].Value; lbl_lanid.Caption := UpperCase(rs.Fields['sAMAccountName'].Value); // hier knallt es: Inkompatible Typen: '_FILETIME' und 'Variant' lbl_passwordchange.Caption := DateTimeToStr(FileTimeToDateTime(rs.Fields['pwdLastSet'].Value)); end else MessageDlg('Kein Datensatz gefunden.',mtInformation,[mbOK],0); Rs := NULL; finally com := NULL; conn.Close; conn := NULL; end; end; ... Gruß, Sven |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Probiere es doch mal so:
Delphi-Quellcode:
var
ft: TFileTime; begin // ... Int64(ft) := rs.Fields['pwdLastSet'].Value; lbl_passwordchange.Caption := DateTimeToStr(FileTimeToDateTime(ft)); // ... end; |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
In deinem Titel hast du das Wort Hilfe benutzt. Ist das nicht klar, dass wenn du eine Frage stellst, dass du dann Hilfe benötigst. Auch die Ausrufezeichen signalisieren, dass falls du eine hast, die Batterien deiner Funktastatur wohl alle sind, und die deshalb Ausrufezeichen setzt^^. Nimms mit nicht über aber du musst doch zugeben, dass es nicht gerade übersichtlich ist, oder? Änder dies bitte!
Wenn du jetzt bsp. dein Passwort vergessen hast oder so, oder sagen wir mal dein Delphi startet nicht mehr, dann kann man dass ja so betonen und hervorheben oder so. |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Ich würde es ja ändern aber wie?
@marabu: danke schon mal im voraus. Ich kann es leider erst morgen testen. Ich lass euch wissen, wie das Ergebnis ist. Schönen Abend. |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Wie aber wie? Einfach bei dem Beitrag auf Edit klicken und dann den Titel ändern, wo ist das Problem?
|
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
@Larsi:
Zitat:
|
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Was Soll das eigentlich LARSI?
Schlechten Tag gehabt? |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Sei nachsichtig und schieb es seiner Jugend zu :zwinker:
|
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich habe soeben den Code von Marabu getestet. Aber es kommt immer noch ne Fehlermeldung. Siehe Screenshot. :gruebel:
Ich hoffe wir finden noch ne Lösung. Dann ist nämlich mein Programm fertig. War schön. Gruß, Sven P.S.: Das nächste Mal lasse ich das Hilfe weg, damit hier nicht so heftige Diskussionen auftreten :-) |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Wie sieht denn deine fehlerauslösende Zuweisung jetzt aus?
Welche variant variable enthält denn den IDispatch pointer? |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Mein Code sieht jetzt so aus:
Delphi-Quellcode:
Großes Fragenzeichen. Wenn ich das so umsetze, kommt die Fehlermeldung, die ich im Screenshot gezeigt habe.
procedure Tfrm_main.GetADSInfo(suchbegriff : string);
var rs,conn, com : Variant; strBase, strFilter, strAttributes, strADS : string; ft : TFileTime; begin conn := CreateOleObject('ADODB.Connection'); com := CreateOleObject('ADODB.Command'); try conn.Provider := 'ADsDSOObject'; conn.open; com.ActiveConnection := conn; strBase := '<LDAP://test.com>'; if rb_name.Checked = TRUE then strFilter := '(&(objectCategory=person)(objectClass=user)(displayname='+suchbegriff+'))'; if rb_lanid.Checked = TRUE then strFilter := '(&(objectCategory=person)(objectClass=user)(sAMAccountName='+suchbegriff+'))'; strAttributes := 'givenname,sn,sAMAccountName,lastLogon,pwdLastSet,badPasswordTime,telephoneNumber'; strADS := strBase + ';' + strFilter + ';' + strAttributes + ';subtree'; Com.CommandText := strADS; Com.Properties['Page Size'] := 100000; Com.Properties['Searchscope'] := 2; Com.Properties['Cache Results'] := False; rs := Com.Execute; if Not rs.EOF then begin lbl_vorname.Caption := rs.Fields['givenname'].Value; lbl_nachname.Caption := rs.Fields['sn'].Value; lbl_lanid.Caption := UpperCase(rs.Fields['sAMAccountName'].Value); // hier passt es immer noch nicht...warum?...keine Ahnung davon Int64(ft) := rs.Fields['pwdLastSet'].Value; lbl_passwordchange.Caption := DateTimeToStr(FileTimeToDateTime(ft)); end else MessageDlg('Kein Datensatz gefunden.',mtInformation,[mbOK],0); Rs := NULL; finally com := NULL; conn.Close; conn := NULL; end; end; |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
Hallo,
hat zwar ebend ein wenig bei mir gedauert (ca. 40 min), aber jetzt geht es. Folgende Vorbemerkung zu pwdLastSet: (Auszug aus der MSDN) Zitat:
Zitat:
Delphi-Quellcode:
gibt ein Interface vom Type IADsLargeInteger zurück.
...
rs.Fields['pwdLastSet'].Value ... Was ist zu tun? 1. ActiveDs_TLB in die uses-klausel aufnehmen (wegen IADsLargeInteger). 2. die Variablen pls : Variant und li : IADsLargeInteger; anlegen und 3. das ganze zur Zusammenarbeit bringen
Delphi-Quellcode:
Fertig. Nun klappt es auch mit dem Datum und der Uhrzeit.
...
pls := rs.Fields['pwdLastSet'].Value; li := IDispatch(pls) As IADsLargeInteger; ft.dwLowDateTime := Li.LowPart; ft.dwHighDateTime := li.HighPart; ... Viele Grüße und bis bald. |
Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
GENIAL.
Vielen vielen Dank euch. Vorallem gilt der Dank Alter Mann und marabu. Nun ist mein Programm fertig. DANKE NOCHMAL. Gruß, Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz