我正在尝试使用Power Shell将事件日志文件(.evtx)转换为xml(稍后在C#程序中读取此xml)。我正在运行脚本
get-winevent -Path "C:\test.evtx" -oldest | convertto-xml -as Stream > "C:\test.xml"
但是生成的xml文件有许多“消息”字段为EMPTY的事件。如果我在Windows事件查看器中打开相同的.evtx,我可以看到所有事件的消息。
虽然报告了此问题且人们已经讨论过此问题(here& here),但我无法找到解决方案/解决方法。
任何人都可以告诉我这个问题是否有新的可用内容或任何可能有帮助的信息。
PS:我使用的是Power shell 2.0版。
答案 0 :(得分:1)
我注意到你说你想在PS>中阅读一个事件日志xml到C#中的进程。 我只是直接在C#中读取.evtx文件:
class Program
{
static IEnumerable<EventLogRecord> LogRecordCollection(string filename, string xpathquery = "*")
{
var eventLogQuery = new EventLogQuery(filename, PathType.FilePath, xpathquery);
using (var eventLogReader = new EventLogReader(eventLogQuery))
{
EventLogRecord eventLogRecord;
while ((eventLogRecord = (EventLogRecord)eventLogReader.ReadEvent()) != null)
yield return eventLogRecord;
}
}
static void Main(string[] args)
{
var path = "file.evtx";
var start = new DateTime(2013, 06, 26, 0, 0, 0);
var end = new DateTime(2013, 06, 27, 0, 0, 0);
var t = from l in LogRecordCollection(path)
where l.TimeCreated > start
&& l.TimeCreated < end
select l;
foreach (var item in t)
{
var msg = item.Properties[0].Value.ToString();
if (msg.Contains("[interesting key]"))
{
Console.Write(item.TimeCreated);
Console.Write(";");
Console.Write(item.TaskDisplayName);
Console.Write(";");
Console.Write(item.ProviderName);
Console.Write(";");
Console.Write(msg);
Console.Write(";");
Console.WriteLine();
}
}
Console.Read();
}
}
答案 1 :(得分:1)
也许您忘了提及PowerShell应该深入到哪个深度并创建Object的XML表示,深度的默认值为1.下面的内容应该可以使用
get-winevent -Path "C:\test.evtx" -oldest | convertto-xml -as Stream -depth 10 > "C:\test.xml"
答案 2 :(得分:0)
试试这个,告诉我它是如何工作的。
$Objects = get-WinEvent -Maxevents 10 |ConverTo-XML -NoTypeInformation
$objects.Object|Select -ExpandProperty Property
$ Objects = get-WinEvent -Maxevents 10 | ConverTo-XML -NoTypeInformation -as Stream&gt; C:\的test.xml