Powershell ошибка попытка выполнить несанкционированную операцию

При расследовании различных инцидентов администратору необходимо получить информацию кто и когда заходил на определенный компьютер Windows. Историю входов пользователя в доменной сети можно получить из журналов контроллеров домена. Но иногда проще получить информацию непосредсвенно из логов компьютера. В этой статье мы покажем, как получить и проанализировать историю входа пользователей на компьютер/сервер Windows. Такая статистика поможет вам ответить на вопрос “Как в Windows проверить кто и когда использовал этот компьютере”.

Содержание:

  • Настройка политики аудита входа пользователей в Windows
  • Поиск событий входа пользователей в журнале событий Windows
  • Анализ событий входа пользователей в Windows с помощью PowerShell

Настройка политики аудита входа пользователей в Windows

Сначала нужно включить политик аудита входа пользователей. На отдельностоящем компьютере для настройки параметров локальной групповой политики используется оснастка gpedit.msc. Если вы хотите включить политику для компьютеров в домене Active Directorty, нужно использовать редактор доменных GPO (
gpmc.msc
).

  1. Запустите консоль GPMC, создайте новую GPO и назначьте ее на Organizational Units (OU) с компьютерами и / или серверами, для которых вы хотите включить политику аудита событий входа;
  2. Откройте объект GPO и перейдите в раздел Computer Configuration -> Policies -> Windows Settings -> Security Settings –> Advanced Audit Policy Configuration -> Audit Policies -> Logon/Logoff;
  3. Включите две политики аудита Audit Logon и Audit Logoff. Это позволит отслеживать как события входа, так и события выхода пользователей. Если вы хотите отслеживать только успешные события входа, включите в настройках политик только опцию Success; груповая политика - аудит событий входа на компьютеры windows
  4. Закройте редактор GPO и обновите настройки политик на клиентах.

Поиск событий входа пользователей в журнале событий Windows

После того как вы включили политики аудита входа, при каждом входе пользователя в Windows в журнале Event Viewer будет появляться запись о входе. Посмотрим, как она выглядит.

  1. Откройте оснастку Event Viewer (
    eventvwr.msc
    );
  2. Разверните секцию Windows Logs и выберите журнал Security;
  3. Щелкните по нему правой клавишей и выберите пункт Filter Current Log;
  4. В поле укажите ID события 4624 и нажмите OK; фильтр событий event viewer
  5. В окне события останутся только события входа пользователей, системных служб с описанием
    An account was successfully logged on
    ;
  6. В описании события указано имя и домен пользователя, вошедшего в систему:
    New Logon:
    Security ID: WINITPROa.khramov
    Account Name: a.khramov
    Account Domain: WINITPRO

событие eventid 4626 - локальный вход пользователя в windows

Ниже перечислены другие полезные 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

poweshell скрипт для получения списка пользователей, которые входили на этот компьтер

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

Понравилась статья? Поделить с друзьями:
  • Powershell обработка ошибок выполнения
  • Powershell неизвестная ошибка 0x80005000
  • Powershell не показывать ошибку
  • Powershell не показывать ошибки
  • Powershell не отображать ошибки