2012-12-04 34 views
1

我正在嘗試使用Power Shell將事件日誌文件(.evtx)轉換爲xml(後來在C#程序中讀取此xml)。我正在運行腳本在Power Shell中讀取.evtx文件

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

你說'在Windows事件查看器,我可以看到所有events'的消息...是否有任何特殊字符(包括比較跡象)在缺少在XML中的消息? –

+0

@YannickBlondeau:謝謝你的評論。實際上,我可以檢查消息中是否有任何特殊字符,但我應該說,在具有2008 R2操作系統的另一臺計算機上,相同的事件日誌已正確轉換爲XML(即沒有丟失消息)。在我的Windows7機器上,這個問題正在發生。 – ViV

回答

0

試試這個,告訴我它是如何工作的。 $Objects = get-WinEvent -Maxevents 10 |ConverTo-XML -NoTypeInformation $objects.Object|Select -ExpandProperty Property

編輯:對不起,我忘了整個'在一個文件中想要它......

$對象=得到-WinEvent -Maxevents 10 | ConverTo-XML -NoTypeInformation -as流> C:\ Test.xml

1

我注意到你說你想在PS> xml中讀取事件日誌到C#中的過程。 我只是讀書採用.evtx文件直接在C#:

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

也許你忘了提及到PowerShell的應遞歸到與創建該對象的XML表示深度,深度默認值是1。像下面的東西應該工作

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