在Powershell中读取.evtx文件

时间:2012-12-04 08:06:15

标签: c# xml powershell

我正在尝试使用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版。

3 个答案:

答案 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