Misurazione dei tempi di accesso dell'utente di Windows 7


8

Un cliente mi ha chiesto di calcolare i tempi medi di accesso per macchine e utenti. Finora ho scoperto che l'evento registra alcuni boot che impiegano più tempo delle soglie impostate dai tasti trovati su:

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

Ma le chiavi sembrano essere bloccate, quindi non posso modificarle per abbassare le soglie e garantire la registrazione di ogni avvio. Esistono metodi per trovare i tempi di accesso per ogni accesso sufficientemente dettagliati da dire all'utente che sta effettuando l'accesso e possibili informazioni più dettagliate, anche questo deve essere abbastanza leggero da essere eseguito su ogni accesso e non causare effetti evidenti all'utente .


Cosa intendi con "bloccato"? Qual è il messaggio quando provi a cambiare i valori? Hai avviato Regadit "come amministratore" per eludere le limitazioni delle autorizzazioni del tuo account corrente o le restrizioni stabilite da Controllo dell'account utente?
the-wabbit il

La modifica della chiave tramite regedit viene eseguita come risultati dell'amministratore, "Impossibile modificare BootMinorThreshold_Sec: errore durante la scrittura dei nuovi contenuti del valore."
Decade il

Assicurati di disporre delle autorizzazioni per modificare i valori di questa chiave. Controlla anche se il tuo motore antivirus non sta bloccando le modifiche del registro per qualche motivo insondabile.
the-wabbit il

Nessun antivirus attualmente in esecuzione su questa macchina in quanto è una nuova installazione per i test. Sto correndo come amministratore locale. C'è un modo per controllare le autorizzazioni sulle chiavi?
Decade il

3
Come si definisce il "tempo di accesso dell'utente"? Questo il tempo tra l'utente convalida il suo nome utente + password ed explorer è pronto per avviare un programma?
Gregory MOUSSAT,

Risposte:


4

Recentemente mi è stato chiesto di fare una cosa molto simile, ma di includere i tempi di avvio e accesso e consentire riferimenti storici. quindi lo script PowerShell di seguito esegue le seguenti operazioni:

  1. prende alcune variabili d'ambiente
  2. ottiene il timestamp data / ora per 4 voci diverse del registro eventi. Il 2 ° e il 4 ° di questi non sono misurazioni esatte, ma dopo una ricerca piuttosto approfondita, risoluzione dei problemi e test sono super vicini e da quello che ho visto, le migliori opzioni.
  3. calcola la differenza tra questi 4 eventi
  4. popola tutti i numeri in una semplice tabella SQL [è possibile adattarsi per convogliare i numeri in tutto ciò che si desidera ovviamente]

Quindi lo script deve essere eseguito tramite attività pianificata o in base a una pianificazione se si dispone forse di SCCM (non durante l'accesso per non modificare affatto l'accesso). la cosa bella è che puoi cambiare il nome PC in qualcos'altro per eseguirlo dal tuo PC e ottenere i dati da un computer remoto (anche se il nome utente verrebbe visualizzato come tuo) per risolvere i problemi e verificare i numeri.

Ho fatto un altro passo e ho usato SharePoint per creare un elenco di dati esterni (usando BCS) in modo che abbiano una buona interfaccia grafica front-end. Script di seguito, ho lasciato nella maggior parte delle righe commentate che ho usato durante la scrittura:

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

In quest'ultima sezione SQL sono presenti alcune righe commentate che offrono un altro metodo (basato sulla sicurezza) per immettere in SQL senza bisogno di password in testo normale.


La sincronizzazione temporale dopo l'avvio non sembra avvenire. Ho riavviato la mia macchina di prova ed eseguito lo script. Ho ottenuto -4.657,9 minuti per la durata del mio avvio. A causa della sincronizzazione temporale datata 2 giorni fa.
Decade il

Immagino che i miei criteri di dominio siano impostati in modo diverso. "Attendiamo sempre la rete ..." acceso, potrebbe essere il motivo. Inoltre, se hai bisogno solo della durata dell'accesso, puoi commentare quelle parti di avvio
Jordan W.

Questo script solo l'autenticazione non accede
Jim B

3

Non sono sicuro del motivo per cui qualcuno potrebbe pensare che uno script ti aiuti a determinare i tempi di accesso (dopotutto non puoi eseguire lo script fino a quando qualcuno non ha effettuato l'accesso e i tempi di estrazione non aiuteranno poiché la deriva del tempo causerebbe sicuramente una dichiarazione errata, che anche non sarebbe stato risolto fino al processo di avvio. Lo strumento che ti suggerirei di utilizzare è lo strumento xperf dal toolkit delle prestazioni. Desideri esaminare i tempi di esplorazione per il tempo di accesso totale. Vedi Analisi delle prestazioni di transizione di Windows On / Off per spiegazioni dettagliate di cosa succede dall'avvio al desktop. Vedere Strumenti di analisi delle prestazioni di Windows per ottenere xperf e xbootmgr dai punti appropriati.


Ho guardato xperf qualche tempo fa. Ma ho avuto la sensazione che questo fosse più uno strumento di debug unico? Può essere configurato per l'esecuzione per ogni avvio e ogni accesso?
Decade il

potrebbe, ma perché è necessario misurare ogni avvio e ogni accesso?
Jim B,

Alcuni utenti hanno denunciato i tempi di accesso, vogliono essere armati dei fatti quando qualcuno si lamenta. A partire da ora non hanno fatti per sostenerli. Quindi vogliono essere in grado di visualizzare e monitorare i tempi di accesso per utenti e macchine. IE machine0001 - il tempo medio di accesso è di 10 secondi. Il tempo medio di accesso dei blog degli utenti joe è di 8 secondi. Questo dovrebbe funzionare solo per il tempo necessario per ottenere dati sufficienti per ottenere medie abbastanza decenti.
Decade il

Se hai un problema intermittente, una media non ti aiuterà. Quando un utente si lamenta, la prima cosa da guardare sono i log di elaborazione dei criteri di gruppo e vedere se c'è un problema (il 99% delle volte è uno script). Dopo di che avrei installato lo strumento, riavviato e riaccedere.
Jim B,

Risolviamo casi intermittenti in un modo simile a quello che stai suggerendo ed è normalmente uno script. Tuttavia, vogliono essere in grado di mostrare le cifre agli utenti per mostrare loro che i tempi di accesso non sono così negativi come la reputazione che hanno attualmente.
Decad,

2

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

Questo thread mostra il modo "Microsoft" di avviare il diag utilizzando gli strumenti di analisi delle prestazioni di Windows

Ottima procedura documentata di Microsoft su "On / Off Transition Performance" ovvero accensione o spegnimento di Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Utilizzando questi strumenti ufficiali, puoi fornire una risposta autorevole al tuo cliente. Secondo me, di gran lunga superiore al tentativo di utilizzare gli script. Potrebbe essere leggermente eccessivo se le tue esigenze sono di base.

Anche da quella discussione non perdere il sito web di Soluto se le tue esigenze sono estremamente basilari :)


2

Il seguente file batch eseguito come uno script di accesso spiegherà in qualche modo quanto tempo impiega l'autenticazione alla shell per essere pronta.

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

Non l'ho testato e ho formulato alcune ipotesi.

  1. L'ora di accesso restituita net userè l'ora in cui il controller di dominio ha eseguito l'autenticazione. Credo che sia così, ma non riesco a trovare nulla di concreto per sostenerlo.
  2. Lo script di accesso viene eseguito al caricamento della shell dell'utente. Questo è certamente il caso se si utilizzano gli script di accesso NT4 legacy precedenti, al contrario degli script di accesso definiti dai criteri di gruppo, ma poiché gli script di accesso GPO vengono eseguiti nascosti dall'utente (per impostazione predefinita), non ho mai visto i tempi di quando vengono giustiziati.
  3. I tuoi nomi utente non contengono spazi, potrebbe essere necessario inserire le %username%virgolette se questo è il caso.
  4. Hai una condivisione scrivibile a livello mondiale in cui verranno registrati i dati ( \\server\sharenell'esempio sopra). È possibile registrarlo localmente su singoli computer, ma ciò renderà più difficile l'esame dei risultati.

Modificare:

Ho aggiornato la sceneggiatura per far fronte alla deriva temporale di cui si occupa Jim. L'ora di inizio dell'accesso dal net usecomando è ricavata dall'orologio del controller di dominio di autenticazione. Il net timecomando ora richiede anche il tempo dallo stesso server.


Gli oggetti Criteri di gruppo dell'utente vengono applicati dopo il login ma prima dell'esecuzione del loginscript. Questa volta mancherebbe.
Tom,

Se inserissi questo file batch nell'avvio delle macchine, darei una lettura più accettabile, penso?
Decade il

@Decad stavo per suggerirlo come opzione, ma ho pensato che sarebbe stato più semplice distribuire lo script usando uno script di accesso. Personalmente lo implementerei come uno script di accesso legacy. cioè tramite la Profilescheda della finestra di dialogo delle proprietà dell'account utente in ADU e C. Questo funziona sicuramente quando la shell di Explorer viene caricata.
Bryan,

Penso che gli script vengano eseguiti durante explorerinit, (motivo per cui gli script di login rallentano gli accessi)
Jim B

@Decad Ho aggiornato lo script per eliminare ogni possibilità di deriva del tempo.
Bryan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.