【问题标题】:Reading an .evtx file in Power Shell在 Powershell 中读取 .evtx 文件
【发布时间】:2012-11-21 19:37:00
【问题描述】:

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

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

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

虽然这个问题被报告并且人们已经谈论它(here & here),但我无法找到解决方案/解决方法。

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

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

【问题讨论】:

  • 您说in Windows Event viewer, I can see messages of all events... XML 中缺少的消息中是否有任何特殊字符(包括比较符号)?
  • @YannickBlondeau:感谢您的评论。我实际上可以检查消息中是否有任何特殊字符,但我应该说,相同的事件日志在具有 2008 R2 操作系统的另一台机器上正确转换为 XML(即没有丢失消息)。而在我的 Windows7 机器上,这个问题正在发生。

标签: c# xml powershell


【解决方案1】:

也许您忘记提及 PowerShell 应该递归到的深度并创建对象的 XML 表示,深度的默认值为 1。类似下面的东西应该可以工作

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

【讨论】:

    【解决方案2】:

    我注意到你说你想在 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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个,告诉我它是如何工作的。 $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

      【讨论】:

        猜你喜欢
        • 2017-08-17
        • 1970-01-01
        • 1970-01-01
        • 2016-02-04
        • 2013-12-15
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多