Medindo os tempos de login do usuário do Windows 7

8

Fui solicitado por um cliente para calcular os tempos médios de login para máquinas e usuários. Até agora, descobri que o evento registra algumas inicializações que demoram mais do que os limites definidos pelas chaves encontradas em:

HKLM\Software\Microsoft\Windows\CurrentVersion\Diagnostics\Performance\Boot

Mas as teclas parecem estar bloqueadas, por isso não posso editá-las para reduzir os limites para garantir o registro de cada inicialização. Existe algum método para encontrar tempos de login para cada log que é verboso o suficiente para informar ao usuário que está efetuando login e informações mais detalhadas possíveis, isso também precisa ser leve o suficiente para ser executado em cada login e não causar efeitos perceptíveis ao usuário .

    
por Decad 30.01.2012 / 01:09

4 respostas

4

Recentemente, fui solicitado a fazer uma coisa muito semelhante, mas incluir tempos de inicialização e logon e permitir referências históricas. então, o script do powershell abaixo faz o seguinte:

  1. pega algumas variáveis de ambiente
  2. obtém o carimbo de data e hora para 4 entradas de log de eventos diferentes. O segundo e o quarto não são medições exatas, mas depois de uma extensa pesquisa, solução de problemas e testes, eles são super próximos e pelo que vi, as melhores opções.
  3. calcula a diferença entre esses 4 eventos
  4. preenche todos os números em uma tabela SQL simples [você pode adaptar-se a canalizar os números para qualquer coisa que você queira, é claro]

Portanto, o script deve ser executado por meio de uma tarefa agendada ou em algum agendamento se você tiver o SCCM, talvez (não durante o logon para não alterar o logon). O legal é que você pode mudar o PCname para qualquer outra coisa para executá-lo em seu próprio PC e obter os dados de um computador remoto (embora o nome de usuário apareça como seu) para solucionar problemas e verificar os números.

Eu dei mais um passo e usei o SharePoint para criar uma lista de dados externos (usando o BCS) para que eles tivessem uma interface gráfica agradável. Script abaixo, deixei na maioria das linhas comentadas que usei enquanto escrevo:

$USER = $env:username.ToUpper()
$COMPUTER = $env:computername.ToUpper()
$Current_Time = Get-Date
$PCname = ''
$addedtime = 0

#1. get event time of last OS load
$filterXML = @'
<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Microsoft-Windows-Kernel-General'] and (Level=4 or Level=0) and (EventID=12)]]</Select>
  </Query>
</QueryList>
'@
$OSLoadTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML).timecreated
#Write-Host $PCname
#Write-Host "1. Last System Boot @ " $OSLoadTime

#2. Get event time of Time-Service [pre-Ctrl+Alt-Del] after latest OS load
$filterXML = @'
<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Microsoft-Windows-Time-Service'] and (Level=4 or Level=0) and (EventID=35)]]</Select>
  </Query>
</QueryList>
'@
$CtrlAltDelTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML).timecreated
#Write-Host "2. Time-sync after Boot @ " $CtrlAltDelTime
#get minutes (rounded to 1 decimal) between OS load time and 1st load of GPOs
$BootDuration = "{0:N1}" -f ((($CtrlAltDelTime - $OSLoadTime).TotalSeconds + $addedtime)/60)

#3. get event time of 1st successful logon
$filterXML = @'
<QueryList>
  <Query Id="0" Path="System">
    <Select Path="System">*[System[Provider[@Name='Microsoft-Windows-Winlogon'] and (Level=4 or Level=0) and (EventID=7001)]]</Select>
  </Query>
</QueryList>
'@
$LogonDateTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML -ErrorAction SilentlyContinue).timecreated

If ($LogonDateTime) { 
    #Write-Host "3. Successful Logon @ " $LogonDateTime 
    } 
    Else {
    #Write-Host "Duration of Bootup = " $BootDuration "minutes" -foregroundcolor blue -BackgroundColor white
    #Write-Host $PCname "has not logged back in." -foregroundcolor red -BackgroundColor white
    Exit
    }
#Write-Host "Duration of Bootup = " $BootDuration "minutes" -foregroundcolor blue -BackgroundColor white

#4. Get Win License validated after logon (about same time as explorer loads)
$filterXML = @'
<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[Provider[@Name='Microsoft-Windows-Winlogon'] and (Level=4 or Level=0) and (EventID=4101)]]</Select>
  </Query>
</QueryList>
'@
$DesktopTime=(Get-WinEvent -ComputerName $PCname -MaxEvents 1 -FilterXml $filterXML).timecreated
$LogonDuration = "{0:N1}" -f ((($DesktopTime - $LogonDateTime).TotalSeconds + $addedtime)/60)
#Write-Host "4. WinLicVal after Logon @ " $DesktopTime
#Write-Host "Duration of Logon = " $LogonDuration "minutes" -foregroundcolor blue -BackgroundColor white

#START SQL Injection Section
[void][reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")

$sqlServer = "SQLserver01"
$dbName = "BootUpTimes"
$tbl = "tblBootUpTimes"
#$srv = New-Object Microsoft.SqlServer.Management.Smo.Server $sqlServer
#$db = $srv.databases[$dbName]
#$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=$sqlServer;Initial Catalog=$dbName; Integrated Security=SSPI")
$conn = New-Object System.Data.SqlClient.SqlConnection("server=$sqlServer;database=$dbName;Password=plaintext;User Id=BootUpTimes")
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "INSERT INTO $tbl VALUES ('$Current_Time','$USER','$COMPUTER','$OSLoadTime','$CtrlAltDelTime','$BootDuration','$LogonDateTime','$DesktopTime','$LogonDuration')"
Try
{
$null = $cmd.ExecuteNonQuery()
}
Catch
{
}
$conn.Close()

Nesta última seção SQL, há algumas linhas comentadas que oferecem outro método (baseado em segurança) para entrada no SQL sem precisar de alguma senha em texto simples.

    
por 02.02.2012 / 15:43
3

Não sei por que alguém pensaria que um script o ajudaria a determinar os tempos de logon (afinal de contas, você não pode executar o script até que alguém tenha feito logon e os tempos de extração não ajudarão, pois o tempo certamente causaria relatórios incorretos) -que também não seria corrigido até o processamento de inicialização.A ferramenta que eu sugiro que você use é a ferramenta xperf do kit de ferramentas de desempenho.Você quer olhar para explorerinit vezes para o tempo total de logon.ver Windows On / Off Análise de desempenho de transição para explicações detalhadas sobre o que acontece da inicialização ao desktop. Consulte Windows Performance Analysis Tools para obter o xperf e o xbootmgr dos locais apropriados.

    
por 03.02.2012 / 01:48
2

link

Este tópico mostra a maneira "Microsoft" de usar o boot diag usando as Ferramentas de Análise de Desempenho do Windows

Muito bom procedimento documentado da Microsoft sobre "On / Off Transition Performance", também conhecido como ligar ou desligar o Windows: link

Usando essas ferramentas oficiais, você pode fornecer uma resposta oficial ao seu cliente. Muito superior a tentar usar scripts, na minha opinião. Pode ser um pouco exagerado se suas necessidades forem básicas.

Além disso, não perca o site do Soluto se suas necessidades forem extremamente básicas:)

    
por 03.02.2012 / 18:37
2

O seguinte arquivo em lote, executado como um script de logon, informará quanto tempo leva da autenticação até o shell estar pronto.

set logfile=\server\share\%computername%-%username%.log
net user /domain %username% | find /I "Last logon" > %logfile%
net time %logonserver% >> %logfile%

Eu não testei isso e fiz algumas suposições.

  1. O tempo de logon retornado por net user é o tempo que o DC executou a autenticação. Eu acredito que este é o caso, mas não consigo encontrar nada de concreto para comprovar isso.
  2. O script de logon é executado conforme o shell do usuário é carregado. Isso certamente é o caso se você usar os antigos scripts de logon NT4 legados, ao contrário dos scripts de logon definidos por diretivas de grupo, mas como os scripts de logon do GPO são executados ocultos do usuário (por padrão), nunca vi o tempo de quando eles são executados.
  3. Seus nomes de usuários não contêm espaços, você pode precisar colocar %username% entre aspas se esse for o caso.
  4. Você tem um compartilhamento mundial gravável onde os dados serão registrados ( \server\share no exemplo acima). Você pode registrá-lo localmente em máquinas individuais, mas isso dificultará a análise dos resultados.

Editar:

Eu atualizei o script para lidar com o tempo que Jim está preocupado. A hora de início de logon do comando net use é obtida do relógio do controlador de domínio de autenticação. O comando net time agora também leva o tempo do mesmo servidor.

    
por 02.02.2012 / 13:30