Ошибка 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