Измерение времени входа пользователя в Windows 7

8

Клиент попросил меня рассчитать среднее время входа в систему для компьютеров и пользователей. До сих пор я обнаружил, что в журнале событий регистрируются некоторые загрузки, которые занимают больше времени, чем пороги, установленные ключами, найденными в:

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

Но ключи, кажется, заблокированы, поэтому я не могу отредактировать их, чтобы сделать пороги ниже, чтобы обеспечить регистрацию каждой загрузки. Существуют ли какие-либо методы для определения времени входа в систему для каждого входа в систему, достаточно подробные, чтобы сообщить пользователю, который входит в систему, и, возможно, более подробные сведения, это также должно быть достаточно легким для запуска при каждом входе в систему и не вызывать заметных эффектов для пользователя ,

Декада
источник
Что вы подразумеваете под "заблокирован"? Что за сообщение при попытке изменить значения? Вы начали Regadit «как администратор», чтобы обойти ограничения разрешений вашей текущей учетной записи или ограничения, установленные UAC?
The Wabbit
Редактирование ключа с помощью regedit, запускаемого администратором, приводит к «Невозможно редактировать BootMinorThreshold_Sec: Ошибка записи нового содержимого значения».
Декада
Убедитесь, что у вас есть разрешения на изменение значений этого ключа. Также проверьте, не блокирует ли антивирусное ядро ​​изменения реестра по непостижимой причине.
The Wabbit
На данный момент на этом компьютере не работает антивирус, так как это новая установка для тестирования. Я работаю как местный администратор. Есть ли способ проверить права доступа к ключам?
Декада
3
Как вы определяете «время входа пользователя»? Это время между тем, когда пользователь проверяет свое имя пользователя + пароль, и проводник готов запустить программу?
Грегори МУССАТ

Ответы:

4

Меня недавно попросили сделать очень похожую вещь, но включить время загрузки и входа в систему и учесть историческую справку. поэтому приведенный ниже скрипт powershell выполняет следующие действия:

  1. захватывает некоторые переменные среды
  2. получает метку времени \ даты для 4 разных записей журнала событий. 2-й и 4-й из них не являются точными измерениями, но после довольно обширных исследований, поиска неисправностей и тестирования они очень близки и, как я видел, лучшие варианты.
  3. вычисляет разницу между этими 4 событиями
  4. заполняет все числа в простую таблицу SQL [вы, конечно, можете приспособить их для преобразования чисел во что угодно]

Таким образом, сценарий предназначен для выполнения через запланированное задание или по какому-либо расписанию, если у вас, возможно, есть 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 без необходимости ввода пароля в открытом тексте.

Джордан В.
источник
Синхронизация времени после загрузки не происходит. Я перезагрузил свой тестовый компьютер и запустил скрипт. Я получил -4557,9 минут за время загрузки. Из-за временной синхронизации, датированной 2 дня назад.
декабрь
Я предполагаю, что мои доменные политики настроены по-другому. У нас "всегда ждать сеть .." включен, может быть, почему. Кроме того, если вам нужна только продолжительность входа в систему, вы можете закомментировать эти загрузочные части
Джордан В.
Этот скрипт только раз аутентификации не вход в систему
Джим B
3

Я не уверен, почему кто-то может подумать, что скрипт поможет вам определить время входа в систему (в конце концов, вы не можете запустить сценарий, пока кто-то не вошел в систему, и время извлечения не поможет, так как смещение времени, безусловно, приведет к искажению отчета - что также не будет исправлено до обработки запуска. Инструмент, который я рекомендую использовать, - это инструмент xperf из набора инструментов для повышения производительности. Вы хотите посмотреть на время выполнения explorerinit для общего времени входа в систему. См. Анализ производительности перехода при включении / выключении Windows для подробного объяснения что происходит с загрузки на рабочий стол. См. Инструменты анализа производительности Windows, чтобы получить xperf и xbootmgr из соответствующих мест.

Джим Б
источник
Я посмотрел в xperf некоторое время назад. Но у меня было ощущение, что это скорее единственное средство отладки? Можно ли настроить его для каждой загрузки и каждого входа в систему?
декабрь
может, но зачем вам измерять каждую загрузку и каждый логин?
Джим Б
Некоторые пользователи жалуются на время входа в систему, они хотят быть вооруженными фактами, когда кто-то жалуется на это. На данный момент у них нет фактов, подтверждающих их. Поэтому они хотят иметь возможность отображать и контролировать время входа в систему для пользователей и компьютеров. IE machine0001 - среднее время входа в систему составляет 10 секунд. Среднее время входа в систему составляет 8 секунд. Это может потребоваться только для того, чтобы получить достаточно данных, чтобы получить достаточно средние значения.
декабрь
Если у вас непостоянная проблема, средний вам не поможет. Когда пользователь жалуется, первое, на что нужно обратить внимание, это журналы обработки групповой политики и посмотреть, есть ли проблема (в 99% случаев это сценарий). После этого я установил бы инструмент, перезагрузился и заставил их войти снова.
Джим Б.
Мы решаем периодические случаи аналогично тому, как вы предлагаете, и обычно это сценарий. Однако они хотят иметь возможность отображать цифры для пользователей, чтобы помочь им показать, что время входа не так плохо, как репутация, которую они имеют в настоящее время.
декабрь
2

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

В этой теме показан способ загрузки Microsoft с помощью средств анализа производительности Windows.

Очень хорошо документированная процедура от Microsoft на "On / Off Transition Performance" ака поворот Windows , или выключать: http://msdn.microsoft.com/en-us/windows/hardware/gg463386.aspx

Используя эти официальные инструменты, вы можете дать авторитетный ответ своему клиенту. На мой взгляд, намного лучше, чем пытаться использовать скрипты. Может быть немного излишним, если ваши потребности являются основными.

Также из этой ветки не пропустите сайт Soluto, если ваши потребности чрезвычайно просты :)

Garrett
источник
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теперь также берет время с того же сервера.

Bryan
источник
Пользовательские объекты групповой политики применяются после входа в систему, но до выполнения сценария входа в систему. Это время будет отсутствовать.
Том
Если бы я поместил этот командный файл в автозагрузку машины, я думаю, что это даст более приемлемое значение?
декабрь
@ Decad Я собирался предложить это как вариант, но подумал, что будет проще развернуть сценарий, используя сценарий входа в систему. Лично я бы развернул его как устаревший скрипт входа в систему. т.е. через Profileвкладку диалога свойств учетной записи пользователя в ADU & C. Это определенно работает при загрузке оболочки проводника.
Брайан
Я думаю, что сценарии запускаются во время explorerinit (именно поэтому сценарии входа замедляют вход в систему)
Джим Б.
@ Decad Я обновил сценарий, чтобы исключить любую вероятность смещения времени.
Брайан