Medición de tiempos de inicio de sesión de usuario de Windows 7

8

Un cliente me ha pedido que calcule los tiempos promedio de inicio de sesión para máquinas y usuarios. Hasta ahora, he descubierto que el evento registra algunas botas que tardan más que los umbrales establecidos por las claves que se encuentran en:

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

Pero las teclas parecen estar bloqueadas, por lo que no puedo editarlas para reducir los umbrales y garantizar el registro de cada arranque. ¿Hay algún método para encontrar los tiempos de inicio de sesión para cada inicio de sesión que sea lo suficientemente detallado como para decirle al usuario que está iniciando sesión y una posible información más detallada? Esto también debe ser lo suficientemente ligero como para ejecutarse en cada inicio de sesión y no causar efectos notables para el usuario .

Decad
fuente
¿Qué quieres decir con "bloqueado"? ¿Cuál es el mensaje cuando intentas cambiar los valores? ¿Comenzó Regadit "como Administrador" para eludir las limitaciones de los permisos de su cuenta actual o las restricciones establecidas por UAC?
the-wabbit
La edición de la clave mediante regedit run como administrador da como resultado, "No se puede editar BootMinorThreshold_Sec: Error al escribir los nuevos contenidos del valor".
Decad
Asegúrese de tener los permisos para cambiar los valores de esta clave. Compruebe también si su motor antivirus no está bloqueando los cambios en el registro por algún motivo insondable.
the-wabbit
Actualmente no se ejecuta ningún antivirus en esta máquina, ya que es una instalación nueva para realizar pruebas. Me estoy postulando como administrador local. ¿Hay alguna manera de verificar los permisos en las claves?
Decad
3
¿Cómo define el "tiempo de inicio de sesión del usuario"? ¿Es el momento entre el usuario valida su nombre de usuario + contraseña y el explorador está listo para iniciar un programa?
Gregory MOUSSAT

Respuestas:

4

Hace poco me pidieron que hiciera algo muy similar, pero que incluyera los tiempos de arranque y de inicio de sesión y permitiera referencias históricas. entonces el script de powershell a continuación hace lo siguiente:

  1. toma algunas variables de entorno
  2. obtiene el sello de fecha y hora para 4 entradas de registro de eventos diferentes. El segundo y el cuarto de estos no son mediciones exactas, pero después de una investigación bastante extensa, resolución de problemas y pruebas, están muy cerca y, por lo que he visto, son las mejores opciones.
  3. calcula la diferencia entre estos 4 eventos
  4. completa todos los números en una tabla SQL simple [podría adaptarse para canalizar los números a lo que quiera, por supuesto]

Por lo tanto, el script está destinado a ejecutarse mediante una tarea programada o en algún horario si tiene SCCM quizás (no durante el inicio de sesión para no cambiar el inicio de sesión). Lo bueno es que puede cambiar el nombre de la PC a cualquier otra cosa para ejecutarlo desde su propia PC y obtener los datos de una computadora remota (aunque el nombre de usuario aparecerá como propio) para solucionar problemas y verificar los números.

Di otro paso y usé SharePoint para crear una lista de datos externos (usando BCS) para que tengan una buena interfaz gráfica de usuario. Script a continuación, he dejado en la mayoría de las líneas comentadas que usé al escribirlo:

$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()

En esta última sección de SQL hay unas pocas líneas comentadas que ofrecen otro método (basado en seguridad) para ingresar a SQL sin necesidad de alguna contraseña en texto sin formato.

Jordan W.
fuente
La sincronización de tiempo después del arranque no parece estar sucediendo. Reinicié mi máquina de prueba y ejecuté el script. Obtuve -4,657.9 minutos para la duración de mi arranque. Debido a que la sincronización de tiempo data de hace 2 días.
Decad
Supongo que mis políticas de dominio están configuradas de manera diferente. Tenemos "siempre esperando la red ..." activada, podría ser el motivo. Además, si solo necesita iniciar sesión, puede comentar esas partes de arranque
Jordan W.
Este script solo multiplica la autenticación, no el inicio de sesión
Jim B
3

No estoy seguro de por qué alguien pensaría que un script lo ayudaría a determinar los tiempos de inicio de sesión (después de todo, no puede ejecutar el script hasta que alguien haya iniciado sesión, y los tiempos de extracción no ayudarán, ya que la deriva del tiempo ciertamente causaría un mal informe, lo que también no se corregirá hasta el procesamiento de inicio. La herramienta que le sugiero que use es la herramienta xperf del kit de herramientas de rendimiento. Desea ver los tiempos de exploración para el tiempo total de inicio de sesión. Consulte Análisis de rendimiento de transición de encendido / apagado de Windows para obtener explicaciones detalladas de qué sucede desde el arranque hasta el escritorio. Consulte las Herramientas de análisis de rendimiento de Windows para obtener xperf y xbootmgr de los lugares apropiados.

Jim B
fuente
Miré a xperf hace un tiempo. ¿Pero tuve la sensación de que se trataba más de una herramienta de depuración única? ¿Se puede configurar para ejecutarse para cada arranque y cada inicio de sesión?
Decad
podría, pero ¿por qué necesita medir cada arranque y cada inicio de sesión?
Jim B
Algunos usuarios han presentado quejas sobre los tiempos de inicio de sesión, quieren estar armados con los hechos cuando alguien se queja. A partir de ahora no tienen hechos que los respalden. Por lo tanto, quieren poder mostrar y monitorear los tiempos de inicio de sesión para los usuarios y las máquinas. IE machine0001: el tiempo de inicio de sesión promedio es de 10 segundos. El tiempo de inicio de sesión promedio del usuario joe blogs es de 8 segundos. Esto solo necesitaría ejecutarse durante el tiempo suficiente para obtener datos suficientes para obtener promedios lo suficientemente decentes.
Decad
Si tiene un problema intermitente, un promedio no lo ayudará. Cuando un usuario se queja, lo primero que debe observar es el registro de procesamiento de la política de grupo y ver si hay un problema (el 99% de las veces es un script). Después de eso, instalaría la herramienta, reiniciaría y volvería a iniciar sesión.
Jim B
Resolvemos casos intermitentes de manera similar a lo que sugiere y normalmente es un script. Sin embargo, quieren poder mostrar las cifras a los usuarios para ayudarles a mostrar que los tiempos de inicio de sesión no son tan malos como la reputación que tienen actualmente.
Decad
2

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

Este hilo muestra la forma "Microsoft" de diag de arranque utilizando las herramientas de análisis de rendimiento de Windows

Muy buen procedimiento documentado de Microsoft en "Rendimiento de transición de encendido / apagado", también conocido como encendido o apagado de Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Con estas herramientas oficiales, puede proporcionar una respuesta autorizada a su cliente. Muy superior a tratar de usar secuencias de comandos, en mi opinión. Puede ser un poco exagerado si sus necesidades son básicas.

También de ese hilo no te pierdas el sitio web de Soluto si tus necesidades son extremadamente básicas :)

Garrett
fuente
2

El siguiente archivo por lotes ejecutado como una secuencia de comandos de inicio de sesión le indicará cuánto tiempo lleva desde la autenticación hasta que el shell esté listo.

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

No he probado esto, y he hecho algunas suposiciones.

  1. El tiempo de inicio de sesión devuelto por net useres el momento en que el DC realizó la autenticación. Creo que este es el caso, pero no puedo encontrar nada concreto que lo respalde.
  2. El script de inicio de sesión se ejecuta a medida que se carga el shell del usuario. Este ciertamente es el caso si usa los scripts de inicio de sesión NT4 antiguos, a diferencia de los scripts de inicio de sesión definidos por las políticas de grupo, pero como los scripts de inicio de sesión de GPO se ejecutan ocultos para el usuario (de forma predeterminada), nunca he visto el momento en que son ejecutados
  3. Sus nombres de usuario no contienen espacios, puede que necesite poner %username%comillas si este es el caso.
  4. Tiene un recurso compartido de escritura mundial donde se registrarán los datos ( \\server\shareen el ejemplo anterior). Puede iniciar sesión localmente en máquinas individuales, pero eso hará que sea más difícil examinar los resultados.

Editar:

He actualizado el guión para lidiar con la deriva del tiempo que le preocupa a Jim. La hora de inicio de sesión desde el net usecomando se toma del reloj del controlador de dominio de autenticación. El net timecomando ahora también toma el tiempo del mismo servidor.

Bryan
fuente
Los GPO del usuario se aplican después de iniciar sesión pero antes de la ejecución del loginscript. Esta vez faltaría.
Tom
Si coloco este archivo por lotes en el inicio de las máquinas, creo que daría una lectura más aceptable.
Decad
@Decad iba a sugerir eso como una opción, pero pensé que sería más fácil implementar el script usando un script de inicio de sesión. Personalmente lo implementaría como un script de inicio de sesión heredado. es decir, a través de la Profilepestaña del diálogo de propiedad de la cuenta de usuario en ADU & C. Esto definitivamente se ejecuta cuando se carga el shell del explorador.
Bryan
Creo que los scripts se ejecutan durante explorerinit, (por eso los scripts de inicio de sesión ralentizan los inicios de sesión)
Jim B
@Decad He actualizado el script para eliminar cualquier posibilidad de deriva del tiempo.
Bryan