Mengukur waktu login pengguna Windows 7

8

Saya telah diminta oleh klien untuk menghitung waktu login rata-rata untuk mesin dan pengguna. Sejauh ini saya telah menemukan bahwa event mencatat beberapa boot yang membutuhkan waktu lebih lama daripada ambang batas yang ditetapkan oleh kunci yang ditemukan di:

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

Tetapi kunci tampaknya dikunci sehingga saya tidak dapat mengeditnya untuk membuat ambang batas lebih rendah untuk memastikan logging setiap boot. Apakah ada metode untuk menemukan waktu login untuk setiap login yang cukup verbose untuk memberi tahu pengguna yang masuk dan kemungkinan informasi lebih rinci, ini juga harus cukup ringan untuk dijalankan pada setiap login dan tidak menimbulkan efek yang terlihat bagi pengguna. .

Decad
sumber
Apa yang Anda maksud dengan "terkunci"? Apa pesannya ketika Anda mencoba mengubah nilainya? Apakah Anda memulai Regadit "sebagai Administrator" untuk menghindari batasan izin akun Anda saat ini atau batasan yang ditetapkan oleh UAC?
the-wabbit
Mengedit kunci melalui regedit dijalankan saat administrator menghasilkan, "Tidak dapat mengedit BootMinorThreshold_Sec: Kesalahan saat menulis konten baru nilai."
Decad
Pastikan Anda memiliki izin untuk mengubah nilai-nilai kunci ini. Periksa juga apakah mesin antivirus Anda tidak memblokir perubahan registri untuk beberapa alasan yang tidak terduga.
the-wabbit
Tidak ada antivirus yang saat ini berjalan di mesin ini karena ini adalah instalasi baru untuk pengujian. Saya menjalankan sebagai administrator lokal. Apakah ada cara untuk memeriksa izin pada kunci?
Decad
3
Bagaimana Anda mendefinisikan "waktu masuk pengguna"? Ini waktu antara pengguna memvalidasi nama pengguna + kata sandi dan penjelajah siap untuk meluncurkan program?
Gregory MOUSSAT

Jawaban:

4

Saya baru-baru ini diminta untuk melakukan hal yang sangat mirip tetapi untuk memasukkan waktu boot dan login dan memungkinkan untuk referensi sejarah. jadi skrip PowerShell di bawah ini melakukan hal berikut:

  1. meraih beberapa variabel lingkungan
  2. mendapat cap waktu \ tanggal untuk 4 entri log peristiwa yang berbeda. Yang ke-2 dan ke-4 ini bukan pengukuran yang tepat tetapi setelah penelitian yang cukup luas, pemecahan masalah dan pengujian mereka sangat dekat dan dari apa yang saya lihat, pilihan terbaik.
  3. menghitung perbedaan antara 4 acara ini
  4. mengisi semua angka ke dalam tabel SQL sederhana [Anda bisa beradaptasi untuk menyalurkan angka menjadi apa pun yang Anda inginkan tentu saja]

Jadi skrip dimaksudkan untuk dijalankan melalui tugas yang dijadwalkan atau pada beberapa jadwal jika Anda memiliki SCCM mungkin (tidak selama logon agar tidak mengubah log masuk sama sekali). yang menyenangkan adalah Anda dapat mengubah PCname menjadi hal lain untuk menjalankannya dari PC Anda sendiri dan mendapatkan data dari komputer jarak jauh (meskipun nama pengguna akan muncul sebagai milik Anda) untuk memecahkan masalah dan memverifikasi nomor.

Saya mengambil langkah lain dan menggunakan SharePoint untuk membuat daftar data eksternal (menggunakan BCS) sehingga mereka memiliki GUI front end yang bagus. Script di bawah ini, saya telah meninggalkan sebagian besar komentar yang saya gunakan saat menulis:

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

Di bagian SQL terakhir ini ada komentar beberapa baris yang menawarkan metode lain (berbasis keamanan) untuk dimasukkan ke dalam SQL tanpa perlu kata sandi dalam plaintext.

Jordan W.
sumber
Sinkronisasi waktu setelah boot tampaknya tidak terjadi. Saya reboot mesin uji saya dan menjalankan skrip. Saya mendapat -4.657,9 Menit untuk durasi boot saya. Karena sinkronisasi waktu tanggal 2 hari yang lalu.
Decad
Saya kira kebijakan domain saya disetel secara berbeda. Kami telah "selalu menunggu jaringan .." dihidupkan, bisa menjadi alasannya. Juga, jika Anda hanya perlu durasi login, Anda bisa berkomentar tentang bagian boot-up itu
Jordan W.
Script ini hanya kali otentikasi tidak masuk
Jim B
3

Saya tidak yakin mengapa ada orang yang berpikir bahwa skrip akan membantu Anda menentukan waktu masuk (setelah semua Anda tidak dapat menjalankan skrip sampai seseorang masuk, dan menarik waktu tidak akan membantu karena waktu melayang tentu akan menyebabkan pelaporan yang salah - yang juga tidak akan diperbaiki hingga pemrosesan dimulai. Alat yang saya sarankan Anda gunakan adalah alat xperf dari toolkit kinerja. Anda ingin melihat waktu explorerinit untuk total waktu log masuk. lihat Analisis Kinerja Transisi Windows Aktif / Nonaktif Windows untuk penjelasan terperinci tentang apa yang terjadi dari boot ke desktop. Lihat Alat Analisis Kinerja Windows untuk mendapatkan xperf dan xbootmgr dari tempat yang sesuai.

Jim B
sumber
Saya melihat ke xperf beberapa waktu lalu. Tapi saya merasa ini lebih dari alat debugging? Apakah bisa diatur untuk dijalankan untuk setiap boot dan setiap login?
Decad
itu bisa, tetapi mengapa Anda perlu mengukur setiap boot dan setiap login?
Jim B
Ada keluhan dari beberapa pengguna tentang waktu masuk, mereka ingin dipersenjatai dengan fakta ketika seseorang mengeluhkannya. Sampai sekarang mereka tidak memiliki fakta untuk mendukung mereka. Jadi mereka ingin dapat menampilkan dan memantau waktu masuk untuk pengguna dan mesin. IE machine0001 - waktu masuk rata-rata adalah 10 detik. Waktu masuk rata-rata pengguna blog blog adalah 8 detik. Ini hanya perlu berjalan cukup lama untuk mendapatkan data yang cukup untuk mendapatkan rata-rata yang cukup layak.
Decad
Jika Anda memiliki masalah berselang, rata-rata tidak akan membantu Anda. Ketika seorang pengguna mengeluh hal pertama yang harus dilihat adalah kebijakan pemrosesan log kelompok dan melihat apakah ada masalah (99% dari waktu itu adalah skrip). Setelah itu saya akan menginstal alat, reboot dan minta mereka login lagi.
Jim B
Kami menyelesaikan kasus yang intermiten dengan cara yang sama seperti yang Anda sarankan dan biasanya berupa skrip. Namun mereka ingin dapat menampilkan angka kepada pengguna untuk membantu menunjukkan kepada mereka bahwa waktu masuk tidak seburuk reputasi yang mereka miliki saat ini.
Decad
2

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

Utas ini menunjukkan cara "Microsoft" untuk boot diag menggunakan Alat Analisis Kinerja Windows

Prosedur yang didokumentasikan dengan sangat baik dari Microsoft pada "On / Off Transition Performance" alias menghidupkan atau mematikan Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Dengan menggunakan alat resmi ini, Anda dapat memberikan jawaban resmi kepada klien Anda. Jauh lebih unggul daripada mencoba menggunakan skrip, menurut saya. Mungkin sedikit berlebihan jika kebutuhan Anda mendasar.

Juga dari utas itu, jangan lewatkan situs web Solo jika kebutuhan Anda sangat mendasar :)

Garrett
sumber
2

File batch berikut yang dieksekusi sebagai skrip logon akan memberi tahu Anda berapa lama dari otentikasi hingga shell siap.

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

Saya belum menguji ini, dan saya sudah membuat beberapa asumsi.

  1. Waktu masuk yang dikembalikan oleh net useradalah saat DC melakukan otentikasi. Saya percaya ini adalah masalahnya, tetapi tidak dapat menemukan sesuatu yang konkret untuk mendukungnya.
  2. Skrip logon berjalan saat shell pengguna memuat. Ini tentu terjadi jika Anda menggunakan skrip logon NT4 lawas yang lama, sebagai lawan skrip logon yang ditentukan oleh kebijakan grup, tetapi karena skrip logon GPO dijalankan tersembunyi dari pengguna (secara default), saya belum pernah melihat waktu ketika mereka dieksekusi.
  3. Nama pengguna Anda tidak mengandung spasi, Anda mungkin perlu memberi %username%tanda kutip jika ini masalahnya.
  4. Anda memiliki bagian dunia yang dapat ditulisi di mana data akan dicatat ( \\server\sharedalam contoh di atas). Anda bisa mencatatnya secara lokal di mesin individual, tetapi itu akan membuat lebih sulit untuk memeriksa hasilnya.

Edit:

Saya telah memperbarui skrip untuk menangani penyimpangan waktu yang diperhatikan Jim. Waktu mulai masuk dari net useperintah diambil dari jam pengontrol domain autentikasi. The net timePerintah kini juga mengambil waktu dari server yang sama.

Bryan
sumber
GPO pengguna diterapkan setelah login tetapi sebelum pelaksanaan naskah masuk. Kali ini akan hilang.
Tom
Jika saya menempatkan file batch ini di mesin startup, itu akan memberikan bacaan yang lebih dapat diterima saya pikir?
Decad
@Decad saya akan menyarankan itu sebagai opsi, tetapi berpikir akan lebih mudah untuk menggunakan skrip menggunakan skrip logon. Secara pribadi saya akan menyebarkannya sebagai skrip logon warisan. yaitu melalui Profiletab dialog properti akun pengguna di ADU & C. Ini pasti berjalan sebagai shell explorer memuat.
Bryan
Saya pikir skrip berjalan selama explorerinit, (itulah sebabnya skrip login memperlambat login)
Jim B
@Decad, saya telah memperbarui skrip untuk menghilangkan kemungkinan penyimpangan waktu.
Bryan