【问题标题】:VBscript No output attempting query AD users last 30 daysVBscript 没有输出尝试查询最近 30 天的 AD 用户
【发布时间】:2013-12-19 21:15:07
【问题描述】:

我有一个有效的查询,但它正在捕获 AD 中的所有用户,我正试图将其缩小到过去 90 天。问题是即使查询运行,我也不再有任何输出。我知道我的数学是错误的,并且不会起飞 90 天。谁能提供这方面的帮助?

        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&lt;=" &amp; currentDate &amp; ")); 更改为(lastLogon&lt;=" &amp; currentDate &amp; ")); 并且我想要这不会显示正确的用户群时。谁能告诉我为什么?

【问题讨论】:

  • 我建议您使用DateDiff 进行日期计算。
  • @PatricK Active Directory 以不同的格式存储日期,因此用于日期计算的内置工具在此用途有限。

标签: excel vbscript vb6 vba


【解决方案1】:

VBScript tag wiki 中所述,VBScript 不会在字符串中展开变量,因此您需要更改此设置:

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"

另外,我建议将 currentDate 计算为普通的 Date 值,例如像这样:

maxAge = 30 'days
currentDate = Now - maxAge

或者像这样:

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

然后使用 Richard L. Mueller 的 this code 将其转换为 integer8 值:

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"

【讨论】:

  • 嘿,谢谢你的代码。我已经更新了我的代码,但是当我运行它时没有输出。我相信这是因为数学是错误的,它试图在未来而不是 30 天前找到用户。
  • 我让它工作了,但它只在我将 lastLogonTimestamp
猜你喜欢
  • 2022-01-22
  • 2022-01-20
  • 1970-01-01
  • 2011-12-08
  • 2015-07-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多