Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi AD + LastLogon & pwdLastSet - Hilfe!!!! (https://www.delphipraxis.net/110966-ad-lastlogon-pwdlastset-hilfe.html)

Piro 27. Mär 2008 12:49


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.

marabu 27. Mär 2008 14:28

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:
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;
Getippt und nicht getestet.

Freundliche Grüße

Piro 28. Mär 2008 07:37

Re: AD + LastLogon & pwdLastSet
 
Irgendwie will es mir nicht gelingen.

Hier mein Code:
Delphi-Quellcode:
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;
...
Ich habe schon versucht den Rückgabewert umzuwandeln mit VarTo... Aber leider keinen Erfolg gehabt. Für weitere Hilfestellungen wäre ich dankbar.

Gruß, Sven

marabu 28. Mär 2008 16:14

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;

Larsi 28. Mär 2008 16:46

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.

Piro 28. Mär 2008 18:39

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.

Larsi 28. Mär 2008 19:15

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
Wie aber wie? Einfach bei dem Beitrag auf Edit klicken und dann den Titel ändern, wo ist das Problem?

DeddyH 28. Mär 2008 19:17

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
@Larsi:
Zitat:

Du kannst einen Beitrag nach seiner Erstellung nur innerhalb von 24 Stunden bearbeiten. Falls Du Anmerkungen oder Erweiterungen hinzufügen möchtest, so erstelle einen neuen Beitrag. Für absolut dringende Änderungen innerhalb dieses Beitrages wende Dich bitte an einen der Moderatoren.

Alter Mann 28. Mär 2008 20:04

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
Was Soll das eigentlich LARSI?

Schlechten Tag gehabt?

DeddyH 28. Mär 2008 20:07

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
Sei nachsichtig und schieb es seiner Jugend zu :zwinker:

Piro 29. Mär 2008 10:38

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 :-)

marabu 29. Mär 2008 20:31

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
Wie sieht denn deine fehlerauslösende Zuweisung jetzt aus?

Welche variant variable enthält denn den IDispatch pointer?

Piro 30. Mär 2008 21:05

Re: AD + LastLogon & pwdLastSet - Hilfe!!!!
 
Mein Code sieht jetzt so aus:

Delphi-Quellcode:
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;
Großes Fragenzeichen. Wenn ich das so umsetze, kommt die Fehlermeldung, die ich im Screenshot gezeigt habe.

Alter Mann 31. Mär 2008 12:08

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:

CN Pwd-Last-Set
Ldap-Display-Name pwdLastSet
Size 8 bytes
Update Privilege This value is set by the system.
Update Frequency Each time the password is changed.
Attribute-Id 1.2.840.113556.1.4.96
System-Id-Guid bf967a0a-0de6-11d0-a285-00aa003049e2
Syntax Interval
In diesem Fall ist die Syntax intressant und es stellt sich die Frage was ist 'Interval'?
Zitat:

Name Interval
Syntax ID 2.5.5.16
OM ID 65
MAPI Type -
ADS Type ADSTYPE_LARGE_INTEGER
Variant Type VT_DISPATCH
SDS Type A COM object that can be cast to an IADsLargeInteger.
Damit sind schon alle Fragen beantwortert und die Fehlermeldung ist klar.

Delphi-Quellcode:
...
rs.Fields['pwdLastSet'].Value
...
gibt ein Interface vom Type IADsLargeInteger zurück.

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:
...
      pls := rs.Fields['pwdLastSet'].Value;
      li := IDispatch(pls) As IADsLargeInteger;
      ft.dwLowDateTime := Li.LowPart;
      ft.dwHighDateTime := li.HighPart;
...
Fertig. Nun klappt es auch mit dem Datum und der Uhrzeit.

Viele Grüße und bis bald.

Piro 31. Mär 2008 12:56

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