【问题标题】:How to write an event log entry with structured XML data?如何使用结构化 XML 数据编写事件日志条目?
【发布时间】:2015-04-19 11:50:21
【问题描述】:

问题:如何使用 PowerShell 编写包含结构化 XML 数据的事件日志条目?

我的 PowerShell 脚本使用 Write-EventLog cmdlet 写入 Windows 事件日志。目前我使用-Message参数来设置事件日志消息:

Write-EventLog -LogName $EventLogName -Source $EventSource -EntryType Error -EventId 1 -Message "MyMessageHere"

如果您使用 Windows EventViewer 查看消息,您会得到如下 XML:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    [...]
  </System>
  <EventData>
    <Data>MyMessageHere</Data> 
  </EventData>
</Event>

即消息被设置为事件数据。现在我想编写结构化事件数据,其中 Data 元素的内容是 XML(请参阅您自己的 Windows\Security 日志以获取示例)。

我尝试使用Write-EventLog 如下:-Message "&lt;Data Name=""MyKey1""&gt;MyValue1&lt;/Data&gt; 但不能正常工作,看起来消息作为 CDATA 添加到 Data 元素内部。

那么,如何使用 PowerShell 编写包含结构化 XML 数据的事件日志条目?

【问题讨论】:

  • 实际上,我希望它被添加为 CDATA。这是将任意文本数据嵌入现有 XML(Event 已经是什么)中的唯一“安全”方式。但为什么这是一个问题?当您阅读您的事件时,您知道您的数据实际上是 XML 并且可以这样使用它。
  • 客户有一个工具可以发现正确的 XML 并收集数据。它不适用于 CDATA。 (这也是记录事件数据的正确方法,甚至 Windows EventViewer 也会注意到“真实”XML 并将其显示为与 CDATA 相比的树状结构)
  • 据我了解,XML 数据是 Vista 附带的新事件日志接口的一部分,需要您注册清单——您不能只在其中转储任何旧 XML。有关在 .NET 中执行此操作的包,请参阅 blogs.msdn.com/b/dotnet/archive/2013/08/09/… - 在 PowerShell 中使用此功能需要使用自定义 cmdlet 包装该代码。简而言之:不是微不足道的。

标签: xml powershell powershell-3.0 event-log


【解决方案1】:

这是有关如何执行此操作的真正答案: https://kevinholman.com/2016/04/02/writing-events-with-parameters-using-powershell/

#Script to create events with parameters

#Define the event log and your custom event source
$evtlog = "Application"
$source = "MyEventSource"

#These are just examples to pass as parameters to the event
$hostname = "computername.domain.net"
$timestamp = (get-date)

#Load the event source to the log if not already loaded.  This will fail if the event source is already assigned to a different log.
if ([System.Diagnostics.EventLog]::SourceExists($source) -eq $false) {
    [System.Diagnostics.EventLog]::CreateEventSource($source, $evtlog)
}

#function to create the events with parameters
function CreateParamEvent ($evtID, $param1, $param2, $param3)
  {
    $id = New-Object System.Diagnostics.EventInstance($evtID,1); #INFORMATION EVENT
    #$id = New-Object System.Diagnostics.EventInstance($evtID,1,2); #WARNING EVENT
    #$id = New-Object System.Diagnostics.EventInstance($evtID,1,1); #ERROR EVENT
    $evtObject = New-Object System.Diagnostics.EventLog;
    $evtObject.Log = $evtlog;
    $evtObject.Source = $source;
    $evtObject.WriteEvent($id, @($param1,$param2,$param3))
  }


#Command line to call the function and pass whatever you like
CreateParamEvent 1234 "The server $hostname was logged at $timestamp" $hostname $timestamp

【讨论】:

  • 您为什么添加您使用的 Google 查询?
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2010-09-23
  • 2011-08-07
  • 2011-11-29
相关资源
最近更新 更多