5

当我运行下面的脚本来检索日志文件时,get-winevent“消息”字段是空白的,但如果我运行 get-eventlog,就会有数据。任何想法为什么?

#has message data 
Get-Eventlog -LogName application -Newest 10

 #date 10 days ago 
$EventStartDate = get-date("10 May 2012") 
$EventEndDate = get-date("11 May 2012") 
$EventLogNames = @("Application", "system")

#critea for winevent 
$EventCritea = @{logname = $EventLogNames; StartTime=$EventStartDate; EndTime=$EventEndDate}

#Retrieves the event log 
$RetreivedEvents = Get-WinEvent -computername localhost -FilterHashtable $EventCritea
$RetreivedEvents | fl id, logname, MachineName, Message, TimeCreated
4

6 回答 6

8

What locale are you running under?

There is a .NET bug where the underlying .NET method (that Get-WinEvent uses) fails to populate localised fields (like Message) in some locales (like en-GB).

Fix is to switch to en-US for the command:

$orgCulture = Get-Culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
# Perform Get-WinEvent
[System.Threading.Thread]::CurrentThread.CurrentCulture = $orgCulture
于 2012-07-09T14:44:57.283 回答
2

我相信这是因为消息隐藏在属性值中。要显示所有消息,请使用以下表达式将 get-winevent 传递给 select 语句:

@{Label='Messages';Expression={$_.properties.Value}}

如果您希望显示特定消息,例如登录过程(在安全日志中),请使用以下表达式:

@{Label='Logon Process';Expression={$_.properties.Value[3]}}
于 2014-11-27T09:29:38.220 回答
0

你在什么 PSHost 下运行?

我在访问 W2k8 的 Windows 7 上运行的 PS V2.0 上遇到问题。如果在 Powershell 控制台或 Powershell ISE 中运行,它会检索所有数据。但是,如果在运行空间内或从 PowerGUI (pro) 中运行,它只返回不包括 Message 属性的部分子集。

[编辑] Richard 的帖子让我可以解决这个问题,但这很奇怪,因为工作 PS 控制台中的文化是“en-GB”,而非工作 PowerGui 脚本编辑器中的文化是“en-GB”,它只有效如果我将文化更改为“en-US”。

怪异的

于 2012-07-09T12:19:18.217 回答
0

我知道过去我在尝试过 get-winevent 时看到它在 Windows Server 2003 上不起作用。基本上 PS 环境说 get-winevent 不适用于 2003 年。那可能是 PS v1,所以我不确定是否可以通过更新版本的 PS 解决这个问题:我现在在 2K8 R2 上。

在我的

于 2012-05-11T01:18:13.960 回答
0

在我的脚本顶部添加以下行对我有用(取自 Richards 代码片段);

[System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
于 2014-01-02T16:45:55.793 回答
0

[PS 2.0] 请注意,文化更改仅对当前管道有效。见文化陷阱

因此,临时更改区域性 + get-winevent 的命令需要组合在一个脚本块中(包含在“{...}”中)或用“;”分隔的一行。

我在尝试在 Server 2008 上的系统日志上使用 get-winevent 时发现了这一点。消息是空的,我需要将文化从 nl-BE 更改为 en-US。

于 2018-04-13T16:34:04.973 回答