created an app for accounting dept, need to add last logon date query

Discussion in 'Scripting' started by Jon Silvermen, Oct 6, 2003.

  1. I created an app for our accounting departmernt that will let them browse
    the AD tree (using mscomctl.ocx treeview) for a user that they need to
    modify (disable). They will usually check to see when the last time they
    logged on. Using the lastLogon attribute wastn't reliable due to the fact
    we have two domain controllers. I found one that Richard Mueller wrote but
    it does it for all users in the whole domain. Can someone (maybe Richard)
    help change it so it does it for one person so I can add it to my app?
    see code taken from http://www.rlmueller.net/Programs/LastLogon.txt below
    Option Explicit

    Dim objRootDSE, strConfig, objConnection, objCommand, strQuery
    Dim objRecordSet, objDC
    Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
    Dim strDN, dtmDate, objDate, lngDate, objList, strUser
    Dim strBase, strFilter, strAttributes, lngHigh, lngLow

    ' Use a dictionary object to track latest lastLogon for each user.
    Set objList = CreateObject("Scripting.Dictionary")
    objList.CompareMode = vbTextCompare

    ' Obtain local Time Zone bias from machine registry.
    Set objShell = CreateObject("Wscript.Shell")
    lngBiasKey = objShell.RegRead("HKLM\System\CurrentControlSet\Control\" _
    & "TimeZoneInformation\ActiveTimeBias")
    If UCase(TypeName(lngBiasKey)) = "LONG" Then
    lngBias = lngBiasKey
    ElseIf UCase(TypeName(lngBiasKey)) = "VARIANT()" Then
    lngBias = 0
    For k = 0 To UBound(lngBiasKey)
    lngBias = lngBias + (lngBiasKey(k) * 256^k)
    Next
    End If

    ' Determine configuration context and DNS domain from RootDSE object.
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strConfig = objRootDSE.Get("configurationNamingContext")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")

    ' Use ADO to search Active Directory for ObjectClass nTDSDSA.
    ' This will identify all Domain Controllers.
    Set objCommand = CreateObject("ADODB.Command")
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"
    objCommand.ActiveConnection = objConnection

    strBase = "<LDAP://" & strConfig & ">"
    strFilter = "(objectClass=nTDSDSA)"
    strAttributes = "AdsPath"
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"

    objCommand.CommandText = strQuery
    objCommand.Properties("Page Size") = 100
    objCommand.Properties("Timeout") = 60
    objCommand.Properties("Cache Results") = False

    Set objRecordSet = objCommand.Execute

    ' Enumerate parent objects of class nTDSDSA. Save Domain Controller
    ' AdsPaths in dynamic array arrstrDCs.
    k = 0
    Do Until objRecordSet.EOF
    Set objDC = _
    GetObject(GetObject(objRecordSet.Fields("AdsPath")).Parent)
    ReDim Preserve arrstrDCs(k)
    arrstrDCs(k) = objDC.DNSHostName
    k = k + 1
    objRecordSet.MoveNext
    Loop

    ' Retrieve lastLogon attribute for each user on each Domain Controller.
    For k = 0 To Ubound(arrstrDCs)
    strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strAttributes = "distinguishedName,lastLogon"
    strQuery = strBase & ";" & strFilter & ";" & strAttributes _
    & ";subtree"
    objCommand.CommandText = strQuery
    On Error Resume Next
    Err.Clear
    Set objRecordSet = objCommand.Execute
    If Err.Number <> 0 Then
    Err.Clear
    On Error GoTo 0
    Wscript.Echo "Domain Controller not available: " & arrstrDCs(k)
    Else
    On Error GoTo 0
    Do Until objRecordSet.EOF
    strDN = objRecordSet.Fields("distinguishedName")
    lngDate = objRecordSet.Fields("lastLogon")
    On Error Resume Next
    Err.Clear
    Set objDate = lngDate
    If Err.Number <> 0 Then
    Err.Clear
    dtmDate = #1/1/1601#
    Else
    lngHigh = objDate.HighPart
    lngLow = objDate.LowPart
    If lngLow < 0 Then
    lngHigh = lngHigh + 1
    End If
    If (lngHigh = 0) And (lngLow = 0 ) Then
    dtmDate = #1/1/1601#
    Else
    dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
    + lngLow)/600000000 - lngBias)/1440
    End If
    End If
    On Error GoTo 0
    If objList.Exists(strDN) Then
    If dtmDate > objList(strDN) Then
    objList(strDN) = dtmDate
    End If
    Else
    objList.Add strDN, dtmDate
    End If
    objRecordSet.MoveNext
    Loop
    End If
    Next

    ' Output latest lastLogon date for each user.
    For Each strUser In objList
    Wscript.Echo strUser & " ; " & objList(strUser)
    Next

    ' Clean up.
    objConnection.Close
    Set objRootDSE = Nothing
    Set objConnection = Nothing
    Set objCommand = Nothing
    Set objRecordSet = Nothing
    Set objDC = Nothing
    Set objDate = Nothing
    Set objList = Nothing
    Set objShell = Nothing
     
    Jon Silvermen, Oct 6, 2003
    #1
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.