Messen der Anmeldezeiten von Windows 7-Benutzern

8

Ich wurde von einem Kunden gebeten, die durchschnittlichen Anmeldezeiten für Maschinen und Benutzer zu berechnen. Bisher habe ich festgestellt, dass das Ereignis einige Starts protokolliert, die länger dauern als die Schwellenwerte, die mit den Schlüsseln unter:

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

Die Schlüssel scheinen jedoch gesperrt zu sein, sodass ich sie nicht bearbeiten kann, um die Schwellenwerte zu senken und die Protokollierung bei jedem Start sicherzustellen. Gibt es Methoden zum Ermitteln der Anmeldezeiten für jede Anmeldung, die ausführlich genug sind, um dem angemeldeten Benutzer mitzuteilen, und möglicherweise detailliertere Informationen, muss diese auch leicht genug sein, um bei jeder Anmeldung ausgeführt zu werden, und keine spürbaren Auswirkungen auf den Benutzer haben .

Dekad
quelle
Was meinst du mit "gesperrt"? Was ist die Meldung, wenn Sie versuchen, die Werte zu ändern? Haben Sie Regadit "als Administrator" gestartet, um die Einschränkungen der Berechtigungen Ihres aktuellen Kontos oder die von der Benutzerkontensteuerung festgelegten Einschränkungen zu umgehen?
The-Wabbit
Das Bearbeiten des Schlüssels über regedit run als Administrator führt zu "BootMinorThreshold_Sec kann nicht bearbeitet werden: Fehler beim Schreiben des neuen Inhalts des Werts."
30.
Stellen Sie sicher, dass Sie über die Berechtigungen zum Ändern der Werte dieses Schlüssels verfügen . Überprüfen Sie auch, ob Ihre Antiviren-Engine Registrierungsänderungen aus unerfindlichen Gründen nicht blockiert.
The-Wabbit
Derzeit wird auf diesem Computer kein Virenschutzprogramm ausgeführt, da es sich um eine Neuinstallation zum Testen handelt. Ich arbeite als lokaler Administrator. Gibt es eine Möglichkeit, die Berechtigungen für die Schlüssel zu überprüfen?
30.
3
Wie definieren Sie "Benutzeranmeldezeit"? Ist die Zeit zwischen der Überprüfung des Benutzernamens und des Kennworts durch den Benutzer und dem Explorer bereit, ein Programm zu starten?
Gregory MOUSSAT

Antworten:

4

Ich wurde kürzlich gebeten, etwas sehr Ähnliches zu tun, aber Start- und Anmeldezeiten anzugeben und historische Referenzen zu berücksichtigen. Das folgende Powershell-Skript führt also Folgendes aus:

  1. greift auf einige Umgebungsvariablen zu
  2. Ruft den Zeit- / Datumsstempel für 4 verschiedene Ereignisprotokolleinträge ab. Die 2. und 4. davon sind keine exakten Messungen, aber nach ziemlich umfangreichen Recherchen, Fehlerbehebung und Tests sind sie sehr nah und nach dem, was ich gesehen habe, die besten Optionen.
  3. berechnet die Differenz zwischen diesen 4 Ereignissen
  4. füllt alle Zahlen in eine einfache SQL-Tabelle [Sie können sie natürlich anpassen, um die Zahlen in alles zu leiten, was Sie wollen]

Das Skript soll also über eine geplante Aufgabe oder nach einem bestimmten Zeitplan ausgeführt werden, wenn Sie möglicherweise über SCCM verfügen (nicht während der Anmeldung, um die Anmeldung überhaupt nicht zu ändern). Das Schöne ist, dass Sie den PC-Namen in einen anderen Namen ändern können, um ihn von Ihrem eigenen PC aus auszuführen und die Daten von einem Remotecomputer abzurufen (obwohl der Benutzername als Ihr eigener angezeigt wird), um Fehler zu beheben und die Nummern zu überprüfen.

Ich habe einen weiteren Schritt unternommen und SharePoint verwendet, um eine Liste externer Daten (mit BCS) zu erstellen, damit diese eine schöne Front-End-Benutzeroberfläche haben. Skript unten, ich habe in den meisten kommentierten Zeilen, die ich beim Schreiben verwendet habe, verlassen:

$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 diesem letzten SQL-Abschnitt gibt es einige auskommentierte Zeilen, die eine andere Methode (sicherheitsbasiert) für die Eingabe in SQL anbieten, ohne dass ein Kennwort im Klartext erforderlich ist.

Jordan W.
quelle
Die Zeitsynchronisierung nach dem Start scheint nicht zu erfolgen. Ich habe meinen Testcomputer neu gestartet und das Skript ausgeführt. Ich habe -4.657,9 Minuten für meine Startdauer. Aufgrund der Zeitsynchronisation vor 2 Tagen.
Dekad
Ich denke, meine Domain-Richtlinien sind anders eingerichtet. Wir haben "immer auf das Netzwerk warten .." eingeschaltet, könnte der Grund sein. Auch wenn Sie nur auf Dauer einzuloggen müssen Sie diese Boot-up - Teile Kommentar konnte
Jordan W.
Dieses Skript nur mal Authentifizierung nicht Anmeldung
Jim B
3

Ich bin mir nicht sicher, warum irgendjemand glauben würde, ein Skript würde Ihnen dabei helfen, die Anmeldezeiten zu bestimmen (schließlich können Sie das Skript erst ausführen, wenn sich jemand angemeldet hat, und das Abrufen von Zeiten hilft nicht weiter, da Zeitverschiebungen sicherlich zu Fehlmeldungen führen würden - was auch würde erst nach dem Start der Verarbeitung behoben werden. Das Tool, das Sie verwenden sollten, ist das xperf-Tool aus dem Performance-Toolkit. Sie möchten die Explorerinit-Zeiten für die Gesamtanmeldezeit anzeigen. Ausführliche Erläuterungen zu finden Sie unter Windows On / Off Transition Performance Analysis Was passiert vom Booten bis zum Desktop ? Informationen zum Abrufen von xperf und xbootmgr von den entsprechenden Stellen finden Sie unter Windows-Tools zur Leistungsanalyse .

Jim B.
quelle
Ich habe vor einiger Zeit in xperf geschaut. Aber ich hatte das Gefühl, dass dies eher ein einmaliges Debugging-Tool war? Kann es so eingerichtet werden, dass es für jeden Start und jede Anmeldung ausgeführt wird?
Dekad
es könnte, aber warum müssen Sie jeden Start und jedes Login messen?
Jim B
Einige Benutzer haben sich über Anmeldezeiten beschwert. Sie möchten mit den Fakten bewaffnet sein, wenn sich jemand darüber beschwert. Bis jetzt haben sie keine Fakten, um sie zu sichern. Sie möchten daher in der Lage sein, Anmeldezeiten für Benutzer und Maschinen anzuzeigen und zu überwachen. IE machine0001 - Die durchschnittliche Anmeldezeit beträgt 10 Sekunden. Benutzer Joe Blogs durchschnittliche Anmeldezeit beträgt 8 Sekunden. Dies müsste nur lange genug laufen, um genügend Daten zu erhalten, um ausreichend gute Durchschnittswerte zu erhalten.
Dekad
Wenn Sie ein zeitweise auftretendes Problem haben, hilft Ihnen ein Durchschnitt nicht weiter. Wenn sich ein Benutzer beschwert, müssen Sie zunächst die Protokolle zur Verarbeitung von Gruppenrichtlinien überprüfen und feststellen, ob ein Problem vorliegt (in 99% der Fälle handelt es sich um ein Skript). Danach würde ich das Tool installieren, neu starten und sie erneut anmelden lassen.
Jim B
Wir lösen intermittierende Fälle auf ähnliche Weise, wie Sie es vorschlagen, und es handelt sich normalerweise um ein Skript. Sie möchten den Benutzern jedoch die Zahlen anzeigen können, um ihnen zu zeigen, dass die Anmeldezeiten nicht so schlecht sind wie der Ruf, den sie derzeit haben.
5.
2

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

Dieser Thread zeigt die "Microsoft" -Methode zum Booten von Diag mit Windows Performance Analysis Tools

Sehr gut dokumentiertes Verfahren von Microsoft zum Ein- und Ausschalten der Übergangsleistung, auch bekannt als Ein- oder Ausschalten von Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Mit diesen offiziellen Tools können Sie Ihrem Kunden eine maßgebliche Antwort geben. Meiner Meinung nach weit überlegen als der Versuch, Skripte zu verwenden. Kann etwas übertrieben sein, wenn Ihre Bedürfnisse grundlegend sind.

Auch von diesem Thread verpassen Sie nicht Solutos Website, wenn Ihre Bedürfnisse extrem einfach sind :)

Garrett
quelle
2

Die folgende Batch-Datei, die als Anmeldeskript ausgeführt wird, zeigt Ihnen, wie lange es von der Authentifizierung bis zur Fertigstellung der Shell dauert.

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

Ich habe dies nicht getestet und einige Annahmen getroffen.

  1. Die zurückgegebene Anmeldezeit net userist die Zeit, zu der der DC die Authentifizierung durchgeführt hat. Ich glaube, dass dies der Fall ist, kann aber nichts Konkretes finden, um dies zu belegen.
  2. Das Anmeldeskript wird ausgeführt, während die Benutzer-Shell geladen wird. Dies ist sicherlich der Fall, wenn Sie ältere ältere NT4-Anmeldeskripts verwenden, im Gegensatz zu den durch Gruppenrichtlinien definierten Anmeldeskripten. Da die Gruppenrichtlinienobjekt-Anmeldeskripts jedoch (standardmäßig) vor dem Benutzer verborgen ausgeführt werden, habe ich nie gesehen, wann sie werden ausgeführt.
  3. Ihre Benutzernamen enthalten keine Leerzeichen. In %username%diesem Fall müssen Sie möglicherweise Anführungszeichen setzen .
  4. Sie haben eine weltweit beschreibbare Freigabe, in der die Daten protokolliert werden ( \\server\shareim obigen Beispiel). Sie können es lokal auf einzelnen Computern protokollieren, dies erschwert jedoch die Überprüfung der Ergebnisse.

Bearbeiten:

Ich habe das Skript aktualisiert, um die Zeitverschiebung zu behandeln, mit der sich Jim befasst. Die Anmeldestartzeit vom net useBefehl wird von der Uhr des authentifizierenden Domänencontrollers übernommen. Der net timeBefehl benötigt jetzt auch die Zeit vom selben Server.

Bryan
quelle
Die Benutzer-Gruppenrichtlinienobjekte werden nach der Anmeldung, jedoch vor der Ausführung des Anmeldeskripts angewendet. Diese Zeit würde fehlen.
Tom
Wenn ich diese Batchdatei beim Start des Computers platzieren würde, würde dies meiner Meinung nach eine akzeptablere Lesart ergeben.
Dekad
@Decad Ich wollte dies als Option vorschlagen, dachte aber, es wäre einfacher, das Skript mithilfe eines Anmeldeskripts bereitzustellen. Persönlich würde ich es als Legacy-Anmeldeskript bereitstellen. dh über die ProfileRegisterkarte des Benutzerkontoeigenschaftsdialogs in ADU & C. Dies läuft definitiv, wenn die Explorer-Shell geladen wird.
Bryan
Ich denke, dass Skripte während explorerinit ausgeführt werden (weshalb Anmeldeskripte die Anmeldungen verlangsamen)
Jim B
@Decad Ich habe das Skript aktualisiert, um Zeitverschiebungen auszuschließen.
Bryan