Page 1 of 1 1
Topic Options
#186460 - 2008-03-25 03:38 AM fnLDAPQuery() pwdLastSet
brewdude6 Offline
Hey THIS is FUN

Registered: 2000-10-21
Posts: 280
Loc: Nashville, TN
 Code:
$sFilter = "(&(objectCategory=person)(objectClass=user)(msNPAllowDialin=TRUE)(pwdLastSet>=50)(!(userAccountControl:1.2.840.113556.1.4.803:=65536)))"


I'm trying to query AD for users that have "dial in" access, password last set 50 or more days previously, and exclude users that have "password never expires" flag. Everything works fine with the exception of "pwdLastSet". Do I need to do some type of date conversion and assign it to a variable?
_________________________
I could have made a neat retort but didn't, for I was flurried and didn't think of it till I was downstairs.
-Mark Twain

Top
#186461 - 2008-03-25 03:46 AM Re: fnLDAPQuery() pwdLastSet [Re: brewdude6]
Glenn Barnas Administrator Offline
KiX Supporter
*****

Registered: 2003-01-28
Posts: 4401
Loc: New Jersey
What is it returning? Have you checked MSDN for the data type?

If it's a cTime, you can use TimeConvert() to change it to a normal date.

Glenn
_________________________
Actually I am a Rocket Scientist! \:D

Top
#186462 - 2008-03-25 04:00 AM Re: fnLDAPQuery() pwdLastSet [Re: Glenn Barnas]
Glenn Barnas Administrator Offline
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?

 Code:
; 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! \:D

Top
#186475 - 2008-03-25 03:51 PM Re: fnLDAPQuery() pwdLastSet [Re: Glenn Barnas]
brewdude6 Offline
Hey THIS is FUN

Registered: 2000-10-21
Posts: 280
Loc: Nashville, TN
The $FiftyDaysAgo variable is causing a missing parameter error as written. Would that variable require two TimeConvert instances? Should it be written like this?

 Code:
$FiftyDaysAgo=TimeConvert(@DATE) - (50 * 86400)


This line gives a missing parameter error but I'm not quite sure why. I'm using 4.53 v kix
 Code:
$dFDAvalue = TimeConvert($FiftyDaysAgo, '1601/01/01') * 1000.0
_________________________
I could have made a neat retort but didn't, for I was flurried and didn't think of it till I was downstairs.
-Mark Twain

Top
#186481 - 2008-03-25 04:43 PM Re: fnLDAPQuery() pwdLastSet [Re: brewdude6]
Glenn Barnas Administrator Offline
KiX Supporter
*****

Registered: 2003-01-28
Posts: 4401
Loc: New Jersey
Let me check, it was late when I wrote that..

Glenn
_________________________
Actually I am a Rocket Scientist! \:D

Top
#186483 - 2008-03-25 05:02 PM Re: fnLDAPQuery() pwdLastSet [Re: Glenn Barnas]
Glenn Barnas Administrator Offline
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:
 Code:
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! \:D

Top
#186488 - 2008-03-25 06:18 PM Re: fnLDAPQuery() pwdLastSet [Re: Glenn Barnas]
brewdude6 Offline
Hey THIS is FUN

Registered: 2000-10-21
Posts: 280
Loc: Nashville, TN
Thanks Glenn! I went back and pieced together an old post that gave a similar example and got past the issue I was having.
_________________________
I could have made a neat retort but didn't, for I was flurried and didn't think of it till I was downstairs.
-Mark Twain

Top
Page 1 of 1 1


Moderator:  Jochen, Allen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Arend_, Mart 
Hop to:
Shout Box

Who's Online
0 registered and 550 anonymous users online.
Newest Members
M_Moore, BeeEm, min_seow, Audio, Hoschi
17883 Registered Users

Generated in 0.068 seconds in which 0.029 seconds were spent on a total of 13 queries. Zlib compression enabled.

Search the board with:
superb Board Search
or try with google:
Google
Web kixtart.org