Ошибка get-eventlog Powershell после KB4565503

В домашней сети настольный компьютер прочитал журнал событий ноутбука до 30.06.2020. Впервые с тех пор я запустил полученный скрипт

get-eventlog: Попытка выполнить несанкционированную операцию

Это также происходит в режиме администратора.

И настольный компьютер, и ноутбук были обновлены до версии KB4565503. В этом обновлении говорится, что в него включено несколько обновлений безопасности. Хорошо, но что мне нужно сделать, чтобы скрипт запустился?

get-errors.ps1:

Param([parameter(Mandatory=$true)]
[string]$startDate
)

$after = Get-Date -Date $startDate

Write-Host "Getting power data"
$power = get-eventlog -computername geolaptop -log System -instanceid (1,42) -after $after | where-object {$_.Source -eq "Microsoft-Windows-Kernel-Power" -or $_.Source -eq "Microsoft-Windows-Power-Troubleshooter"}

Write-Host "Create power CSV file"
$power | select-object "eventid", "timegenerated" |export-csv power.csv

Write-Host "Getting error data"
$errors = get-eventlog -computername geolaptop -log System -instanceid (17) -after $after

Write-Host "Create errors CSV file"
$errors | select-object "timegenerated" |export-csv errors.csv

Write-Host "Populate MySQL tables"
.\sessions

2 ответа

Ключевое различие между ответами здесь - использование Get-WinEvent, что не привело к отказу. Благодарность за это была дана @postanote. Ниже моя адаптация ответа постаноте.

# Include quoted greatest date (e.g., '2020-06-30') from db as command line parameter

Param([parameter(Mandatory=$true)]
[string]$startDate
)

$after = Get-Date -Date $startDate
# after is now an object

'power','error' | 
ForEach {
    switch ($PSItem) 
    { 
        power 
        {
            "Getting $PSItem data"
            # remote computer name is required
            Get-WinEvent -ComputerName 'geolaptop' -FilterHashtable @{
                LogName     = 'System'
                Id          = 1, 42
                StartTime   = $after
            } | 
            # restrict properties to only those required
            Select-Object -Property Id, TimeCreated | 
            Export-Csv -Path "$($PSItem).Csv"   
        } 
        error 
        {
            "Getting $PSItem data"
            # remote computer name is required
            Get-WinEvent -ComputerName 'geolaptop' -FilterHashtable @{
                LogName     = 'System'
                Id          = 17
                StartTime   = $after
            } | 
            # restrict properties to only those required
            Select-Object -Property TimeCreated | 
            Export-Csv -Path "$($PSItem).Csv"         
        } 
        default {Write-Warning -Message 'No records which meet the criteria provided.'}
    }
}

"Populate MySQL tables"
.\sessions

После моего комментария:

На самом деле это не проблема 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
Другие вопросы по тегам