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

8

Um cliente me pediu para calcular o tempo médio de login de 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 chaves parecem estar bloqueadas, então 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 logon suficientemente detalhado para informar ao usuário que está efetuando login e possíveis informações mais detalhadas, isso também precisa ser leve o suficiente para ser executado em todos os logon e não causar efeitos visíveis ao usuário .

Década
fonte
O que você quer dizer com "trancado"? Qual é a mensagem quando você tenta alterar os valores? Você iniciou o Regadit "como administrador" para contornar as limitações das permissões da sua conta atual ou as restrições definidas pelo UAC?
the-wabbit 30/01
A edição da chave via regedit é executada quando o administrador resulta em "Não é possível editar o BootMinorThreshold_Sec: Erro ao gravar o novo conteúdo do valor. '
Decad
Verifique se você tem permissões para alterar os valores dessa chave. Verifique também se o seu mecanismo antivírus não está bloqueando as alterações do registro por algum motivo insondável.
the-wabbit 30/01
Nenhum antivírus atualmente em execução nesta máquina, pois é uma nova instalação para teste. Estou executando como administrador local. Existe uma maneira de verificar as permissões nas chaves?
Decad
3
Como você define "tempo de login do usuário"? Esse tempo entre o usuário valida seu nome de usuário + senha e o explorer está pronto para iniciar um programa?
Gregory MOUSSAT 30/01

Respostas:

4

Recentemente, fui convidado a fazer uma coisa muito semelhante, mas a incluir tempos de inicialização e logon e permitir referência histórica. portanto, o script do PowerShell abaixo faz o seguinte:

  1. pega algumas variáveis ​​de ambiente
  2. obtém o registro de data e hora para 4 entradas diferentes no log de eventos. O segundo e o quarto deles não são medições exatas, mas após 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 se adaptar para canalizar os números para o que quiser, é claro]

Portanto, o script deve ser executado via tarefa agendada ou em algum agendamento, se você tiver o SCCM, talvez (não durante o logon para não alterar o logon). o bom é que você pode alterar o nome do PC para qualquer outra coisa para executá-lo no 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 outro passo e usei o SharePoint para criar uma lista de dados externos (usando o BCS) para que eles tenham uma ótima interface gráfica de front-end. Script abaixo, deixei na maioria das linhas comentadas que usei enquanto escrevia:

$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 inserir no SQL sem precisar de uma senha em texto sem formatação.

Jordan W.
fonte
A sincronização de tempo após a inicialização não parece estar acontecendo. Reiniciei minha máquina de teste e executei o script. Eu tenho -4.657,9 minutos para a duração da minha inicialização. Devido à sincronização horária datada de 2 dias atrás.
Decad
Acho que minhas políticas de domínio estão configuradas de maneira diferente. "Sempre esperamos a rede .." ativada, pode ser o motivo. Além disso, se você precisar apenas de uma duração de logon, poderá comentar essas partes de inicialização
Jordan W.
Este script apenas vezes a autenticação não faz logon
Jim B
3

Não sei por que alguém pensaria que um script o ajudaria a determinar os horários de logon (afinal, você não pode executar o script até que alguém faça logon, e os tempos de extração não ajudarão, pois o desvio do tempo certamente causaria erros de relatório - o 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ê deseja examinar os tempos de exploração em minutos para obter o tempo total de logon. Consulte Análise de desempenho de transição de ativação / desativação do Windows para obter explicações detalhadas sobre o que acontece da inicialização ao desktop.Veja Ferramentas de Análise de Desempenho do Windows para obter xperf e xbootmgr nos locais apropriados.

Jim B
fonte
Eu olhei para o xperf há um tempo. Mas tive a sensação de que essa era mais uma ferramenta única de depuração? Pode ser configurado para ser executado a cada inicialização e a cada login?
Decad
poderia, mas por que você precisa medir cada inicialização e cada login?
Jim B
Alguns usuários têm recebido elogios sobre o horário de login, eles querem estar armados com os fatos quando alguém reclama disso. A partir de agora eles não têm fatos para apoiá-los. Portanto, eles desejam exibir e monitorar os horários de login dos usuários e das máquinas. IE machine0001 - o tempo médio de logon é de 10 segundos. O tempo médio de login do usuário joe blogs é de 8 segundos. Isso só precisaria ser executado por tempo suficiente para obter dados suficientes para obter médias decentes o suficiente.
Decad
Se você tiver um problema intermitente, uma média não ajudará. Quando um usuário reclama, a primeira coisa a observar é o log de processamento da política de grupo e verifica se há algum problema (99% do tempo é um script). Depois disso, instalei a ferramenta, reinicie e faça o login novamente.
Jim B
Resolvemos casos intermitentes de maneira semelhante à sugerida e normalmente é um script. No entanto, eles querem poder exibir os números aos usuários para ajudar a mostrar que os tempos de login não são tão ruins quanto a reputação que eles têm atualmente.
Decad
2

/superuser/250267/how-to-diagnose-slow-booting-or-logon-in-windows-7

Este tópico mostra o modo de inicialização da Microsoft "diag" usando as Ferramentas de Análise de Desempenho do Windows

Procedimento documentado muito bom da Microsoft sobre "Desempenho de transição ativado / desativado", também conhecido como ativar ou desativar o Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

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

Também a partir desse tópico, não perca o site de Soluto se suas necessidades forem extremamente básicas :)

Garrett
fonte
2

O seguinte arquivo em lotes, executado como um script de logon, ajudará você a dizer quanto tempo leva para a autenticação estar pronta para o shell.

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

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

  1. O horário de logon retornado por net useré o horário em que o controlador de domínio executou a autenticação. Acredito que seja esse o caso, mas não consigo encontrar nada concreto para sustentar isso.
  2. O script de logon é executado conforme o shell do usuário é carregado. Esse certamente é o caso se você usar os scripts de logon NT4 herdados mais antigos, em oposição aos scripts de logon definidos pelas diretivas de grupo, mas como os scripts de logon do GPO são ocultados pelo usuário (por padrão), nunca vi o momento em que eles são executados.
  3. Seus nomes de usuário não contêm espaços; talvez seja necessário colocar %username%aspas, se for o caso.
  4. Você tem um compartilhamento gravável mundial em que os dados serão registrados ( \\server\shareno exemplo acima). Você pode registrá-lo localmente em máquinas individuais, mas isso dificultará a análise dos resultados.

Editar:

Atualizei o script para lidar com o desvio de tempo com o qual Jim está preocupado. A hora de início do logon do net usecomando é obtida no relógio do controlador de domínio autenticado. O net timecomando agora também leva o tempo do mesmo servidor.

Bryan
fonte
Os GPOs do usuário são aplicados após o login, mas antes da execução do script de logon. Este tempo estaria faltando.
Tom
Se eu colocasse esse arquivo em lotes na inicialização das máquinas, daria uma leitura mais aceitável, eu acho?
Decad
@ Decad eu ia sugerir isso como uma opção, mas achei que seria mais fácil implantar o script usando um script de logon. Pessoalmente, eu o implantaria como um script de logon herdado. ou seja, através da Profileguia da caixa de diálogo de propriedades da conta do usuário em ADU & C. Definitivamente, isso é executado conforme o shell do Explorer é carregado.
187 Bryan
Eu acho que executar scripts durante explorerinit, (que é por isso que scripts de login retardar logins)
Jim B
@ Decad Atualizei o script para eliminar qualquer chance de desvio de tempo.
Bryan