AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IADsLargeInteger TO TDateTime

Ein Thema von cherry · begonnen am 17. Dez 2009 · letzter Beitrag vom 20. Aug 2015
Antwort Antwort
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

IADsLargeInteger TO TDateTime

  Alt 17. Dez 2009, 08:15
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.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: IADsLargeInteger TO TDateTime

  Alt 17. Dez 2009, 08:18
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: IADsLargeInteger TO TDateTime

  Alt 17. Dez 2009, 08:33
Hmm... das scheint nochmals ganz was anderes zu sein. Jemand hat das sicher schon gemacht oder?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Andreas L.
(Gast)

n/a Beiträge
 
#4

Re: IADsLargeInteger TO TDateTime

  Alt 17. Dez 2009, 08:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#5

Re: IADsLargeInteger TO TDateTime

  Alt 17. Dez 2009, 09:08
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?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#6

AW: IADsLargeInteger TO TDateTime

  Alt 19. Aug 2015, 17:55
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
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

Geändert von EarlyBird (19. Aug 2015 um 18:47 Uhr)
  Mit Zitat antworten Zitat
EarlyBird

Registriert seit: 29. Mär 2007
235 Beiträge
 
#7

AW: IADsLargeInteger TO TDateTime

  Alt 20. Aug 2015, 17:14
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 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