Mesurer les temps de connexion des utilisateurs de Windows 7

8

Un client m'a demandé de calculer les temps de connexion moyens pour les machines et les utilisateurs. Jusqu'à présent, j'ai constaté que l'événement enregistre certains démarrages qui prennent plus de temps que les seuils définis par les clés trouvées à:

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

Mais les clés semblent être verrouillées, je ne peux donc pas les modifier pour abaisser les seuils afin d'assurer la journalisation de chaque démarrage. Existe-t-il des méthodes pour trouver des temps de connexion pour chaque connexion suffisamment verbeux pour indiquer à l'utilisateur qui se connecte et éventuellement des informations plus détaillées, cela doit également être suffisamment léger pour s'exécuter à chaque connexion et ne pas causer d'effets notables à l'utilisateur .

Décade
la source
Qu'entendez-vous par «verrouillé»? Quel est le message lorsque vous essayez de modifier les valeurs? Avez-vous démarré Regadit "en tant qu'administrateur" pour contourner les limitations des autorisations de votre compte actuel ou les restrictions définies par l'UAC?
the-wabbit
La modification de la clé via regedit exécutée en tant qu'administrateur entraîne «Impossible de modifier BootMinorThreshold_Sec: erreur lors de l'écriture du nouveau contenu de la valeur».
2012
Assurez-vous que vous disposez des autorisations pour modifier les valeurs de cette clé. Vérifiez également si votre moteur antivirus ne bloque pas les modifications du registre pour une raison insondable.
le-wabbit du
Aucun antivirus en cours d'exécution sur cette machine car il s'agit d'une nouvelle installation pour les tests. Je cours en tant qu'administrateur local. Existe-t-il un moyen de vérifier les autorisations sur les clés?
déc
3
Comment définissez-vous le "temps de connexion utilisateur"? Ce temps entre l'utilisateur valide son nom d'utilisateur + mot de passe et l'explorateur est prêt à lancer un programme?
Gregory MOUSSAT

Réponses:

4

On m'a récemment demandé de faire une chose très similaire, mais d'inclure les heures de démarrage et de connexion et de permettre une référence historique. donc le script powershell ci-dessous fait ce qui suit:

  1. saisit certaines variables d'environnement
  2. obtient l'horodatage \ date pour 4 entrées différentes du journal des événements. Les 2e et 4e de ces mesures ne sont pas exactes, mais après des recherches assez approfondies, un dépannage et des tests, elles sont très proches et de ce que j'ai vu, les meilleures options.
  3. calcule la différence entre ces 4 événements
  4. remplit tous les nombres dans une simple table SQL

Ainsi, le script est censé s'exécuter via une tâche planifiée ou selon un certain calendrier si vous avez SCCM peut-être (pas pendant la connexion afin de ne pas modifier la connexion du tout). la bonne chose est que vous pouvez changer le nom de PC en n'importe quoi d'autre pour l'exécuter à partir de votre propre PC et obtenir les données d'un ordinateur distant (bien que le nom d'utilisateur apparaisse comme le vôtre) pour dépanner et vérifier les numéros.

J'ai pris une autre étape et utilisé SharePoint pour créer une liste de données externes (à l'aide de BCS) afin qu'elles aient une belle interface graphique frontale. Script ci-dessous, j'ai laissé dans la plupart des lignes commentées que j'ai utilisées en l'écrivant:

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

Dans cette dernière section SQL, il y a quelques lignes commentées offrant une autre méthode (basée sur la sécurité) pour entrer dans SQL sans avoir besoin d'un mot de passe en texte clair.

Jordan W.
la source
La synchronisation temporelle après le démarrage ne semble pas se produire. J'ai redémarré ma machine de test et exécuté le script. J'ai obtenu -4 657,9 minutes pour la durée de mon démarrage. En raison de la synchronisation de l'heure datée de 2 jours.
2012
Je suppose que mes politiques de domaine sont configurées différemment. Nous avons "toujours attendre le réseau .." activé, pourrait être la raison. De plus, si vous n'avez besoin que de la durée de connexion, vous pouvez commenter ces parties de démarrage
Jordan W.
Ce script n'autorise que l'ouverture de session
Jim B
3

Je ne sais pas pourquoi quelqu'un penserait qu'un script vous aiderait à déterminer les heures d'ouverture de session (après tout, vous ne pouvez pas exécuter le script jusqu'à ce que quelqu'un se soit connecté, et tirer les temps ne sera d'aucune aide car la dérive du temps entraînerait certainement des erreurs de déclaration - ce qui aussi ne serait pas résolu avant le démarrage du processus. L'outil que je vous suggère d'utiliser est l'outil xperf de la boîte à outils de performances. Vous voulez regarder les temps explorerinit pour le temps de connexion total. voir Analyse des performances de transition Windows On / Off pour des explications détaillées sur ce qui se passe du démarrage au bureau. Voir Outils d'analyse des performances Windows pour obtenir xperf et xbootmgr aux endroits appropriés.

Jim B
la source
J'ai regardé xperf il y a quelque temps. Mais j'avais le sentiment que c'était plus un outil de débogage unique? Peut-il être configuré pour s'exécuter à chaque démarrage et à chaque connexion?
2012
c'est possible, mais pourquoi avez-vous besoin de mesurer chaque démarrage et chaque connexion?
Jim B
Certains utilisateurs se sont plaints des temps de connexion, ils veulent être armés des faits lorsque quelqu'un s'en plaint. Pour l'instant, ils n'ont aucun fait pour les étayer. Ils veulent donc pouvoir afficher et surveiller les temps de connexion des utilisateurs et des machines. IE machine0001 - le temps de connexion moyen est de 10 secondes. Le temps de connexion moyen des blogs joe est de 8 secondes. Cela aurait seulement besoin de fonctionner assez longtemps pour obtenir suffisamment de données pour obtenir des moyennes suffisamment décentes.
2012
Si vous avez un problème intermittent, une moyenne ne va pas vous aider. Lorsqu'un utilisateur se plaint, la première chose à regarder est les journaux de traitement des stratégies de groupe et voir s'il y a un problème (99% du temps, c'est un script). Après cela, j'installerais l'outil, redémarrerais et les ferais reconnecter.
Jim B
Nous résolvons les cas intermittents de la même manière que vous le suggérez et il s'agit normalement d'un script. Cependant, ils veulent pouvoir afficher les chiffres aux utilisateurs pour leur montrer que les temps de connexion ne sont pas aussi mauvais que la réputation qu'ils ont actuellement.
déc.
2

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

Ce fil présente la méthode de démarrage «Microsoft» du diagnostic à l'aide des outils d'analyse des performances de Windows

Très bonne procédure documentée de Microsoft sur les «performances de transition marche / arrêt», autrement dit activer ou désactiver Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

En utilisant ces outils officiels, vous pouvez fournir une réponse faisant autorité à votre client. À mon avis, bien mieux que d'essayer d'utiliser des scripts. Peut être légèrement exagéré si vos besoins sont basiques.

À partir de ce fil, ne manquez pas le site Web de Soluto si vos besoins sont extrêmement simples :)

Garrett
la source
2

Le fichier de commandes suivant exécuté en tant que script de connexion vous permettra de savoir combien de temps il faut entre l'authentification et le shell en cours de préparation.

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

Je n'ai pas testé cela et j'ai fait quelques hypothèses.

  1. L'heure de connexion renvoyée par net userest l'heure à laquelle le contrôleur de domaine a effectué l'authentification. Je crois que c'est le cas, mais je ne trouve rien de concret pour étayer cela.
  2. Le script d'ouverture de session s'exécute lors du chargement du shell utilisateur. C'est certainement le cas si vous utilisez les anciens scripts d'ouverture de session NT4, par opposition aux scripts d'ouverture de session définis par les stratégies de groupe, mais comme les scripts d'ouverture de session GPO s'exécutent cachés à l'utilisateur (par défaut), je n'ai jamais vu le moment où ils sont exécutés.
  3. Vos noms d'utilisateur ne contiennent pas d'espaces, vous devrez peut-être mettre des %username%guillemets si tel est le cas.
  4. Vous disposez d'un partage accessible en écriture où les données seront enregistrées ( \\server\sharedans l'exemple ci-dessus). Vous pouvez l'enregistrer localement sur des machines individuelles, mais cela rendra plus difficile l'examen des résultats.

Éditer:

J'ai mis à jour le script pour gérer la dérive temporelle qui préoccupe Jim. L'heure de début d'ouverture de session à partir de la net usecommande est extraite de l'horloge du contrôleur de domaine d'authentification. La net timecommande prend désormais également le temps du même serveur.

Bryan
la source
Les GPO utilisateur sont appliqués après la connexion mais avant l'exécution du loginscript. Cette fois serait manquante.
Tom
Si je plaçais ce fichier batch dans le démarrage des machines, cela donnerait une lecture plus acceptable je pense?
Décade
@Decad J'allais suggérer cela en option, mais j'ai pensé qu'il serait plus facile de déployer le script à l'aide d'un script de connexion. Personnellement, je le déploierais en tant que script de connexion hérité. c'est-à-dire via l' Profileonglet de la boîte de dialogue des propriétés du compte utilisateur dans ADU & C. Cela fonctionne définitivement lorsque le shell de l'explorateur se charge.
Bryan
Je pense que les scripts s'exécutent pendant explorerinit, (c'est pourquoi les scripts de connexion ralentissent les connexions)
Jim B
@Decad J'ai mis à jour le script pour éliminer toute possibilité de dérive du temps.
Bryan