Windows 7ユーザーのログイン時間の測定


8

クライアントから、マシンとユーザーの平均ログイン時間を計算するように依頼されました。これまでのところ、イベントのログには、次の場所にあるキーで設定されたしきい値よりも長い時間がかかるブートが記録されていることがわかりました。

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

しかし、キーがロックされているように見えるので、起動ごとにログを記録するためにしきい値を低くするように編集することはできません。ログインしていることをユーザーに知らせるのに十分な詳細度で、ログオンごとにログイン時間を見つける方法はありますか?これは、すべてのログインで実行するのに十分軽量であり、ユーザーに顕著な影響を与えない必要があります。


「ロック」とはどういう意味ですか?値を変更しようとしたときのメッセージは何ですか?現在のアカウントのアクセス許可の制限やUACによって設定された制限を回避するために、 "管理者として" Regaditを起動しましたか?
the-wabbit 2012年

管理者としてregedit runを使用してキーを編集すると、「BootMinorThreshold_Secを編集できません:値の新しい内容の書き込みエラー」が発生します。
Decad 2012年

このキーの値を変更する権限があることを確認してください。また、ウイルス対策エンジンが何らかの理由でレジストリの変更をブロックしていないかどうかも確認してください。
the-wabbit 2012年

テスト用の新規インストールであるため、現在このマシンではアンチウイルスは実行されていません。ローカル管理者として実行しています。キーのアクセス許可を確認する方法はありますか?
Decad

3
「ユーザーのログイン時間」をどのように定義しますか?これは、ユーザーがユーザー名とパスワードを検証し、エクスプローラーがプログラムを起動する準備ができるまでの時間ですか?
Gregory MOUSSAT 2012年

回答:


4

私は最近、非常によく似たことをするように求められましたが、起動時間とログオン時間を含め、履歴を参照できるようにする必要があります。したがって、以下のPowerShellスクリプトは次のことを行います。

  1. いくつかの環境変数を取得
  2. 4つの異なるイベントログエントリの日時スタンプを取得します。これらの2番目と4番目は正確な測定値ではありませんが、かなり広範囲にわたる調査、トラブルシューティング、およびテストの後、それらは非常に近く、私が見た限りでは最良のオプションです。
  3. これら4つのイベントの差を計算します
  4. すべての数値を単純なSQLテーブルに入力します[もちろん、数値を必要なものにパイプするように適応できます]

そのため、SCCMがある場合は、スクリプトはスケジュールされたタスクを介して、または何らかのスケジュールで実行することを意図しています(ログオンを変更しないように、ログオン中ではありません)。PC名を他の名前に変更して自分のPCから実行し、リモートコンピュータからデータを取得して(ユーザー名は自分のものとして表示されます)、トラブルシューティングを行って番号を確認できるのはすばらしいことです。

私は別のステップを踏み、SharePointを使用して(BCSを使用して)外部データのリストを作成したので、フロントエンドのGUIが優れています。以下のスクリプト、私がそれを書いている間に使用したコメント行のほとんどを残しました:

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

この最後のSQLセクションには、プレーンテキストのパスワードを必要とせずにSQLに入力する別の方法(セキュリティベース)を提供するコメントアウトされた数行があります。


起動後の時刻同期が行われていないようです。テストマシンを再起動し、スクリプトを実行しました。起動時間は-4,657.9分でした。時刻同期が2日前に行われたため。
Decad

ドメインポリシーの設定が異なると思います。「常にネットワークを待機する...」がオンになっているため、その可能性があります。また、ログオン期間だけが必要な場合は、それらの起動部分をコメント化できます
ジョーダンW.

このスクリプトは、ログオンではなく認証のみを時間計測します
ジムB

3

なぜスクリプトがログオン時間を決定するのに役立つと誰が思うのか分かりません(誰かがログオンするまでスクリプトを実行できないので、時間のずれは間違いとして誤った報告を引き起こすため、プル時間は役に立ちません)。スタートアップ処理までは修正されません。使用することをお勧めするツールは、パフォーマンスツールキットのxperfツールです。総ログオン時間のexplorerinit時間を確認する必要があります。詳細な説明については、Windowsのオン/オフ遷移パフォーマンス分析を参照してくださいブートからデスクトップに何が起こるかxperfとxbootmgrを適切な場所から取得するには、Windowsパフォーマンス分析ツールを参照してください。


しばらく前にxperfを調べました。しかし、私はこれが1回限りのデバッグツールであると感じていましたか?すべての起動とすべてのログインで実行するように設定できますか?
Decad

それは可能ですが、なぜすべての起動とすべてのログインを測定する必要があるのですか?
ジムB

ログイン時間に関して一部のユーザーからの不満があり、誰かがそれについて不平を言ったときに、彼らは事実で武装したいと考えています。現在のところ、それらをバックアップする事実はありません。したがって、ユーザーとマシンのログイン時間を表示および監視できるようにしたいと考えています。IE machine0001-平均ログイン時間は10秒です。ユーザーjoeブログの平均ログイン時間は8秒です。これは、十分な平均を得るために十分なデータを取得するのに十分な時間だけ実行する必要があります。
Decad

あなたが断続的な問題を抱えている場合、平均はあなたを助けにはなりません。ユーザーが最初に確認する必要があるのは、グループポリシーの処理ログであり、問​​題があるかどうかを確認します(99%はスクリプトです)。その後、ツールをインストールして再起動し、再度ログインしてもらいます。
ジムB

私たちはあなたが提案しているのと同じ方法で断続的なケースを解決しますが、それは通常スクリプトです。ただし、ログイン時間は現在の評判ほど悪くないことをユーザーに示すために、ユーザーに数値を表示できるようにしたいと考えています。
Decad

2

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

このスレッドは、Windowsパフォーマンス分析ツールを使用した「Microsoft」によるブート診断の方法を示しています。

「オン/オフ遷移パフォーマンス」、つまりWindowsのオン/オフに関するMicrosoftからの非常に優れた文書化された手順:http : //msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

これらの公式ツールを使用して、クライアントに信頼できる回答を提供できます。私の意見では、スクリプトを使用するよりもはるかに優れています。ニーズが基本的な場合は、少しやりすぎかもしれません。

また、あなたのニーズが非常に基本的な場合は、そのスレッドからSolutoのWebサイトをお見逃しなく:)


2

ログオンスクリプトとして実行される次のバッチファイルは、認証からシェルの準備が完了するまでにかかる時間を示すのに役立ちます。

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

私はこれをテストしていません、そして私はいくつかの仮定をしました。

  1. によって返されるログオン時間はnet user、DCが認証を実行した時間です。私はこれが事実であると信じていますが、それを裏付ける具体的なものを見つけることができません。
  2. ユーザーシェルが読み込まれると、ログオンスクリプトが実行されます。これは、グループポリシーで定義されたログオンスクリプトとは対照的に、古いレガシNT4ログオンスクリプトを使用する場合に当てはまりますが、GPOログオンスクリプトはユーザーに対して非表示で実行されるため(既定では)、タイミングを確認できませんでした。それらは実行されます。
  3. ユーザー名にスペースが含まれていない%username%場合、引用符で囲む必要がある場合があります。
  4. あなたは、データが記録される世界の書き込み可能な共有を持っています(\\server\share上記の例)。個々のマシンでローカルにログを記録することもできますが、結果を調べるのが難しくなります。

編集:

ジムが関係している時間のずれに対処するためにスクリプトを更新しました。net useコマンドからのログオン開始時刻は、認証ドメインコントローラのクロックから取得されます。このnet timeコマンドは、同じサーバーからも時間がかかるようになりました。


ユーザーGPOは、ログイン後、loginscriptの実行前に適用されます。今回は行方不明になります。
トム

このバッチファイルをマシンのスタートアップに配置した場合、より適切に読み取れると思いますか?
Decad

@Decadオプションとして提案するつもりでしたが、ログオンスクリプトを使用してスクリプトを展開する方が簡単だと思いました。個人的には、レガシログオンスクリプトとして展開します。つまりProfile、ADU&Cのユーザーアカウントプロパティダイアログのタブを使用します。これは、エクスプローラーシェルの読み込み時に確実に実行されます。
ブライアン

スクリプトはexplorerinitの間に実行されると思います(これがログインスクリプトがログインの速度を低下させる理由です)
ジムB

@Decadスクリプトを更新して、時間ドリフトの可能性を排除しました。
ブライアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.