2013-12-19 5 views
0

저는 작동하는 쿼리를 가졌지 만 AD에있는 모든 사용자를 확보하고 있었고 지난 90 일간이를 좁히려하고 있습니다. 문제는 쿼리가 실행 되더라도 더 이상 출력이 없다는 것입니다. 나는 나의 수학이 틀렸고 90 일을 벗어나지 않는다는 것을 안다. 아무도 이것에 도움을 줄 수 있습니까?VBscript AD 사용자가 지난 30 일 동안 쿼리를 시도하지 않았습니다.

 Dim currentDate 
    currentDate = DateDiff("s", CDate("1/1/1970"), Now()) * 1000# 
    currentDate = currentDate - 7776000000# 'Subtracts 90 days 
'Does the query 
    objCommand.CommandText = _ 
    "<LDAP://" & strDN & ">;" & _ 
    "(&(objectclass=user)(objectcategory=person)(lastLogonTimestamp<=" & currentDate & "));" & _ 
    "adspath,distinguishedname,sAMAccountName,lastLogonTimestamp,DisplayName,WhenCreated,userAccountControl;subtree" 
'Output the query info 
    Set objRecordSet = objCommand.Execute 
    rngOut.CurrentRegion.Offset(2).ClearContents 
    While Not objRecordSet.EOF 
     rngOut.value = objRecordSet.Fields("DisplayName").value 
     Set rngOut = rngOut.Offset(0, 1) 
     rngOut.value = objRecordSet.Fields("sAMAccountName").value 
     Set rngOut = rngOut.Offset(0, 1) 
     rngOut.value = objRecordSet.Fields("WhenCreated").value 
     Set rngOut = rngOut.Offset(0, 1) 
     On Error Resume Next 
     Set objDate = objRecordSet.Fields("lastLogonTimestamp").value 
     If (Err.Number <> 0) Then 
      On Error GoTo 0 
      dtmDate = "" 
     Else 
      On Error GoTo 0 
      lngHigh = objDate.HighPart 
      lngLow = objDate.LowPart 
      If (lngLow < 0) Then 
       lngHigh = lngHigh + 1 
      End If 
      If (lngHigh = 0) And (lngLow = 0) Then 
       dtmDate = "" 
      Else 
       dtmDate = #1/1/1601# + (((lngHigh * (2^32)) _ 
        + lngLow)/600000000)/1440 
      End If 
     End If 
     rngOut.value = dtmDate 
     Set rngOut = rngOut.Offset(0, 1) 
     rngOut.value = objRecordSet.Fields("distinguishedName").value 
     Set rngOut = rngOut.Offset(0, 1) 
     Set Uservar = objRecordSet.Fields("userAccountControl") 
     If Uservar And 2 Then 
      rngOut.value = "Disabled" 
      rngOut.Font.ColorIndex = 3 
     Else 
      rngOut.value = "Enabled" 
      rngOut.Font.ColorIndex = 0 
     End If 
     Set rngOut = rngOut.Offset(1, -5) 
     objRecordSet.MoveNext 
    Wend 

나는이 작업을하지만 나는 (lastLogonTimestamp<=" & currentDate & "));(lastLogon<=" & currentDate & "));에 내가 올바른 사용자 기반을 표시하지 않습니다이 걸려 무엇을 변경할 때. 아무도 그 이유를 말할 수 있습니까? 내가하는 currentDate을 계산 권하고 싶습니다, 또한

objCommand.CommandText = _ 
    "<LDAP://" & strDN & ">;" & _ 
    "(&(objectclass=user)(objectcategory=person)(lastLogonTimestamp>=" & currentDate & "));" & _ 
    "adspath,distinguishedname,sAMAccountName,lastLogon,DisplayName,WhenCreated,userAccountControl;subtree" 

이에

objCommand.CommandText = _ 
    "<LDAP://" & strDN & ">;" & _ 
    "(&(objectclass=user)(objectcategory=person)(lastLogonTimestamp>=currentDate));" & _ 
    "adspath,distinguishedname,sAMAccountName,lastLogon,DisplayName,WhenCreated,userAccountControl;subtree" 

: 문자열 내부 변수를 확장하지 않는 VBScript tag wiki VBScript로 문서화, 그래서 당신이 변경해야으로

+1

내가 사용하는 것이 좋습니다를 [참조 DateDiff ] (http://msdn.microsoft.com/en-us/library/xhtyw595 (v = vs.84) .aspx)를 참조하십시오. – PatricK

+1

@PatricK Active Directory는 날짜를 다른 형식으로 저장하므로 날짜 계산을위한 기본 제공 도구가 여기에서 제한적으로 사용됩니다. –

답변

1

보통 Date 값으로 이 같은 :

maxAge = 30 'days 
currentDate = DateAdd("d", -maxAge, Now) 

다음 리처드 L. 뮬러에서 this code를 사용하여 integer8 값으로 변환 :

maxAge = 30 'days 
currentDate = Now - maxAge 

또는 같은

Function DateToInt8(d) 
    biasKey = CreateObject("Wscript.Shell").RegRead("HKLM\System" & _ 
    "\CurrentControlSet\Control\TimeZoneInformation\ActiveTimeBias") 
    If (UCase(TypeName(biasKey)) = "LONG") Then 
    bias = biasKey 
    ElseIf (UCase(TypeName(biasKey)) = "VARIANT()") Then 
    bias = 0 
    For k = 0 To UBound(biasKey) 
     bias = bias + (biasKey(k) * 256^k) 
    Next 
    End If 

    DateToInt8 = CStr(DateDiff("s", #1/1/1601#, DateAdd("n", bias, d))) & "0000000" 
End Function 

... 

objCommand.CommandText = "<LDAP://" & strDN & ">;" & _ 
    "(&(objectclass=user)(objectcategory=person)(lastLogonTimestamp>=" & _ 
    DateToInt8(currentDate) & "));adspath,distinguishedname,sAMAccountName," & _ 
    "lastLogon,DisplayName,WhenCreated,userAccountControl;subtree" 
+0

안녕하세요, 코드 주셔서 감사합니다. 코드를 업데이트했지만 실행하면 출력이 없습니다. 나는 이것이 수학이 잘못되어 30 일 전에 미래에 사용자를 찾으려고한다는 것을 믿습니다. –

+0

@aDroidman 업데이트 된 답변보기. –

+0

나는 그것이 작동하지만, lastLogon <= "& currentDate &")) to lastLogon <= "& currentDate &") lastLogonTimestamp를 변경할 때만 작동합니다.) 어떤 일을하는지 도움이되지 않습니다. 내가 사용중인 최신 버전으로 코드를 업데이트했습니다. –

관련 문제