【问题标题】:powershell: get-winevent has no message data?powershell:get-winevent 没有消息数据?
【发布时间】:2012-05-19 02:00:16
【问题描述】:

当我运行下面的脚本来检索日志文件时,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

【问题讨论】:

  • 只是想知道——你有没有在不同的系统上试过这个?两者都对我有用。
  • 消息是否包含数据?我已经在 2 个 Windows 7 客户端上尝试过。你用的是哪个操作系统版本?
  • 它看起来像是特定于操作系统的,因为 windows 2008 R2 会显示带有消息的结果,但 windows 7 不会
  • 我在查看本地事件日志的 Windows 8 机器(使用 PowerShell v3)上看到了这个错误,几乎所有结果。运行您的代码对我来说结果相同(大多数消息是空的,但有些是可见的)。使用“-version 2”开关启动 PowerShell 似乎可以解决问题,但显然 Windows 7 默认为 v2,这很奇怪!文化是英文。
  • 这是 Microsoft Connect 上的一个活跃错误。 Get-WinEvent does not return the content of the Event Message in V3 CTP2。投票支持它以说服微软解决这个问题。

标签: powershell event-log event-viewer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    @{Label='Logon Process';Expression={$_.properties.Value[3]}}
    

    【讨论】:

      【解决方案3】:

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

      [System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
      

      【讨论】:

        【解决方案4】:

        你在什么 PSHost 下运行?

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

        [编辑] Richard 的帖子允许我解决这个问题,但这很奇怪,因为工作 PS 控制台中的文化是“en-GB”,而非工作 PowerGui 脚本编辑器中的文化是“en-GB”,只有在我改变时才有效'en-US' 的文化。

        怪异

        【讨论】:

          【解决方案5】:

          你在什么语言环境下运行?

          存在一个 .NET 错误,其中基础 .NET 方法(Get-WinEvent 使用)无法在某些语言环境(如 en-GB)中填充本地化字段(如 Message)。

          修复是切换到en-US的命令:

          $orgCulture = Get-Culture
          [System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object "System.Globalization.CultureInfo" "en-US"
          # Perform Get-WinEvent
          [System.Threading.Thread]::CurrentThread.CurrentCulture = $orgCulture
          

          【讨论】:

          • 鉴于 PowerShell 有时会在不同的线程上执行不同的命令,此修复可能只会间歇性地起作用。
          • @JasonStangroome 在脚本中,所有内容都在单个线程上处理,创建大量线程似乎是命令行的功能(我通过 Get-WinEvent 的包装器替换来实现这一点) .
          • 有一个关于这个问题的 Microsoft Connect 项目。 Get-WinEvent does not return the content of the Event Message in V3 CTP2。投票支持它以说服微软解决这个问题。
          【解决方案6】:

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

          在我的

          【讨论】:

          • 它看起来像是特定于操作系统的,因为 windows 2008 R2 会显示带有消息的结果,但 windows 7 不会。
          猜你喜欢
          • 1970-01-01
          • 2011-05-22
          • 2016-01-10
          • 2010-09-24
          • 2013-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多