Eu escrevi um sistema para fazer exatamente isso no meu antigo emprego na Universidade. Ele usou a ferramenta% 7 do Windows 7/2008 para extrair um dump formatado em XML do log de segurança de cada controlador de domínio após um tempo específico e, em seguida, analisou esse arquivo XML para os eventos em que estou interessado.
wevtutil qe Security /r:$DC /q:"*[System[((EventID=$LogonID or EventID=$FLogonID or EventID=$LogoffID or EventID=$LockoutID) and TimeCreated[@SystemTime > '$LUFilterString'] and TimeCreated[@SystemTime < '$NowFilterString'] )]] "
Ele usava uma string de consulta com formatação XPath, portanto, eu apenas abria os eventos nos quais estava interessado (login, logoff, login com falha, bloqueio).
Em seguida, carregou os eventos processados em um banco de dados que também criei. Ele atualizou as informações de "último login" das estações de trabalho, bem como o campo "último login" para os usuários. Isso é compreensivelmente um processo em lote, embora um método em tempo real seja totalmente possível com mais habilidades em .Net do que eu possuo.
Foi útil. Conseguimos rastrear os eventos de login / out / lockout para um campus de 22.000 corpos quentes (6K dos quais estavam no campus a qualquer momento fazendo login). Durante os horários de pico, eu estava enviando quase 250.000 registros por hora.
Sim, muitos.
Uma operação registrada gera um fluxo contínuo de eventos de login nos controladores de domínio, e nós rastreamos todos eles. Era um banco de dados bastante ocupado, e acabei usando o bulk-insert para atualizar as tabelas quando elas eram executadas a cada 15 minutos.
Desde que deixou os dados em uma prática tabela do MS SQL, nós pudemos fornecer alguns dados úteis aos nossos funcionários de helpdesk. Por exemplo, qual estação (ou endereço IP) causou um bloqueio para um usuário, o último dia de estações de trabalho em que um usuário efetuou login e quais usuários efetuaram login em uma estação de trabalho específica.