Delphi-PRAXiS
Seite 2 von 2     12   

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 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 21:40 Uhr.
Seite 2 von 2     12   

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