#186462 - 2008-03-25 04:00 AM
Re: fnLDAPQuery() pwdLastSet
[Re: Glenn Barnas]
|
Glenn Barnas
KiX Supporter
   
Registered: 2003-01-28
Posts: 4401
Loc: New Jersey
|
From MSDN: pwdLastSet: "The date and time that the password for this account was last changed. This value is stored as a large integer that represents the number of 100 nanosecond intervals since January 1, 1601 (UTC). If this value is set to 0 and the User-Account-Control attribute does not contain the UF_DONT_EXPIRE_PASSWD flag, then the user must set the password at the next logon."
If you want to define the parameter of 50 days ago, you need to get the cTime from 50 days ago, using an appropriate Epoch. Then multiply it by 1000 to get ms. Use that value in your query. Simple, eh?
; Get today as cTime, subtract 50 days, convert back to Date string
$FiftyDaysAgo = TimeConvert(TimeConvert(@DATE) - (50 * 86400))
$dFDAvalue = 0.0 ; cast as double
; convert adjusted date back to cTime, using required epoch, then
; multiply by 1000 to get ms instead of seconds
$dFDAvalue = TimeConvert($FiftyDaysAgo, '1601/01/01') * 1000.0
Untested, but it should work. I have to wonder why they used that epoch value, since the calendar was adjusted by removing 12 days in Sept, 1752. Not sure if you'll have to adjust your initial adjustment by 12 or not!
Glenn
_________________________
Actually I am a Rocket Scientist!
|
|
Top
|
|
|
|
#186483 - 2008-03-25 05:02 PM
Re: fnLDAPQuery() pwdLastSet
[Re: Glenn Barnas]
|
Glenn Barnas
KiX Supporter
   
Registered: 2003-01-28
Posts: 4401
Loc: New Jersey
|
I didn't read my own header at that hour... the TimeConvert UDF requires a DATE TIME string, not just a DATE. Since you want midnight of the current day, change the TimeConvert(@DATE) to TimeConvert(@DATE + ' 00:00:00')
Try this sample - it works for me, and includes the latest TimeConvert UDF:
Break On
'Cur Date: ' @DATE ' 00:00:00' ?
'Cur Cval: ' TimeConvert(@DATE + ' 00:00:00') ?
; Get today as cTime, subtract 50 days, convert back to Date string
$FiftyDaysAgo = TimeConvert(TimeConvert(@DATE + ' 00:00:00') - (50 * 86400))
'FDA Cval: ' TimeConvert(@DATE + ' 00:00:00') - (50 * 86400) ?
'FDA Date: ' $FiftyDaysAgo ?
$dFDAvalue = 0.0 ; cast as double
'Using 1601/1/1 epoch' ?
'FDA Cval: ' TimeConvert($FiftyDaysAgo, '1601/01/01') ?
; convert adjusted date back to cTime, using required epoch, then
; multiply by 1000 to get ms instead of seconds
$dFDAvalue = TimeConvert($FiftyDaysAgo, '1601/01/01') * 1000.0
'FDA ms: ' $dFDAvalue ?
;;
;;======================================================================
;;
;;FUNCTION TimeConvert()
;;
;;ACTION Converts time formats between cTime and Kix Time
;;
;;AUTHOR Glenn Barnas
;; Based on Rata Die algorithms of Peter Baum
;;
;;VERSION 2.0 / 2007/01/20 - Eliminated 2Gig bug,
;; Add support of negative cTime values
;; Fixed Epoch bug, allowing any date value
;; Allow numeric or string Epoch value
;; 1.0 / 2006/11/20 - first release
;;
;;SYNTAX TimeConvert(CValue [, Epoch])
;;
;;PARAMETERS CValue - REQUIRED - The time value to be converted. This may
;; be an integer value representing the number of seconds since
;; the Epoch, or a Date Time string in the format YYYY/MM/DD hh:mm:ss
;; Given one type, the function returns the other type.
;;
;; Epoch - OPTIONAL - A date string (YYYY/MM/DD format) or days value that
;; represents the "beginning of time". The default is 1970/1/1 (719163).
;; To accurately specify time from the year 1, use an Epoch value of 0.
;; Negative Epoch values were not tested.
;;
;;REMARKS This function simply changes a between date strings and cTime values
;; and vice-versa. Any time zone conversions should be performed external
;; to this function.
;;
;; Validated by generating sequential date values from 1/1/1883 to 12/31/2105,
;; a range of just over 8.5 Billion seconds.
;;
;; This function does not take into account changes to the calendar which occurred
;; throughout history.
;;
;;RETURNS Time string in Kix format (yyyy/mm/dd hh:mm:ss) if cTime format is provided
;; cTime value (double) if Kix format time string is provided
;;
;;DEPENDENCIES none
;;
;;TESTED WITH Kix 4.50, W2K, WXP, W2K3
;;
;;EXAMPLES
;; ; What time will it be in 15 minutes?
;; TimeConvert(TimeConvert(@DATE + ' ' + @TIME) + 900)
;; ; Specialized use of EPOCH value
;; ; How many seconds before 2007 US taxes are due? (or overdue??)
;; TimeConvert(@DATE + ' ' + @TIME, '2007/04/15') ?
;
Function TimeConvert($_CValue, OPTIONAL $_Epoch)
Dim $_ ; generic counter / increment
Dim $_Return ; value calculated by the engine to return to the calling routine
Dim $_Date, $_Time ; values used by the Date to cTime routine
Dim $_A, $_B, $_C, $_D, $_E ; intermediate variables used in the calendar calculation
; Validate/Define the Epoch value
If VarType($_Epoch) > 1
If VarType($_Epoch) = 8 ; yyyy/mm/dd format
$_Epoch = Split($_Epoch, '/')
If UBound($_Epoch) <> 2 Exit 87 EndIf ; Bad Epoch date format!
For $_ = 0 to 2
$_Epoch[$_] = Val($_Epoch[$_]) ; insure values are numeric
Next
; Adjust for Feb
If $_Epoch[1] < 3
$_Epoch[1] = $_Epoch[1] + 12
$_Epoch[0] = $_Epoch[0] - 1
EndIf
; Calculate days since Year 0, accounting for leap years
$_Epoch = CDbl($_Epoch[2]) + (153 * $_Epoch[1] - 457) / 5 + 365 * $_Epoch[0] + $_Epoch[0] / 4 - $_Epoch[0] / 100 + $_Epoch[0] / 400 - 306
EndIf
Else
$_Epoch = 719163 ; default to 1970/1/1
EndIf
; perform the time conversion
If $_CValue + 0 = $_CValue ; convert cTime to Date/Time
$_ = $_CValue
Dim $_CValue[5] ; Prepare CValue array to hold date/time components
$_CValue[5] = $_
$_CValue[2] = Int($_CValue[5] / 86400) ; Days for DATE part
$_CValue[5] = $_CValue[5] - (86400.0 * $_CValue[2]) ; Remaining seconds for TIME part
If $_CValue[5] < 0
$_CValue[2] =$_CValue[2] - 1 ; Adjust for negative cTime values
EndIf
$_CValue[2] = $_CValue[2] + $_Epoch
$_E = $_CValue[2] + 306 ; Process m/d/y values, accounting for calendar changes
$_D = 100 * $_E - 25 ; and leap years
$_A = $_D / 3652425
$_B = $_A - $_A / 4
$_CValue[0] = (100 * $_B + $_D) / 36525
$_C = $_B + $_E - 365 * $_CValue[0] - $_CValue[0] / 4
$_CValue[1] = (5 * $_C + 456) / 153
$_CValue[2] = $_C - (153 * $_CValue[1] - 457) / 5
If $_CValue[1] > 12 ; More than 12 months?
$_CValue[0] = $_CValue[0] + 1 ; Add a year
$_CValue[1] = $_CValue[1] - 12 ; subtract 12 months
EndIf
$_CValue[3] = Int($_CValue[5] / 3600)
$_CValue[4] = Int(($_CValue[5] - $_CValue[3] * 3600) / 60)
$_CValue[5] = $_CValue[5] - Int($_CValue[3] * 3600) - $_CValue[4] * 60
; deal with negative cTime values
If $_CValue[5] < 0
$_CValue[5] = 60 + $_CValue[5]
$_CValue[4] = $_CValue[4] - 1
EndIf
If $_CValue[4] < 0
$_CValue[4] = 60 + $_CValue[4]
$_CValue[3] = $_CValue[3] - 1
EndIf
If $_CValue[3] < 0
$_CValue[3] = 24 + $_CValue[3]
EndIf
; format the return string
$_Return ='' + $_CValue[0] + '/' + right('00'+ $_CValue[1], 2) + '/' + right('00' + $_CValue[2], 2)
$_Return = $_Return + ' ' + right('00' + $_CValue[3], 2) + ':' + right('00' + $_CValue[4], 2) + ':' + right('00'+$_CValue[5] , 2)
Else ; Convert Date/Time to cTime
; convert to array & verify correct # of fields
$_CValue = Split(Join(Split(Join(Split($_CValue + ':0', '/'), ' '), ':'), ' '), ' ', 6)
If UBound($_CValue) <> 5 Exit 87 EndIf ; Bad date/time format!
; convert to numeric values
For $_ = 0 to 5 $_CValue[$_] = Val($_CValue[$_]) Next
If $_CValue[1] < 3
$_CValue[1] = $_CValue[1] + 12
$_CValue[0] = $_CValue[0] - 1
EndIf
$_Date = CDbl($_CValue[2]) + (153 * $_CValue[1] - 457) / 5 + 365 * $_CValue[0] + $_CValue[0] / 4 - $_CValue[0] / 100 + $_CValue[0] / 400 - 306
$_Time = (Val(CDbl($_CValue[3])) * 3600) + (Val($_CValue[4]) * 60) + Val($_CValue[5])
$_Return = (($_Date - $_Epoch) * 86400 + $_Time)
EndIf
; Return the value
$TimeConvert = $_Return
Exit 0
EndFunction
Glenn
_________________________
Actually I am a Rocket Scientist!
|
|
Top
|
|
|
|
Moderator: Jochen, Allen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Arend_, Mart
|
0 registered
and 405 anonymous users online.
|
|
|