1

我正在尝试使用 Power Shell 将事件日志文件 (.evtx) 转换为 xml(然后在 C# 程序中读取此 xml)。我正在运行脚本

get-winevent -Path "C:\test.evtx" -oldest | convertto-xml -as Stream > "C:\test.xml"

但生成的 xml 文件有许多“消息”字段为空的事件。如果我在 Windows 事件查看器中打开相同的 .evtx,我可以看到所有事件的消息。

尽管报告了此问题并且人们已经讨论过它(此处此处),但我无法找到解决方案/解决方法。

谁能告诉我在这个问题上是否有新的可用信息或任何可能有用的信息。

PS:我使用的是 Power shell 2.0 版。

4

3 回答 3

2

也许你忘了提到 PowerShell 应该递归到的深度并创建对象的 XML 表示,深度的默认值是 1。像下面这样的东西应该可以工作

get-winevent -Path "C:\test.evtx" -oldest | convertto-xml -as Stream -depth 10 > "C:\test.xml"
于 2015-06-26T06:17:22.150 回答
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();
    }
}
于 2013-08-06T14:54:15.450 回答
0

试试这个,告诉我它是如何工作的。 $Objects = get-WinEvent -Maxevents 10 |ConverTo-XML -NoTypeInformation $objects.Object|Select -ExpandProperty Property

编辑:对不起,我忘记了整个“想要在文件中”......

$Objects = get-WinEvent -Maxevents 10 |ConverTo-XML -NoTypeInformation -as Stream > C:\Test.xml

于 2013-01-30T20:18:54.600 回答