Como saber a que horas um usuário do domínio efetuou login?

7

No log de eventos "Segurança" em um controlador de domínio do Windows 2003, vejo várias entradas do evento 540 - "Logon de rede bem-sucedido" com uma média de alguns minutos de intervalo ao longo do dia.

O primeiro deles para um determinado usuário em determinado dia é necessariamente o horário em que o usuário logou em sua máquina?

Se não (ou mesmo assim) existe outra (melhor?) maneira de saber a que horas o usuário logou pela manhã?

    
por ℳ  . 03.06.2009 / 03:45

8 respostas

4

Se você está procurando o logon interativo em um determinado computador cliente, o evento longo nesse computador cliente é onde você precisa estar procurando. Um usuário que faz logon com, por exemplo, credenciais armazenadas em cache, não criará entradas no log de eventos de um controlador de domínio. Mesmo que você não esteja procurando por logons com credenciais armazenadas em cache, a configuração dos computadores clientes para a auditoria de eventos de logon e a pesquisa no log de eventos do computador cliente fornecerá as informações mais precisas e fáceis de localizar.

    
por 03.06.2009 / 03:54
4

Se você conhece a máquina em que seu usuário está conectado, tente psloggedon do Sysinternals Suite.

    
por 03.06.2009 / 05:26
3

Existe um atributo no objeto User do AD chamado Last-Logon-Timestamp. Ele é atualizado toda vez que um usuário efetua login, mas não é replicado mais do que a cada 14 dias, pois é destinado a ser usado para procurar contas mortas. Ele pode ser usado como um contador mais preciso se você quiser pesquisar cada DC no domínio para obter essas informações. A partir disso, você pode criar uma trilha de quando os usuários são autenticados no domínio sempre que isso acontece, não apenas pela manhã.

    
por 03.06.2009 / 04:58
2

Tirar a primeira pergunta do seu título "Como saber a que horas um usuário do domínio efetuou login" depende da plataforma na qual o usuário está efetuando login. Para o Windows 2000 / XP / 2003, o ID de evento 528 com o tipo de logon 2 mostrará os logons interativos de uma conta local ou de domínio. O LogParser é uma ótima ferramenta para analisar os logs de eventos de um grande número de máquinas e suporta um grande número de saídas. Por exemplo, você poderia usar o seguinte para consultar o log de segurança em uma máquina remota e enviar para um arquivo separado por guia:

c:>logparser.exe "select TimeGenerated, SID from \wksname\Security where EventID = 528" -i EVT -resolveSIDs:ON -q:ON -headers:off -o:TSV >> c:\UserLogons.txt

A consulta de eventos dos logs de segurança do Windows Vista / 2008/7 é um pouco diferente, já que o formato do arquivo de log foi alterado, bem como os IDs do evento. A identificação de evento 4624 com o tipo de logon 2 mostrará logins interativos bem-sucedidos. Podemos usar o wevtutil para consultar dados semelhantes e exibi-los no formato XML:

c:>wevtutil qe Security /q:"*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and Task=12544 and (EventID=4624)] and EventData[Data[@Name='LogonType']='2']]" /e:Events > c:\UserLogons.xml

Quanto a ver o evento ID 540 aparecer nos seus logs de eventos de segurança no seu controlador de domínio:

O evento 540 é registrado por alguns motivos diferentes. Assim, por exemplo, você pode ver o evento ID 540 com o tipo de logon 3 quando um recurso compartilhado é acessado pelo serviço do servidor. Aqui estão os tipos de logon para este ID de evento fornecido pela Microsoft:

2 Interativo Um usuário fez logon neste computador no console.

3 Rede Um usuário ou computador conectado a este computador pela rede.

4 Lote O tipo de logon em lote é usado por servidores em lotes, onde os processos podem ser executados em nome de um usuário sem a intervenção direta do usuário.

5 Service Um serviço foi iniciado pelo Service Control Manager.

7 Desbloquear Esta estação de trabalho foi desbloqueada.

8 NetworkCleartext Um usuário conectado a uma rede. A senha do usuário era passou para o pacote de autenticação em sua forma não combinada. A autenticação integrada empacota todas as credenciais de hash antes de enviá-las pela rede. As credenciais não atravessam a rede em texto simples (também chamado de texto não criptografado).

9 NewCredentials Um chamador clonou seu token atual e especificou novas credenciais para conexões de saída. A nova sessão de logon tem a mesma identidade local, mas usa credenciais diferentes para outras conexões de rede.

10 RemoteInteractive Um usuário fez logon neste computador remotamente usando os Serviços de Terminal ou uma conexão de Área de Trabalho Remota.

11 CachedInteractive Um usuário fez logon neste computador com credenciais de rede que foram armazenadas localmente no computador. O controlador de domínio não foi contatado para verificar as credenciais.

Caça feliz.

    
por 03.06.2009 / 07:11
2

Você poderia, em um script de logon, criar uma linha que grava um registro de data e hora em um arquivo em algum lugar?

Algo como?

net time > > \ server \ logonlogs \% username% .txt

    
por 03.06.2009 / 09:35
2

Desculpas pelo longo post, mas é isso que eu uso. Você provavelmente poderia simplificar isso um pouco:

' **********************************************************************
' AuditUsers
' ==========
'
'  UserAccountControl
'  SCRIPT                         0x0001 1
'  ACCOUNTDISABLE                 0x0002 2
'  HOMEDIR_REQUIRED               0x0008 8
'  LOCKOUT                        0x0010 16
'  PASSWD_NOTREQD                 0x0020 32
'  PASSWD_CANT_CHANGE             0x0040 64
'  ENCRYPTED_TEXT_PWD_ALLOWED     0x0080 128
'  TEMP_DUPLICATE_ACCOUNT         0x0100 256
'  NORMAL_ACCOUNT                 0x0200 512
'  INTERDOMAIN_TRUST_ACCOUNT      0x0800 2048
'  WORKSTATION_TRUST_ACCOUNT      0x1000 4096
'  SERVER_TRUST_ACCOUNT           0x2000 8192
'  DONT_EXPIRE_PASSWORD           0x10000 65536
'  MNS_LOGON_ACCOUNT              0x20000 131072
'  SMARTCARD_REQUIRED             0x40000 262144
'  TRUSTED_FOR_DELEGATION         0x80000 524288
'  NOT_DELEGATED                  0x100000 1048576
'  USE_DES_KEY_ONLY               0x200000 2097152
'  DONT_REQ_PREAUTH               0x400000 4194304
'  PASSWORD_EXPIRED               0x800000 8388608
'  TRUSTED_TO_AUTH_FOR_DELEGATION 0x1000000 16777216
'
'  objUser.get("userAccountControl")
' **********************************************************************

option explicit

' *** Global constants

const HKEY_CLASSES_ROOT   = &H80000000
const HKEY_CURRENT_USER   = &H80000001
const HKEY_LOCAL_MACHINE  = &H80000002
const HKEY_USERS          = &H80000003
const HKEY_CURRENT_CONFIG = &H80000005

const REG_SZ        = 1
const REG_EXPAND_SZ = 2
const REG_BINARY    = 3
const REG_DWORD     = 4
const REG_MULTI_SZ  = 7

' *** User account status flags

const SCRIPT                         = &H0001
const ACCOUNTDISABLE                 = &H0002
const HOMEDIR_REQUIRED               = &H0008
const LOCKOUT                        = &H0010
const PASSWD_NOTREQD                 = &H0020
const PASSWD_CANT_CHANGE             = &H0040
const ENCRYPTED_TEXT_PWD_ALLOWED     = &H0080
const TEMP_DUPLICATE_ACCOUNT         = &H0100
const NORMAL_ACCOUNT                 = &H0200
const INTERDOMAIN_TRUST_ACCOUNT      = &H0800
const WORKSTATION_TRUST_ACCOUNT      = &H1000
const SERVER_TRUST_ACCOUNT           = &H2000
const DONT_EXPIRE_PASSWORD           = &H10000
const MNS_LOGON_ACCOUNT              = &H20000
const SMARTCARD_REQUIRED             = &H40000
const TRUSTED_FOR_DELEGATION         = &H80000
const NOT_DELEGATED                  = &H100000
const USE_DES_KEY_ONLY               = &H200000
const DONT_REQ_PREAUTH               = &H400000
const PASSWORD_EXPIRED               = &H800000
const TRUSTED_TO_AUTH_FOR_DELEGATION = &H1000000

dim wsh_shell, wsh_env, domain_name, server_name
dim initial_ou, computer, last_logon, i

dim users(4, 1000) ' 0 = username, 1 = display_name, 2 = is_disabled, 3 = lastlogon_date, 4 = group membership
dim num_users
const MAX_USERS = 1000

wscript.echo "Audit users started at " & formatdatetime(now(), 0)

' *** Get the domain name

set wsh_shell = Wscript.CreateObject("Wscript.Shell")
set wsh_env   = wsh_shell.Environment("PROCESS")
domain_name   = wsh_env("USERDNSDOMAIN")
server_name   = wsh_env("COMPUTERNAME")
set wsh_env = nothing
set wsh_shell = nothing

' *** Open the Computers container

domain_name = split(domain_name, ".")

initial_ou = "LDAP://DC=" & domain_name(0)
for i = 1 to ubound(domain_name)
  initial_ou = initial_ou & ",DC=" & domain_name(i)
next

wscript.echo "Checking domain " & initial_ou

' *** Find all users

set initial_ou = GetObject(initial_ou)

num_users = 0
FindAllUsers initial_ou

' *** Post the data

for i = 0 to num_users-1
  wscript.echo users(0, i) & "," & users(1, i) & "," & users(2, i) & "," & users(3, i) & "," & users(4, i)
next

' *** All done

wscript.echo "Audit users finished at " & formatdatetime(now(), 0)

set initial_ou = nothing

wscript.quit 0


' **********************************************************************
' FindAllUsers
' ------------
' **********************************************************************

sub FindAllUsers(fau_OU)

  dim ou_name, user, user_dn, display_name, lastlogon_date
  dim ldap_user, group_array, i

  ou_name = fau_OU.distinguishedName

' *** First list users in this OU

  for each user in fau_OU
    if lcase(user.class) = "user" then
      user_dn = "LDAP://CN=" & user.displayName & "," & ou_name

' *** Check we haven't found too many users

      if num_users >= MAX_USERS then
        wscript.echo "WARNING: exceeded maximum number of users - " & cstr(MAX_USERS)
        exit for
      end if

' *** New user

      users(0, num_users) = lcase(user.samAccountName)

' *** Get the display name; error trap this because it can fail

      users(1, num_users) = ""

      on error resume next
      err = 0
      display_name = user.get("displayName")
      if err = 0 then users(1, num_users) = display_name
      on error goto 0

' *** Get the enabled/disabled status

      users(2, num_users) = user.get("UserAccountControl") and ACCOUNTDISABLE

      if users(2, num_users) = 0 then
        users(2, num_users) = "0"
      else
        users(2, num_users) = "1"
      end if

' *** Get the last logon date; this may fail so trap errors

      lastlogon_date = 0

      on error resume next
      set lastlogon_date = user.get("lastLogon")
      if err = 0 then
        if not isempty(lastlogon_date) then
          lastlogon_date = LongTimeToDate(lastlogon_date)
          if lastlogon_date < 0 then lastlogon_date = 0
        end if
      end if
      on error goto 0

      users(3, num_users) = formatdatetime(lastlogon_date, 0)

' *** Get the group membership

      users(4, num_users) = ""

      on error resume next

      err = 0
      set ldap_user = GetObject(user_dn)
      if err = 0 then
        on error goto 0

        group_array = ldap_user.MemberOf

        if not isempty(group_array) then
          if TypeName(group_array) = "String" then
            users(4, num_users) = group_array
          else
            for i = lbound(group_array) to ubound(group_array)
              if users(4, num_users) <> "" then users(4, num_users) = users(4, num_users) & ";"
              users(4, num_users) = users(4, num_users) & TrimGroupName(group_array(i))
            next
          end if
        end if

        set ldap_user = nothing
      end if

      on error goto 0

' *** Finished with this user

      num_users = num_users + 1
    end if
  next

' *** Now recurse into subcontainers

  for each user in fau_OU
    if lcase(user.class) = "organizationalunit" or lcase(user.class) = "container" then
      FindAllUsers user
    end if
  next

' *** All done

end sub


' **********************************************************************
' TrimGroupName
' -------------
' Turn the distinguished name into a simply group name
' **********************************************************************

function TrimGroupName(tgn_FullName)

  dim group_name, len_group, c

  TrimGroupName = ""
  group_name = ""

  len_group = len(tgn_FullName)
  if len_group < 4 then exit function

  for i = 4 to len_group
    c = mid(tgn_FullName, i, 1)
    if c = "," then exit for
    group_name = group_name + c
  next

  group_name = lcase(group_name)
  TrimGroupName = group_name

end function


' **********************************************************************
' LongTimeToDate
' --------------
' Convert the ADSI longint timestamp to a VBScript format date
' **********************************************************************

function LongTimeToDate(lt_Time)

  dim ltdate

  ltdate = lt_Time.HighPart * (2^32) + lt_Time.LowPart
  ltdate = ltdate / (60 * 10000000)
  ltdate = ltdate / 1440
  ltdate = ltdate + #1/1/1601#

  LongTimeToDate = ltdate

end function

JR

    
por 03.06.2009 / 12:32
1

Não relacionado à sua pergunta, mas por que não filtrar esses eventos, você não deve dar a mínima quando você tem esse nível de retornos de eventos, Erros com gravidade de 3 ou mais homem, não perca seu tempo! / p>     

por 03.06.2009 / 04:18
1

Se você não quiser percorrer seus logs de segurança, tente também o bloqueio de conta e as ferramentas de gerenciamento (link) . Isso adiciona uma página de propriedades extra aos detalhes da conta no ADUC, incluindo "hora do último logon".

    
por 03.06.2009 / 10:10