A melhor maneira de encontrar o computador em que o usuário fez o último login?


23

Espero que em algum lugar do Active Directory o "último logon do [computador]" seja gravado / armazenado ou haja um log que eu possa analisar?

O objetivo de querer saber o último PC conectado é oferecer suporte remoto pela rede - nossos usuários se movimentam com pouca frequência, mas eu gostaria de saber que tudo o que estou consultando estava atualizando naquela manhã (quando eles se conectaram , presumivelmente) no mínimo.

Também estou considerando scripts de logon que gravam os nomes de usuário e computador em um local conhecido que eu possa referenciar, mas alguns de nossos usuários não gostam de sair por 15 dias por vez.

Se houver uma solução elegante que use scripts de login, mencione-a definitivamente - mas se funcionar apenas para desbloquear a estação, isso seria ainda melhor!

Respostas:


26

Como parte do nosso script de logon, tenho essas informações (e mais) registradas em um compartilhamento oculto em um servidor, com um arquivo de log por usuário. Os scripts de logoff adicionam o tempo que o usuário efetuou logoff no mesmo arquivo de log. Fácil de configurar, sem custo e as informações estão disponíveis em um formato de fácil leitura.


Além disso, ao anexar ao log, você obtém um registro histórico, que pode ser muito útil às vezes.
31920 John Gardeniers

1
Implementado isso por enquanto, provavelmente passará para um vbs com mais recursos no futuro :) Até agora, usando um script de logon em lote MUITO simples: eco% date%,% time%,% username%, logon,% computername% >> \\ server \ logon $ \ logons.csv Abra com o Excel e pronto!
Garrett

O script de login é executado como o usuário; nesse caso, o usuário também pode entrar e modificar o log?
James Yale

@ James, é por isso que eu uso oculto um compartilhamento oculto para armazenar os logs. Obviamente, isso dependerá de como seus usuários são experientes, pois a localização pode ser obtida simplesmente lendo o script. Não tenho esse problema com meu conjunto atual de usuários. :)
John Gardeniers

1
Fiz algo semelhante, exceto que o script de logon fez uma chamada para um serviço web que atualizou um banco de dados. O banco de dados tinha um front-end da web para exibir o status atual. No entanto, era problemático para usuários móveis.
Nic

10

Fazemos isso via script de logon que atualiza a descrição do objeto de computador no AD.

Você precisa executar uma delegação de controle personalizada para permitir que "Usuários Autenticados" gravem a propriedade de descrição dos objetos de computador nos domínios.

Feito isso, tudo o que você precisa é de um script que gere as informações desejadas e grave as propriedades no objeto do computador. Esse script é atribuído como um script de logon por meio de um objeto de Diretiva de Grupo vinculado ao domínio.

Colocamos um carimbo de data / hora, nome de usuário e IP (s) no campo de descrição. O registro de data e hora é o primeiro porque facilita a visualização rápida de objetos de computador "antigos", classificando no campo de descrição.

Aqui está o script que eu escrevi para isso, se você quiser usá-lo como ponto de partida:

On Error Resume Next

Set objSysInfo = CreateObject("ADSystemInfo") 'Bind to AD
Set objNet = CreateObject("WScript.Network")

strCompDN = objSysInfo.ComputerName 'DN for computer, e.g. "CN=VISTAWORKSTATION,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objComp = GetObject("LDAP://" & strCompDN) 'IADsComputer object

strUserDN = objSysInfo.UserName 'DN for user, e.g. "CN=John Smith,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objUser = GetObject("LDAP://" & strUserDN) 'IADsUser object

strUsrLogin = LCase(objNet.UserName)

strNow = Now
strDateStamp = DatePart("yyyy",strNow) & _
    Right("0" & DatePart("m",strNow), 2) & _
    Right("0" & DatePart("d",strNow), 2) & _
    "@" & _
    Right("0" & DatePart("h",strNow), 2) & _
    Right("0" & DatePart("n",strNow), 2)

'RegExp object used to perform a simple match on IP address
Set objRE = New RegExp
objRE.IgnoreCase = True
'Note this regexp pattern isn't "correct" for matching an IPv4 address properly, but since WMI will return an
'array of IP addresses, this is sufficient to distinguish IPv4 vs IPv6
objRE.Pattern = "^\d+\.\d+\.\d+\.\d+$"

strIP = ""

'Connect to WMI and retreive all network adapters
Set objWMI = GetObject("winmgmts:")
Set colNICs = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

'Get the IP(s) assigned to whichever network adapter has our default gateway
If colNICs.Count > 0 Then
    For Each objNIC in colNICs
        If IsArray(objNIC.DefaultIPGateway) Then
            arrIP = objNIC.IPAddress
            For i = 0 To UBound(arrip)
                If objRE.Test(arrIP(i)) Then strIP = strIP & " " & arrIP(i)
            Next
            strMAC = objNIC.MACAddress
        End If  
    Next
End If

strIP = Trim(strIP)

objComp.Description = strDateStamp & " " & strUsrLogin & " " & strIP
objComp.Put "extensionAttribute1", strUsrLogin
objComp.Put "extensionAttribute2", strIP
objComp.Put "extensionAttribute3", strMAC

objComp.SetInfo

Como delegar usuários autenticados explique explicitamente as permissões ao objeto do campo de descrição no AD?
NULL.Dude

6

Eu tive que alcançar o mesmo resultado por razões semelhantes; de alguma forma, determinar de qual máquina um usuário específico efetuou login. Eu queria saber "antes do fato" e não consegui alterar os scripts de login do usuário, conforme discutido acima.
Usei o PowerShell no controlador de domínio em que o usuário estava se autenticando para analisar o log de eventos de segurança:

get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv

Abra o .csv com o excel ou o seu editor fav e procure a entrada mais recente que mostra o Nome da conta (nome de usuário) e o Endereço de rede de origem no mesmo evento.
Pode não ser uma solução 100% confiável (dependendo dos tempos de concessão do DHCP, etc.), mas funcionou para mim.


6

Você pode ativar a auditoria para eventos de logon da conta. Esses eventos (incluindo o desbloqueio da estação de trabalho) serão armazenados no log de segurança do controlador de domínio.

Também existem ferramentas de terceiros que podem facilitar isso, como True Last Logon .


4

Eu apenas escrevo o nome do usuário (assim como outras informações, como data e hora, algumas versões do programa etc.) na descrição do computador usando um script de logon. Dessa forma, eu posso obter todas as informações dos Usuários e Computadores do AD de maneira rápida e fácil, e como um bônus, tenho uma boa maneira de identificar quais PCs ainda no AD não são usados ​​há algum tempo (e, portanto, provavelmente máquinas mortas).


3

ThatGraemeGuy , obrigado pelo excelente script! Eu tive que reescrevê-lo no PowerShell, mas ainda funciona.

$CompDN = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$strCompDN = [string]([adsisearcher]$CompDN).FindOne().Properties.distinguishedname
$objComp = [ADSI]("LDAP://"+$strCompDN)

# quit if computer is a server or DC
if (($strCompDN -like '*Controller*') -or ($strCompDN -like '*SERVER*')) { exit }

$strUsrLogin = $env:username
$strDateStamp = Get-Date -f 'yyyy-MM-dd@HH:mm'
$IPPattern = "^\d+\.\d+\.\d+\.\d+$"

$colNICs = gwmi Win32_NetworkAdapterConfiguration
if ($colNICs.Count -gt 0) {
foreach ($objNIC in $colNICs){
        if ($objNIC.DefaultIPGateway) {
            $arrIP = $objNIC.IPAddress
            for ($i=0; $i -lt $colNICs.Count; $i++) { 
            if ($arrIP[$i] -match $IPPattern) { $strIP = $arrIP[$i]; $strMAC = $objNIC.MACAddress }
            }
        }
    }
}

$objComp.Description = $strDateStamp + " - " + $strUsrLogin + " - " + $strIP
$objComp.extensionAttribute1 = $strUsrLogin
$objComp.extensionAttribute2 = $strIP
$objComp.extensionAttribute3 = $strMAC
$objComp.SetInfo()

2

O truque para saber com certeza onde os usuários fizeram o último login, além das sugestões do Adam, é a agregação de logs. Se você tiver vários controladores de domínio, verifique todos eles ou centralize seu log e verifique o log único.

Algumas, talvez até a maioria das ferramentas de terceiros são inteligentes o suficiente para consultar todos os controladores de domínio. Mas se você está pensando em escrever um script para analisá-lo, não posso argumentar com força suficiente para centralizar seus logs.


1

Idealmente, você capturaria o seguinte para sua equipe do CSIRT para ajudar nas invstigações.

identificação do usuário efetuando login com o nome da estação de trabalho endereço MAC endereço IP Data / carimbo de data / hora tipo de login (rdp, interface etc.)

Em seguida, despeje isso em um comando sql em um banco de dados que eles possam consultar. Bits e partes são registrados em todo o lugar, mas gravar isso economiza tempo ao extrair os dados dos servidores DHCP / WINS, etc ...


1
Eu acho que isso é um pouco exagerado para "Ei, qual é o nome do computador do Donny?" mas talvez um dia estaremos nesse nível: P
Garrett

0

A única maneira de obter as informações mais recentes é através do forrageamento de log. Use uma ferramenta como o Microsoft Operations Manager ou ferramenta gratuita como o snare para agregar logs de eventos interessantes do servidor em um local central (arquivos de texto normais ou banco de dados SQL) e use ferramentas como analisador de log ou consultas SQL para gerar o relatório desejado.

para encontrar diferentes IDs de eventos para diferentes eventos, acesse Enciclopédia de Log de Eventos

Deixe-me saber, se você deseja seguir esta rota, eu posso ajudá-lo a criar as consultas apropriadas para o analisador de logs.


0

Se você está procurando uma referência histórica, pode experimentar uma ferramenta de terceiros, como o Logon Central, da Motivate Systems. Ele registra todos os logons de usuário do Active Directory e fornece uma interface da Web para mineração de dados. Ele também inclui alguns gráficos muito bons que convertem estatísticas de logon em porcentagem de uso.


0

ind Faça login no AD

Muitas vezes, precisamos saber se o login específico faz parte do grupo de usuários de anúncios. Ou, às vezes, precisamos conhecer um grupo do AD e querer saber quem todos os logins fazem parte dele.

Existem muitas maneiras diferentes de conseguir isso.

Sigo esta etapa para criar um atalho na minha área de trabalho, onde posso encontrar facilmente os logins. Siga o processo como

INICIAR-> EXECUTAR -> rundll32 dsquery, OpenQueryWindow

Você pode encontrar todo o AD do qual faz parte usando isso.

Iniciar-> Configurações-> Painel de Controle -> Ferramentas do Administrador -> Usuários e Computadores do Active Directory Selecione o Domínio em que deseja encontrar o login, clique com o botão direito do mouse nesse domínio e escolha a opção “Localizar”.


0

Eu adicionaria isso como um comentário à resposta de marcusjv acima, mas como não tenho reputação, uma resposta separada terá que ser feita:

Nessa expressão -E "Endereço de rede de origem" sempre será avaliado como TRUE

Eu acho que o que você precisa é: get-eventlog "Segurança" | onde {$ .Message-like "* nome de usuário *" -E $ .Message.contains ("Endereço de rede de origem")}

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.