DSQuery obtém a data do último logon no diretório ativo

1

Eu preciso do campo lastlogon dos computadores do meu domínio exportados. Eu usei este comando:

dsquery * domainroot -filter "(&(objectCategory=Computer)(
objectClass=User))" -attr distinguishedName sAMAccountName lastLogon

Isso foi exportado para o arquivo txt, meu problema é que o campo lastlogon é um timestamp inteiro e não é realmente uma data. Por exemplo, este é um valor: 130931011681543000 , mas não consigo reconhecer esses valores como uma data. Este não é um unixtimestamp, millis de 1900/1/1 ... como converter esses valores para uma data legível?

    
por Tobia 27.11.2015 / 14:06

1 resposta

1

Eu encontrei, é um objeto FILETIME e eu poderia convertê-lo usando uma macro do Excel:

Option Explicit

Tipo privado FILETIME   dwLowDateTime As Long   dwHighDateTime as Long Tipo Final

Tipo Privado SYSTEMTIME   wYear As Integer   wMonth As Integer   wDayOfWeek As Integer   wDay As Integer   wHour As Integer   wMinute As Integer   wSegundo como inteiro   wMilliseconds As Integer Tipo Final

Private Declare a função FileTimeToSystemTime Lib "kernel32" (lpFileTime como FILETIME, lpSystemTime como SYSTEMTIME) como longo

Function ConvertDate(test)
    ConvertDate = Bit64ToDate(test)
    '4/26/2010 8:32:27 PM
End Function

Private Function Bit64ToDate(Bit64) As Date
    Dim High As Long, Low As Long, ft As FILETIME, st As SYSTEMTIME

    GetTwoLongsFromInt64 [Bit64], ft.dwHighDateTime, ft.dwLowDateTime

    FileTimeToSystemTime ft, st
    Bit64ToDate = SystemTimeToVBTime(st)
End Function

'the following function - thanks to
'http://doc.xceedsoft.com/products/Xceedzip/64_bit_values.html
Private Sub GetTwoLongsFromInt64(ByVal cInt64 As Double, ByRef lHigh As Long, ByRef lLow As Long)
    Dim cRemainder As Double

    lHigh = CLng(Fix(cInt64 / 4294967296#))
    cRemainder = cInt64 - (lHigh * 4294967296#)

    If (cRemainder <= 2147483647#) Then
        lLow = CLng(cRemainder)
    Else
        cRemainder = cRemainder - 4294967296#
        lLow = (CLng(cRemainder))
    End If
End Sub

'the following function - thanks to
'http://www.cpearson.com/excel/FileTimes.htm
Private Function SystemTimeToVBTime(SysTime As SYSTEMTIME) As Date
    With SysTime
        SystemTimeToVBTime = DateSerial(.wYear, .wMonth, .wDay) + _
                TimeSerial(.wHour, .wMinute, .wSecond)
    End With
End Function
    
por 27.11.2015 / 14:19