运行 Get-WinEvent 可以使用通配符:
Get-WinEvent -filterhashtable
@{logname="*";providername="*cluster*";starttime="04.01.2022";endtime="05.31.2022";level=2} -
ErrorAction SilentlyContinue
但仅对 logname 和 providername 使用通配符(令人惊讶的是)不会返回任何记录:
Get-WinEvent -filterhashtable
@{logname="*";providername="*";starttime="04.01.2022";endtime="05.31.2022";level=2} -
ErrorAction SilentlyContinue
所以:如何在给定的时间跨度内从每个提供者的每个日志中搜索所有错误?
StartTime
并且EndTime
应该是 type DateTime
,但您提供的字符串可能会或可能不会转换为 datetime 对象。
请参阅Get-WinEvent参数-FilterHashtable
*
由于为参数提供单个通配符LogName
并且ProviderName
显然不起作用,因此您可以首先检索系统中存在的所有有效日志名和提供程序名称作为字符串数组并使用它们:
# get an array of all Log names
$logNames = [string[]](Get-WinEvent -ListLog *).LogName
# below line is bound to give you exceptions, so use SilentlyContinue
$logProviders = [string[]](Get-WinEvent -ListProvider * -ErrorAction SilentlyContinue).Name
$startDate = (Get-Date -Year 2022 -Month 4 -Day 1).Date # set to midnight
$endDate = $startDate.AddMonths(2).AddDays(-1) # calculate 2 months duration
$filter = @{LogName=$logNames; ProviderName=$logProviders; StartTime=$startDate; EndTime=$endDate; Level=2}
Get-WinEvent -FilterHashtable $filter -ErrorAction SilentlyContinue
使用开始和结束日期作为字符串,如"04.01.2022"
MAY在您的系统中工作,但如果您在世界的不同地方,因此使用不同的系统区域设置,这些字符串很可能无法转换为 DateTime 对象。因此,始终最好使用文档中所述的正确数据类型。
根据文档参数 LogName:
“Get-WinEvent cmdlet 查询限制为 256 的 Windows API。这会使一次过滤所有日志变得困难。您可以通过使用循环遍历每个日志来解决此问题”,
也许更好地使用像这样的循环
# below line is bound to give you exceptions, so use SilentlyContinue
$logProviders = [string[]](Get-WinEvent -ListProvider * -ErrorAction SilentlyContinue).Name
$startDate = (Get-Date -Year 2022 -Month 4 -Day 1).Date # set to midnight
$endDate = $startDate.AddMonths(2).AddDays(-1) # calculate 2 months duration
Get-WinEvent -ListLog * | ForEach-Object {
$filter = @{LogName=$_.LogName; ProviderName=$logProviders; StartTime=$startDate; EndTime=$endDate; Level=2}
Get-WinEvent -FilterHashtable $filter -ErrorAction SilentlyContinue
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句