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 IADsLargeInteger TO TDateTime (https://www.delphipraxis.net/144813-iadslargeinteger-tdatetime.html)

cherry 17. Dez 2009 07:15


IADsLargeInteger TO TDateTime
 
Mooorgeeen.

Ich gebs auf... Ich kriegs nicht auf die Reihe das Attribut pwdLastSet (IADsLargeInteger) in ein lesbares TDateTime zu konvertieren.
Bis jetzt hab ich 100te Beispiele angeschaut aber nichts scheint zu klappen.

Ich hab bis jetzt so was hier:

Delphi-Quellcode:
function GetDateTimeFromLargeInteger(largeIntValue: IADsLargeInteger): TDateTime;
var
  int64Value: Int64;
begin
  // Convert large integer to int64 value
  int64Value := largeIntValue.HighPart;
  int64Value := int64Value shl 32;
  int64Value := int64Value or largeIntValue.LowPart;
  // return datetime
  result := FileDateToDateTime(int64Value);
end;
Danke schon mal.

mirage228 17. Dez 2009 07:18

Re: IADsLargeInteger TO TDateTime
 
Hier: http://msdn.microsoft.com/en-us/library/aa706037(VS.85).aspx
Wird zumindest FileTimeToSystemTile vorgeschlagen -- weiß nicht, ob das das selbe ist wie FileTimeToDateTime...

Viele Grüße

cherry 17. Dez 2009 07:33

Re: IADsLargeInteger TO TDateTime
 
Hmm... das scheint nochmals ganz was anderes zu sein. Jemand hat das sicher schon gemacht oder?

Andreas L. 17. Dez 2009 07:41

Re: IADsLargeInteger TO TDateTime
 
Wenn IADsLargeInteger dem TFileTime entspricht kannst du folgenden Code verwenden:

Delphi-Quellcode:
function FileTimeToDateTime(FileTime: TFileTime):TDateTime;
var
  LocalTime: TFileTime;
  SystemTime: TSystemTime;
begin
  Result := EncodeDate(1900,1,1);
  if FileTimeToLocalFileTime(FileTime, LocalTime) then
    if FileTimeToSystemTime(LocalTime, SystemTime) then
      Result := SystemTimeToDateTime(SystemTime);
end;

cherry 17. Dez 2009 08:08

Re: IADsLargeInteger TO TDateTime
 
Danke Andreas L.

Unglaublich aber wahr, so klappts!

Delphi-Quellcode:
function GetDateTimeFromLargeInteger(largeIntValue: IADsLargeInteger): TDateTime;
var
  int64Value: Int64;
  LocalTime: TFileTime;
  SystemTime: TSystemTime;
  FileTime : TFileTime;
begin
  int64Value := largeIntValue.HighPart;
  int64Value := int64Value shl 32;
  int64Value := int64Value or largeIntValue.LowPart;
  FileTime := TFileTime(int64Value);
  Result := EncodeDate(1601,1,1);
  if FileTimeToLocalFileTime(FileTime, LocalTime) then
    if FileTimeToSystemTime(LocalTime, SystemTime) then
      Result := SystemTimeToDateTime(SystemTime);
end;
und so kann das ganze in Aktion aussehen:

Delphi-Quellcode:
       
  pls := Get('pwdLastSet');
  li := IDispatch(pls) As IADsLargeInteger;
  if Trunc(GetDateTimeFromLargeInteger(li)) = EncodeDate(1601,1,1) then
    ShowMessage('password never expires')
  else
    ShowMessage(DateTimeToStr(GetDateTimeFromLargeInteger(li)));
Nun drängt sich mir aber die Frage auf, was soll das ganze??? geht das nicht auch einfacher?

EarlyBird 19. Aug 2015 16:55

AW: IADsLargeInteger TO TDateTime
 
Hallo,
ich nutze schon seit längerem die in diesem Beitrag gezeigte Funktion zum berechen eines Datums aus dem ActiveDirectory (AccountExpires)
Erst jetzt ist aufgefallen das das Datum nicht immer stimmt.
Ist AccountExpires z.B auf den 28.03.215 eingestellt gibt die Funktion den 29.03.2015 zurück.
Aber auch bei verschiedenen anderen Daten wird das falsche Datum zurückgegeben.
ich Nutze die Funktion genau so:
Delphi-Quellcode:
function GetDateTimeFromLargeInteger(largeIntValue: IADsLargeInteger): TDateTime;
var
  int64Value: Int64;
  LocalTime: TFileTime;
  SystemTime: TSystemTime;
  FileTime : TFileTime;
begin
  int64Value := largeIntValue.HighPart;
  int64Value := int64Value shl 32;
  int64Value := int64Value or largeIntValue.LowPart;
  FileTime := TFileTime(int64Value);
  Result := EncodeDate(1601,1,1);
  if FileTimeToLocalFileTime(FileTime, LocalTime) then
    if FileTimeToSystemTime(LocalTime, SystemTime) then
      Result := SystemTimeToDateTime(SystemTime);
end;
Manchmal wird sogar gar kein Datum (z.B. Datum 02.04.2014) zurückgegeben.
ich habe dies Zeile mal ausgeklammert
Delphi-Quellcode:
int64Value := int64Value or largeIntValue.LowPart;
Dann wurde wieder ein Datum berechnet aber leider auch das Falsche.

Hat jemand einen Tipp was ich ändern muss um zuverlässig das richtige Datum zu erhalten

Besten Dank

EarlyBird 20. Aug 2015 16:14

AW: IADsLargeInteger TO TDateTime
 
ich hab es jetzt folgender massen angepasst.
Delphi-Quellcode:
function GetDateTimeFromLargeInteger(largeIntValue: IADsLargeInteger): TDateTime;
var
  int64Value: Int64;
  LocalTime: TFileTime;
  SystemTime: TSystemTime;
  FileTime : TFileTime;
begin
  int64Value := largeIntValue.HighPart;
  int64Value := int64Value shl 32;
  int64Value := int64Value - 100000000000;
 // int64Value := int64Value or largeIntValue.LowPart;
  FileTime := TFileTime(int64Value);
  Result := EncodeDate(1601,1,1);
  if FileTimeToLocalFileTime(FileTime, LocalTime) then
    if FileTimeToSystemTime(LocalTime, SystemTime) then
      Result := SystemTimeToDateTime(SystemTime);
end;
Das behebt erstmal das Problem.
Damit wird bei allen Usern das richtige Datum angezeigt.

Die richtige und zuverlässig Lösung ist das aber nicht.

Ich hoffe mir kann jemand helfen eien zuverlässige Lösung zu finden.
Besten Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz