При расследовании различных инцидентов администратору необходимо получить информацию кто и когда заходил на определенный компьютер Windows. Историю входов пользователя в доменной сети можно получить из журналов контроллеров домена. Но иногда проще получить информацию непосредсвенно из логов компьютера. В этой статье мы покажем, как получить и проанализировать историю входа пользователей на компьютер/сервер Windows. Такая статистика поможет вам ответить на вопрос “Как в Windows проверить кто и когда использовал этот компьютере”.
Содержание:
- Настройка политики аудита входа пользователей в Windows
- Поиск событий входа пользователей в журнале событий Windows
- Анализ событий входа пользователей в Windows с помощью PowerShell
Настройка политики аудита входа пользователей в Windows
Сначала нужно включить политик аудита входа пользователей. На отдельностоящем компьютере для настройки параметров локальной групповой политики используется оснастка gpedit.msc. Если вы хотите включить политику для компьютеров в домене Active Directorty, нужно использовать редактор доменных GPO (
gpmc.msc
).
- Запустите консоль GPMC, создайте новую GPO и назначьте ее на Organizational Units (OU) с компьютерами и / или серверами, для которых вы хотите включить политику аудита событий входа;
- Откройте объект GPO и перейдите в раздел Computer Configuration -> Policies -> Windows Settings -> Security Settings –> Advanced Audit Policy Configuration -> Audit Policies -> Logon/Logoff;
- Включите две политики аудита Audit Logon и Audit Logoff. Это позволит отслеживать как события входа, так и события выхода пользователей. Если вы хотите отслеживать только успешные события входа, включите в настройках политик только опцию Success;
- Закройте редактор GPO и обновите настройки политик на клиентах.
Поиск событий входа пользователей в журнале событий Windows
После того как вы включили политики аудита входа, при каждом входе пользователя в Windows в журнале Event Viewer будет появляться запись о входе. Посмотрим, как она выглядит.
- Откройте оснастку Event Viewer (
eventvwr.msc
); - Разверните секцию Windows Logs и выберите журнал Security;
- Щелкните по нему правой клавишей и выберите пункт Filter Current Log;
- В поле укажите ID события 4624 и нажмите OK;
- В окне события останутся только события входа пользователей, системных служб с описанием
An account was successfully logged on
; - В описании события указано имя и домен пользователя, вошедшего в систему:
New Logon: Security ID: WINITPROa.khramov Account Name: a.khramov Account Domain: WINITPRO
Ниже перечислены другие полезные EventID:
Event ID | Описание |
4624 | A successful account logon event |
4625 | An account failed to log on |
4648 | A logon was attempted using explicit credentials |
4634 | An account was logged off |
4647 | User initiated logoff |
Если полистать журнал событий, можно заметить, что в нем присутствуют не только события входа пользователей на компьютер. Здесь также будут события сетевого доступа к этому компьютеру (при открытии по сети общих файлов или печати на сетевых принтерах), запуске различных служб и заданий планировщика и т.д. Т.е. очень много лишний событий, которые не относятся ко входу локального пользователя. Чтобы выбрать только события интерактивного входа пользователя на консоль компьютера, нужно дополнительно сделать выборку по значению параметра Logon Type. В таблице ниже перечислены коды Logon Type.
Код Logon Type | Описание |
---|---|
0 | System |
2 | Interactive |
3 | Network |
4 | Batch |
5 | Service |
6 | Proxy |
7 | Unlock |
8 | NetworkCleartext |
9 | NewCredentials |
10 | RemoteInteractive |
11 | CachedInteractive |
12 | CachedRemoteInteractive |
13 | CachedUnlock |
При удаленном подключении к рабочему столу компьютера по RDP, в журнале событий появится записи с Logon Type 10 или 3. Подробнее об анализе RDP логов в Windows.
В соответствии с этой таблицей событие локального входа пользователя на компьютер должно содержать Logon Type: 2.
Для фильтрации события входа по содержать Logon Type лучше использовать PowerShell.
Анализ событий входа пользователей в Windows с помощью PowerShell
Допустим, наша задача получить информацию о том, какие пользователи входили на этот компьютер за последнее время. Нам интересует именно события интерактивного входа (через консоль) с
LogonType =2
. Для выбора события из журналов Event Viewer мы воспользуемся командлетом Get-WinEvent.
Следующий PowerShell скрипт выведет история входа пользователей на текущий компьютер и представит ее в виде графической таблицы Out-GridView.
$query = @'
<QueryList>
<Query Id='0' Path='Security'>
<Select Path='Security'>
*[System[EventID='4624']
and(
EventData[Data[@Name='VirtualAccount']='%%1843']
and
EventData[Data[@Name='LogonType']='2']
)
]
</Select>
</Query>
</QueryList>
'@
$properties = @(
@{n='User';e={$_.Properties[5].Value}},
@{n='Domain';e={$_.Properties[6].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LogonType';e={$_.Properties[8].Value}}
)
Get-WinEvent -FilterXml $query | Select-Object $properties|Out-GridView
Если нужно выбрать события входа за последние несколько дней, можно добавить pipe с таким условием:
|Where-Object {$_.TimeStamp -gt '5/10/22'}
Командлет Get-WinEvent позволяет получить информацию с удаленных компьютеров. Например, чтобы получить историю входов с двух компьютеров, выполните следующий скрипт:
'msk-comp1', 'msk-comp2' |
ForEach-Object {
Get-WinEvent -ComputerName $_ -FilterXml $query | Select-Object $properties
}
Если протокол RPC закрыт между компьютерами, вы можете получить данные с удаленных компьютеров с помощью PowerShell Remoting командлета Invoke-Command:
Invoke-Command -ComputerName 'msk-comp1', 'msk-comp2' {Get-WinEvent -FilterXml $query | Select-Object $properties}
I am trying to run Powershell script to set Audit Rule on C:Windowssecurity folder on my Windows 2008 box.
Below is the script:
$FileDirList = ("C:Windowssecurity")
$AccountName = New-Object System.Security.Principal.NTAccount("Everyone")
$FileSystemRight = [System.Security.AccessControl.FileSystemRights]::FullControl
$AuditFlag = [System.Security.AccessControl.AuditFlags]::Failure
$InheritanceFlag = [System.Security.AccessControl.InheritanceFlags]::None
$PropagationFlag = [System.Security.AccessControl.PropagationFlags]::None
#
#write-OSPBOSbuildLog "Applying Audit Setting"
#
foreach ($FileDirName in $FileDirList) {
#write-OSPBOSbuildLog ">>>>> Appying audit setting to $FileDirName"
$AuditRule = New-Object System.Security.AccessControl.FileSystemAuditRule $AccountName, $FileSystemRight, $InheritanceFlag, $PropagationFlag, $AuditFlag
$objACL = Get-ACL $FileDirname
$objACL.AddAuditRule($AuditRule)
Set-ACL $FileDirname $objACL
}
But I am getting error as shown below:
Set-Acl : Attempted to perform an unauthorized operation. At C:IBMFile-Perm.ps1:22 char:12 + Set-ACL <<<< $FileDirname $objACL + CategoryInfo : PermissionDenied: (C:Windows:String) [Set-Acl], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetAclCommand
Please help me understand what changes I need to do?
Thanks in Advance!!
- Remove From My Forums
-
Вопрос
-
Коллеги, приветствую.
Ситуацию такая: написан скрипт (ПоверШел), который ищет на контроллере домена в журнале Security определенные события. При запуске этого скрипта от имени администратора, все ОК, а вот при запуске от имени пользователя входящего в группу Администраторы домена
получаю ошибку в консоли:Get-WinEvent : Не удалось получить сведения о журнале Security. Ошибка: Попытка выполнить несанкционированную операцию..
Ясно, что отсутствует доступ к данному журналу.
Собственно вопрос: как дать доступ пользователю или группе доступ к данному журналу? Желательно только на чтение
Ответы
-
есть такая группа, Event Log Readers, лучше использовать ее — запускать скрипты из под админа очень плохо.
-
Помечено в качестве ответа
29 октября 2012 г. 6:16
-
Помечено в качестве ответа
-
Такая же группа есть и в домене. Смотрите внимательнее.
-
Помечено в качестве ответа
Евгений86749
29 октября 2012 г. 3:33
-
Помечено в качестве ответа
После моего комментария:
На самом деле это не проблема PowerShell, а ваша ошибка. Будь то из-за обновления, с которым мы не можем помочь с устранением неполадок, если с этим не столкнулись. Аналогично данным, полученным при поиске ниже.
‘get-eventlog: попытка выполнить несанкционированную операцию’
Почему вы это делаете?
$after = Get-Date -Date $startDate
Это просто присвоение StartDate новой переменной, а затем использование новой переменной позже, а не просто использование исходной переменной, что делает одну или другую избыточной.
# Refactored code using Get-WinEvent instead
$StartDate = (Get-Date)
'power','error' |
ForEach {
switch ($PSItem)
{
power
{
"Getting $PSItem data"
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 1, 42
StartTime = $StartDate
} |
Select-Object -Property LogName, TimeCreated, Id, Level |
Export-Csv -Path "D:Temp$($PSItem)Report.Csv"
}
error
{
"Getting $PSItem data"
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Id = 17
StartTime = $StartDate
} |
Select-Object -Property LogName, TimeCreated, Id, Level |
Export-Csv -Path "D:Temp$($PSItem)Report.Csv"
}
default {Write-Warning -Message 'No records which meet the criteria provided.'}
}
}
# Results
<#
Getting power data
Getting error data
#>
'power','error' |
ForEach {
"`nShowing report for System log $PSItem data"
Import-Csv -Path "D:Temp$($PSItem)Report.Csv"
}
# Results
<#
Showing report for System log power data
LogName TimeCreated Id Level
------- ----------- -- -----
System 03-Aug-20 13:44:49 1 4
System 03-Aug-20 13:44:42 1 4
System 03-Aug-20 01:53:27 42 4
Showing report for System log error data
System 01-Aug-20 15:13:27 17 4
System 01-Aug-20 15:13:21 17 4
System 01-Aug-20 15:13:20 17 4
#>
Что это делает и почему это часть вашего сообщения? Нет никакого контекста того, какие данные установлены вашим опубликованным запросом.
'Populate MySQL tables'
.sessions
Я эквивалентен администратору домена, я пытался работать в консоли с повышенными правами (щелкните правой кнопкой мыши> запустить от имени администратора), и я постоянно получаю ошибки при выполнении
get-winevent -logname application | where {$_.message -match "Faulting application"} | `
select TimeCreated,message
Я получу три строки результата, тогда
Get-WinEvent : Attempted to perform an unauthorized operation.
At line:1 char:13 Get-WinEvent : Attempted to perform an unauthorized operation.
+ CategoryInfo : NotSpecified: (:) [Get-WinEvent], UnauthorizedAccessException
+ FullyQualifiedErrorId : Attempted to perform an unauthorized operation.,Microsoft.PowerShell.Commands.GetWinEventCommand
Похоже, что это новая разработка, ранее не было таких ошибок.
Это согласуется — если я запускаю его с -computername с другого сервера, шаблон все равно отправляет 3 строки OK, затем X ошибок, затем 5 строк OK и т. Д.
(У меня пока недостаточно репутации, чтобы комментировать…)
Когда вы запускаете его как служебную учетную запись на вашем компьютере, повышается ли приглашение Powershell?
Я получал эту ошибку (доступ к реестру не разрешен) при запуске Powershell в приглашении без повышенных прав на моем компьютере.
Знаете ли вы, что такое политика выполнения на удаленных машинах? Я не уверен, имеет ли это значение, так как командлет удален сам, но, возможно, стоит проверить.
Также, к вашему сведению:
Труба в любом случае является естественным разрывом линии, вам не нужны обратные черты (просто не оставляйте пробелов после трубы).
Например:
cmdlet1 |
cmdlet2 |
cmdlet 3