Клиент попросил меня рассчитать среднее время входа в систему для машин и пользователей. Пока что я обнаружил, что в журнале событий регистрируются некоторые загрузки, которые занимают больше времени, чем пороговые значения, установленные ключами, найденными по адресу:
HKLM\Software\Microsoft\Windows\CurrentVersion\Diagnostics\Performance\Boot
Но кажется, что ключи заблокированы, поэтому я не могу редактировать их, чтобы снизить пороги, чтобы обеспечить регистрацию каждой загрузки. Существуют ли какие-либо методы для поиска времени входа в систему для каждого входа в систему, которые достаточно подробны, чтобы сообщить пользователю, что входит в систему, и возможную более подробную информацию, это также должно быть достаточно легким, чтобы запускаться при каждом входе в систему и не вызывать заметных эффектов для пользователя .
Меня недавно попросили сделать очень похожую вещь, но включить время загрузки и входа в систему и дать историческую справку. поэтому приведенный ниже сценарий PowerShell выполняет следующие действия:
Таким образом, сценарий предназначен для запуска через запланированную задачу или по некоторому расписанию, если у вас, возможно, SCCM (не во время входа в систему, чтобы вообще не изменять вход в систему). приятно то, что вы можете изменить имя компьютера на любое другое, чтобы запустить его со своего ПК и получить данные с удаленного компьютера (хотя имя пользователя будет отображаться как ваше собственное) для устранения неполадок и проверки номеров.
Я сделал еще один шаг и использовал SharePoint для создания списка внешних данных (с использованием BCS), чтобы у них был красивый интерфейсный интерфейс. В приведенном ниже сценарии я оставил большинство прокомментированных строк, которые использовал при его написании:
$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 без необходимости использования пароля в виде открытого текста.
Я не уверен, почему кто-то может подумать, что сценарий поможет вам определить время входа в систему (в конце концов, вы не можете запустить сценарий, пока кто-то не войдет в систему, а время извлечения не поможет, так как дрейф времени наверняка приведет к неверной отчетности, что также не будет исправлен до тех пор, пока не начнется обработка. Я бы посоветовал вам использовать инструмент xperf из набора инструментов для повышения производительности. Вы хотите узнать время входа в explorerinit, чтобы узнать общее время входа в систему. см. Анализ производительности перехода Windows On / Off для подробных объяснений того, что происходит от загрузки до рабочего стола. Видеть Инструменты анализа производительности Windows чтобы получить xperf и xbootmgr из соответствующих мест.
https://superuser.com/questions/250267/how-to-diagnose-slow-booting-or-logon-in-windows-7
В этом потоке показан способ диагностики загрузки с помощью средств анализа производительности Windows, который используется Microsoft.
Очень хорошая документированная процедура от Microsoft по «Включение / выключение переходной производительности», то есть включение или выключение Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx
Используя эти официальные инструменты, вы можете дать авторитетный ответ своему клиенту. На мой взгляд, намного лучше, чем пытаться использовать скрипты. Может быть немного излишним, если ваши потребности базовые.
Также из этой ветки не пропустите сайт Soluto, если ваши потребности очень простые :)
Следующий командный файл, выполняемый как сценарий входа в систему, каким-то образом сообщит вам, сколько времени проходит от аутентификации до готовности оболочки.
set logfile=\\server\share\%computername%-%username%.log
net user /domain %username% | find /I "Last logon" > %logfile%
net time %logonserver% >> %logfile%
Я не проверял это и сделал несколько предположений.
net user
это время, когда DC выполнил аутентификацию. Я считаю, что это так, но не могу найти ничего конкретного, подтверждающего это.%username%
в кавычках, если это так.\\server\share
в приведенном выше примере). Вы можете регистрировать его локально на отдельных машинах, но это затруднит изучение результатов.Редактировать:
Я обновил сценарий, чтобы справиться с дрейфом времени, который беспокоит Джима. Время начала входа в систему с net use
Команда берется с часов проверяющего контроллера домена. В net time
команда теперь также берет время с того же сервера.