Đo thời gian đăng nhập của người dùng Windows 7


8

Tôi đã được một khách hàng yêu cầu tính thời gian đăng nhập trung bình cho máy và người dùng. Cho đến nay tôi đã thấy rằng sự kiện này ghi lại một số khởi động mất nhiều thời gian hơn ngưỡng được đặt bởi các phím được tìm thấy tại:

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

Nhưng các khóa dường như bị khóa nên tôi không thể chỉnh sửa chúng để làm cho ngưỡng thấp hơn để đảm bảo đăng nhập mỗi lần khởi động. Có phương pháp nào để tìm thời gian đăng nhập cho mỗi lần đăng nhập đủ dài để nói với người dùng đang đăng nhập và có thể có thông tin chi tiết hơn không, điều này cũng cần đủ nhẹ để chạy trên mỗi lần đăng nhập và không gây ra hiệu ứng đáng chú ý cho người dùng .


"Khóa" có nghĩa là gì? Thông điệp khi bạn cố gắng thay đổi các giá trị là gì? Bạn đã bắt đầu Regadit "với tư cách là Quản trị viên" để tránh các giới hạn về quyền của tài khoản hiện tại hoặc các hạn chế do UAC đặt ra chưa?
the-wợi

Chỉnh sửa khóa thông qua regedit chạy khi kết quả của quản trị viên, "Không thể chỉnh sửa BootMinorThrưỡng_Sec: Lỗi khi ghi nội dung mới của giá trị. '
Decad

Hãy chắc chắn rằng bạn có quyền thay đổi các giá trị của khóa này. Đồng thời kiểm tra xem công cụ chống vi-rút của bạn không chặn các thay đổi đăng ký vì một số lý do không thể hiểu được.
the-wmus

Hiện tại không có phần mềm diệt virus nào đang chạy trên máy này vì đây là bản cài đặt mới để thử nghiệm. Tôi đang chạy như một quản trị viên địa phương. Có cách nào để kiểm tra quyền trên các phím không?
Decad

3
Làm thế nào để bạn xác định "thời gian đăng nhập người dùng"? Đây là thời gian giữa người dùng xác nhận tên người dùng + mật khẩu và explorer đã sẵn sàng để khởi chạy một chương trình?
Gregory MOUSSAT

Câu trả lời:


4

Gần đây tôi đã được yêu cầu làm một điều rất giống nhưng bao gồm thời gian khởi động và đăng nhập và cho phép tham khảo lịch sử. Vì vậy, tập lệnh powershell dưới đây thực hiện như sau:

  1. lấy một số biến môi trường
  2. lấy dấu thời gian \ ngày cho 4 mục nhật ký sự kiện khác nhau. Lần thứ 2 và thứ 4 trong số này không phải là các phép đo chính xác nhưng sau khi nghiên cứu sâu rộng, xử lý sự cố và kiểm tra chúng rất gần và từ những gì tôi đã thấy, các lựa chọn tốt nhất.
  3. tính toán sự khác biệt giữa 4 sự kiện này
  4. điền tất cả các số vào một bảng SQL đơn giản [bạn có thể điều chỉnh để chuyển các số thành bất cứ thứ gì bạn muốn].

Vì vậy, tập lệnh có nghĩa là chạy qua tác vụ theo lịch trình hoặc theo lịch trình nào đó nếu bạn có SCCM (không phải trong quá trình đăng nhập để không thay đổi đăng nhập). điều tuyệt vời là bạn có thể thay đổi PCname thành bất kỳ thứ gì khác để chạy nó từ PC của chính bạn và lấy dữ liệu từ một máy tính từ xa (mặc dù tên người dùng sẽ hiển thị là của riêng bạn) để khắc phục sự cố và xác minh các số.

Tôi đã thực hiện một bước nữa và sử dụng SharePoint để tạo danh sách dữ liệu ngoài (sử dụng BCS) để chúng có GUI giao diện người dùng đẹp. Kịch bản bên dưới, tôi đã để lại trong hầu hết các dòng nhận xét tôi đã sử dụng trong khi viết nó:

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

Trong phần SQL cuối cùng này, có một vài dòng nhận xét đưa ra một phương thức khác (dựa trên bảo mật) để nhập vào SQL mà không cần một số mật khẩu trong văn bản gốc.


Đồng bộ hóa thời gian sau khi khởi động dường như không xảy ra. Tôi khởi động lại máy thử nghiệm của mình và chạy tập lệnh. Tôi nhận được -4,657,9 phút cho thời gian khởi động của mình. Do đồng bộ hóa thời gian được ghi ngày 2 ngày trước.
Decad

Tôi đoán chính sách tên miền của tôi được thiết lập khác nhau. Chúng tôi đã "luôn chờ mạng .." được bật, có thể là lý do. Ngoài ra, nếu bạn chỉ cần đăng nhập vào thời lượng, bạn có thể nhận xét những phần khởi động đó
Jordan W.

Kịch bản này chỉ xác thực lần không đăng nhập
Jim B

3

Tôi không chắc tại sao mọi người sẽ nghĩ rằng một tập lệnh sẽ giúp bạn xác định thời gian đăng nhập (sau tất cả, bạn không thể chạy tập lệnh cho đến khi ai đó đã đăng nhập và thời gian kéo sẽ không giúp ích vì thời gian trôi dạt chắc chắn sẽ gây ra việc nhập sai sẽ không được sửa cho đến khi xử lý khởi động. Công cụ tôi khuyên bạn nên sử dụng là công cụ xperf từ bộ công cụ hiệu suất. Bạn muốn xem thời gian explorerinit để biết tổng thời gian đăng nhập. Xem Phân tích hiệu suất chuyển đổi của Windows On / Off để biết giải thích chi tiết về những gì xảy ra từ khởi động đến máy tính để bàn. Xem Công cụ phân tích hiệu suất Windows để nhận xperf và xbootmgr từ những nơi thích hợp.


Tôi nhìn vào xperf một lúc trước. Nhưng tôi có cảm giác rằng đây là một công cụ gỡ lỗi không? Nó có thể được thiết lập để chạy cho mỗi lần khởi động và mỗi lần đăng nhập không?
Decad

nó có thể, nhưng tại sao bạn cần đo mỗi lần khởi động và mỗi lần đăng nhập?
Jim B

Đã có một số lời khen ngợi của một số người dùng về thời gian đăng nhập, họ muốn được trang bị những sự thật khi ai đó phàn nàn về điều đó. Cho đến bây giờ họ không có sự thật để sao lưu chúng. Vì vậy, họ muốn có thể hiển thị và theo dõi thời gian đăng nhập cho người dùng và cho máy. IE machine0001 - thời gian đăng nhập trung bình là 10 giây. Người dùng joe blog thời gian đăng nhập trung bình là 8 giây. Điều này sẽ chỉ cần chạy đủ lâu để có đủ dữ liệu để có được mức trung bình đủ.
Decad

Nếu bạn có một vấn đề không liên tục, trung bình sẽ không giúp bạn. Khi người dùng phàn nàn điều đầu tiên cần xem xét là nhật ký xử lý chính sách nhóm và xem có vấn đề gì không (99% đó là tập lệnh). Sau đó tôi sẽ cài đặt công cụ, khởi động lại và đăng nhập lại.
Jim B

Chúng tôi giải quyết các trường hợp không liên tục theo cách tương tự như bạn đang đề xuất và nó thường là một kịch bản. Tuy nhiên, họ muốn có thể hiển thị số liệu cho người dùng để giúp họ thấy rằng thời gian đăng nhập không tệ như danh tiếng mà họ hiện có.
Decad

2

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

Chuỗi này hiển thị cách khởi động "Microsoft" bằng cách sử dụng Công cụ phân tích hiệu suất Windows

Quy trình tài liệu rất tốt từ Microsoft về "Bật / Tắt hiệu suất chuyển đổi" hay còn gọi là bật hoặc tắt Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Sử dụng các công cụ chính thức này, bạn có thể cung cấp một câu trả lời có thẩm quyền cho khách hàng của bạn. Theo tôi, vượt trội hơn nhiều so với việc cố gắng sử dụng kịch bản. Có thể hơi quá mức nếu nhu cầu của bạn là cơ bản.

Cũng từ chủ đề đó, đừng bỏ lỡ trang web của Soluto nếu nhu cầu của bạn cực kỳ cơ bản :)


2

Tệp bó sau đây được thực thi dưới dạng tập lệnh đăng nhập sẽ đi theo một cách nào đó để cho bạn biết phải mất bao lâu từ xác thực đến trình bao sẵn sàng.

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

Tôi đã không kiểm tra điều này và tôi đã đưa ra một vài giả định.

  1. Thời gian đăng nhập được trả về net userlà thời gian DC thực hiện xác thực. Tôi tin rằng đây là trường hợp, nhưng không thể tìm thấy bất cứ điều gì cụ thể để sao lưu nó.
  2. Kịch bản đăng nhập chạy khi trình bao tải người dùng. Đây chắc chắn là trường hợp nếu bạn sử dụng tập lệnh đăng nhập NT4 cũ hơn, trái ngược với tập lệnh đăng nhập được xác định bởi chính sách nhóm, nhưng vì tập lệnh đăng nhập GPO bị ẩn khỏi người dùng (theo mặc định), tôi chưa bao giờ thấy thời gian khi nào chúng được thực thi.
  3. Tên người dùng của bạn không chứa dấu cách, bạn có thể cần đặt %username%dấu ngoặc kép nếu đây là trường hợp.
  4. Bạn có một chia sẻ có thể ghi trên thế giới nơi dữ liệu sẽ được ghi lại ( \\server\sharetrong ví dụ trên). Bạn có thể đăng nhập cục bộ trên các máy riêng lẻ, nhưng điều đó sẽ khiến việc kiểm tra kết quả trở nên khó khăn hơn.

Biên tập:

Tôi đã cập nhật kịch bản để đối phó với thời gian trôi mà Jim quan tâm. Thời gian bắt đầu đăng nhập từ net uselệnh được lấy từ đồng hồ của bộ điều khiển miền xác thực. Các net timelệnh bây giờ cũng mất thời gian từ cùng một máy chủ.


Các GPO người dùng được áp dụng sau khi đăng nhập nhưng trước khi thực hiện bản ghi. Lần này sẽ mất tích.
Tom

Nếu tôi đặt tập tin bó này vào máy khởi động, tôi nghĩ nó sẽ dễ đọc hơn?
Decad 2/212

@Decad Tôi sẽ đề xuất rằng đó là một tùy chọn, nhưng nghĩ rằng việc triển khai tập lệnh bằng cách sử dụng tập lệnh đăng nhập sẽ dễ dàng hơn. Cá nhân tôi sẽ triển khai nó như là một kịch bản đăng nhập kế thừa. tức là thông qua Profiletab đối thoại thuộc tính tài khoản người dùng trong ADU & C. Điều này chắc chắn chạy như tải shell explorer.
Bryan

Tôi nghĩ rằng các tập lệnh chạy trong explorerinit, (đó là lý do tại sao các tập lệnh đăng nhập làm chậm quá trình đăng nhập)
Jim B

@Decad Tôi đã cập nhật tập lệnh để loại bỏ mọi cơ hội trôi thời gian.
Bryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.