我试图在我的工作中从 AD 获取 LastLogin 信息。我有大约 1200 个帐户。当我运行查询并包含 LastLogin 信息时,对于大约 40 - 45% 的帐户,我得到了正确的返回日期。对于其他人,我得到一个默认值。可能是 01-01-1601 或 01-01-1970,具体取决于我使用的转换类型。当我使用非常慢的:Net User /Domain 时,我可以提取上次登录信息,但我需要 10 分钟而不是 10 秒。显然,我想要更快的东西。
这是我使用的代码:
var
LI: OleVariant;
int64Value: Int64;
LocalTime: TFileTime;
SystemTime: TSystemTime;
FileTime : TFileTime;
begin
try
LI := rs.Fields[FieldNumber].Value;
int64Value := LI.HighPart;
int64Value := int64Value shl 32;
int64Value := int64Value or LI.LowPart;
FileTime := TFileTime(int64Value);
Result := EncodeDate(1601,1,1);
if FileTimeToLocalFileTime(FileTime, LocalTime) then
if FileTimeToSystemTime(LocalTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
except
Result := 0;
end;
end;
以上方法有效,但仅在大约 40 - 45% 的情况下有效。AD 没有返回该值,或者转换中有问题。我不知道是哪一个。由于它的某些部分有效,我倾向于说 AD 不会返回我需要的值。当我直接在 AD 中检查时,我看到了正确的值。用查询检索它们并不总是给我这些信息。对我来说问题是,我从互联网上获取了这段代码,老实说,我了解一点但不是全部。我迷失了我看不到的数字。此外,调试一切对我来说是不可能的。我不允许在工作中安装 Delphi。我只能在未连接到网络的计算机上开发并将我的可执行文件复制到网络以尝试/测试所有内容。