none
Data de logon RRS feed

Respostas

  • Até existem outras, que dependem somente da utilização de arquivos texto... mas a auditoria é de longe a melhor saída para essa tarefa e provavelmente deve ser a solução recomendada Microsoft.


    []s,


    --
    Vinicius Canto
    MVP Windows Server - Admin Frameworks
    MCP Windows 2000 Server, Windows XP e SQL Server 2000
    Bacharelando em Ciências da Computação - USP

    Blog sobre Scripting e Windows Powershell: http://viniciuscanto.blogspot.com
    terça-feira, 4 de março de 2008 11:05
    Moderador

Todas as Respostas

  • Leandro segue script que faz o que você quer:

     

    Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery
    Dim adoRecordset, objDC
    Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
    Dim strDN, dtmDate, objDate, objList, strUser
    Dim strBase, strFilter, strAttributes, lngHigh, lngLow

    data = InputBox("digite a data que queira verificar o logon" & vbcrlf &_
    "obs: digite a data conforme a configuração da data do seu servidor." & vbcrlf &_
    "ex: dd/mm/aaaa, digite o dia/mes/ano" & vbcrlf & _
    "Digite os números entre 1 e 9 sem o 0 na frente")

    usuario = InputBox("Digite o login do usuário")


    Set objList = CreateObject("Scripting.Dictionary")
    objList.CompareMode = vbTextCompare

     

    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

     

    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 adoCommand = CreateObject("ADODB.Command")
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Provider = "ADsDSOObject"
    adoConnection.Open "Active Directory Provider"
    adoCommand.ActiveConnection = adoConnection

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

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

    Set adoRecordset = adoCommand.Execute

     

    k = 0
    Do Until adoRecordset.EOF
        Set objDC = _
            GetObject(GetObject(adoRecordset.Fields("AdsPath").Value).Parent)
        ReDim Preserve arrstrDCs(k)
        arrstrDCs(k) = objDC.DNSHostName
        k = k + 1
        adoRecordset.MoveNext
    Loop
    adoRecordset.Close

     

    For k = 0 To Ubound(arrstrDCs)
        strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
        strFilter = "(&(objectCategory=person)(objectClass=user))"
        strAttributes = "sAMAccountName,lastLogon"
        strQuery = strBase & ";" & strFilter & ";" & strAttributes _
            & ";subtree"
        adoCommand.CommandText = strQuery
        On Error Resume Next
        Set adoRecordset = adoCommand.Execute
        If (Err.Number <> 0) Then
            On Error GoTo 0
            Wscript.Echo "Domain Controller not available: " & arrstrDCs(k)
        Else
            On Error GoTo 0
            Do Until adoRecordset.EOF
                strDN = adoRecordset.Fields("sAMAccountName").Value
                If lcase(strDN) = lcase(usuario) then
                On Error Resume Next
                Set objDate = adoRecordset.Fields("lastLogon").Value
                If (Err.Number <> 0) Then
                    On Error GoTo 0
                    dtmDate = #1/1/1601#
                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 = #1/1/1601#
                    Else
                        dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
                            + lngLow)/600000000 - lngBias)/1440
                    End If
                End If
                If (objList.Exists(strDN) = True) Then
                    If (dtmDate > objList(strDN)) Then
                        objList.Item(strDN) = dtmDate
                    End If
                Else
                if mid(dtmdate,1,9) = data or mid(dtmdate,1,8) or mid(dtmdate,1,10)then
                 wscript.echo "O usuário " & strDN & "logou nessa data " & dtmDate
                end if
                End If
                End IF
                adoRecordset.MoveNext
            Loop
            adoRecordset.Close
        End If
    Next


    adoConnection.Close
    Set objRootDSE = Nothing
    Set adoConnection = Nothing
    Set adoCommand = Nothing
    Set adoRecordset = Nothing
    Set objDC = Nothing
    Set objDate = Nothing
    Set objList = Nothing
    Set objShell = Nothing

    PS: tentei explicar o máximo possivel como deve-se colocar o formato da data, se tiver problemas com ela me avise Wink

    quarta-feira, 27 de fevereiro de 2008 17:01
  •  

    Laerte,

     

    a tela esta apresentenda um erro de string

    linha:116

    char:13

    preciso da data 22/02/2008 como devo insiri-la

     

    atencisamente,

    quarta-feira, 27 de fevereiro de 2008 17:49
  • Leandro, desculpa, esqueci de alterar a linah em negrito agora está funcionando Wink

     

    Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery
    Dim adoRecordset, objDC
    Dim strDNSDomain, objShell, lngBiasKey, lngBias, k, arrstrDCs()
    Dim strDN, dtmDate, objDate, objList, strUser
    Dim strBase, strFilter, strAttributes, lngHigh, lngLow

    data = InputBox("digite a data que queira verificar o logon" & vbcrlf &_
    "obs: digite a data conforme a configuração da data do seu servidor." & vbcrlf &_
    "ex: dd/mm/aaaa, digite o dia/mes/ano" & vbcrlf & _
    "Digite os números entre 1 e 9 sem o 0 na frente")

    usuario = InputBox("Digite o login do usuário")


    Set objList = CreateObject("Scripting.Dictionary")
    objList.CompareMode = vbTextCompare

     

    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

     

    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 adoCommand = CreateObject("ADODB.Command")
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Provider = "ADsDSOObject"
    adoConnection.Open "Active Directory Provider"
    adoCommand.ActiveConnection = adoConnection

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

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

    Set adoRecordset = adoCommand.Execute

     

    k = 0
    Do Until adoRecordset.EOF
        Set objDC = _
            GetObject(GetObject(adoRecordset.Fields("AdsPath").Value).Parent)
        ReDim Preserve arrstrDCs(k)
        arrstrDCs(k) = objDC.DNSHostName
        k = k + 1
        adoRecordset.MoveNext
    Loop
    adoRecordset.Close

     

    For k = 0 To Ubound(arrstrDCs)
        strBase = "<LDAP://" & arrstrDCs(k) & "/" & strDNSDomain & ">"
        strFilter = "(&(objectCategory=person)(objectClass=user))"
        strAttributes = "sAMAccountName,lastLogon"
        strQuery = strBase & ";" & strFilter & ";" & strAttributes _
            & ";subtree"
        adoCommand.CommandText = strQuery
        On Error Resume Next
        Set adoRecordset = adoCommand.Execute
        If (Err.Number <> 0) Then
            On Error GoTo 0
            Wscript.Echo "Domain Controller not available: " & arrstrDCs(k)
        Else
            On Error GoTo 0
            Do Until adoRecordset.EOF
                strDN = adoRecordset.Fields("sAMAccountName").Value
                If lcase(strDN) = lcase(usuario) then
                On Error Resume Next
                Set objDate = adoRecordset.Fields("lastLogon").Value
                If (Err.Number <> 0) Then
                    On Error GoTo 0
                    dtmDate = #1/1/1601#
                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 = #1/1/1601#
                    Else
                        dtmDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _
                            + lngLow)/600000000 - lngBias)/1440
                    End If
                End If
                If (objList.Exists(strDN) = True) Then
                    If (dtmDate > objList(strDN)) Then
                        objList.Item(strDN) = dtmDate
                    End If
                Else
                if mid(dtmdate,1,9) = data or mid(dtmdate,1,8) = data or mid(dtmdate,1,10) = data then
                 wscript.echo "O usuário " & strDN & "logou nessa data " & dtmDate

                else

                  wscript.echo "O usuário " & strDN & " não logou na data indicada " & data & "  mas logou na data " & dtmDate
                end if
                End If
                End IF
                adoRecordset.MoveNext
            Loop
            adoRecordset.Close
        End If
    Next


    adoConnection.Close
    Set objRootDSE = Nothing
    Set adoConnection = Nothing
    Set adoCommand = Nothing
    Set adoRecordset = Nothing
    Set objDC = Nothing
    Set objDate = Nothing
    Set objList = Nothing
    Set objShell = Nothing

     

    Quanto ao formato da data, vai depender de como está o formato da hora do seu servidor, tipo se tiver dd//mm/aaaa, você vai ter que colocar 22/2/2008, mas se tiver mm/dd/aaaa vai ter que ser 2/22/2008, olhe nas configurações regionais do seu server para olhar como está e siga o padrão que está Wink, e quanto ao que disse sobre o zero, como você quer saber o mês não coloque 02, mas sim somente o número 2, espero ter sido claro Wink

    quarta-feira, 27 de fevereiro de 2008 20:12
  •  

    Laerte, bom dia!

    Companheiro achei muito bacana essa ferramenta e tenho certeza que será util para muitos administradores de rede. Só que ainda não obtive sucesso. Por exemplo:

    Fiz o teste com a pessoa que procurava e me retornou a mensagem.

    'Usuario não logou nesta data, mas logou nesta'

    depois fiz o teste com o meu usuário sendo que, eu loguei no dia que solicitei e me apareceu a mesma mensagem

    'Usuario não logou nesta data, mas logou nesta', parece que está trazendo apenas o ultimo logon.

    No mais agradeço a sua presteza e estarei esperando uma solução.

    valeu

    quinta-feira, 28 de fevereiro de 2008 11:31
  • Leandro, entendi o que você quer, bom dessa forma, vou ter que pesquisar, pois pensei que o que você queria era saber se a data que você digitou era o último login da pessoa, descobrir se ele logou naquela data pode ser feito se você tiver a auditoria de logon de conta ou auditoria de logon habilitadas em sua rede, outra forma como disse vou ter que pesquisar pois desconheço Wink

     

    quinta-feira, 28 de fevereiro de 2008 16:24
  •  

    Laerte, eu até que estava com a auditoria configurada. Mas precisei desabilita-la ha uns dois meses. No mais eu agradeço a sua presteza. E a segunda vez que consulto este Forum e o que tenho pra dizer é que existem pessoas que se preocupa com os profissionais da área. Isto é Ótimo. Deus o abençõe.
    sexta-feira, 29 de fevereiro de 2008 10:53
  • amém. Leandro, estamos ai para isso, mas que mal lhe pergunte, existiu algum motivo em especial para você desativar a auditoria?

     

    sexta-feira, 29 de fevereiro de 2008 12:36
  • Eu desativei foi na epoca em tive problema com firewall/proxy do linux, a autenticação não estava funcionando. E foi na mesma epoca que configurei a auditoria para acesso a algumas pastas. E naquela correria eu desativei a auditoria, e fui me lembrar só agora quando precisei verificar alguns logons.

    segunda-feira, 3 de março de 2008 10:47
  • Entendi, Leandro, mas realmente fora as auditorias não conheço outra forma de você saber se um usuário logou ou não naquele dia. Vou ficar te devendo essa Wink

    segunda-feira, 3 de março de 2008 15:02
  • Até existem outras, que dependem somente da utilização de arquivos texto... mas a auditoria é de longe a melhor saída para essa tarefa e provavelmente deve ser a solução recomendada Microsoft.


    []s,


    --
    Vinicius Canto
    MVP Windows Server - Admin Frameworks
    MCP Windows 2000 Server, Windows XP e SQL Server 2000
    Bacharelando em Ciências da Computação - USP

    Blog sobre Scripting e Windows Powershell: http://viniciuscanto.blogspot.com
    terça-feira, 4 de março de 2008 11:05
    Moderador