2012-03-26 43 views
1

有誰知道是否可以將Windows事件日誌從給定的時間間隔保存爲使用C#的文本文件?例如,假設我想將系統事件日誌從10點到11點保存在文本文件中。如果有可能任何人有一個好的教程的鏈接,或者可能讓我去的代碼片段?我在網上搜索,但不能得到我在找什麼。使用C#從指定時間段收集事件日誌

回答

1

只是增加信息的其他人如何按時間範圍爲WMI查詢的一部分篩選事件日誌。

注意「TimeGenerated」是當事件發生,「TimeWritten」當他們登錄。 在「RecordNumber」是唯一的索引,用於防止碰撞的或重複的記錄是有用的。

System.Management.ManagementDateTimeConverter該C#日期時間和WMI CIM_DATETIME格式之間進行轉換。 但要知道它使UTC CIM到本地的DateTime而留下無具體規定,所以設置後一種避免頭痛!

這是抓安全故障(跟蹤停工)在最後30分鐘的例子:

private void SearchEventViewer(string computerName, string userName, string userPass) 
{ 
    var scope = CreateManagementScope(computerName, userName, userPass); 
    var startTime = ManagementDateTimeConverter.ToDmtfDateTime(DateTime.UtcNow.AddMinutes(-30)); 
    var query = new SelectQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventType = '5' AND TimeGenerated > '" + startTime + "'"); 

    using (var searcher = new ManagementObjectSearcher(scope, query)) 
    { 
     var result = searcher.Get(); 

     foreach (var item in result) 
     { 
      var eventTimeLocal = DateTime.SpecifyKind(ManagementDateTimeConverter.ToDateTime(item["TimeGenerated"].ToString()), DateTimeKind.Local); 
      var eventTimeUtc = eventTimeLocal.ToUniversalTime(); 

      var eventDetails = item["Message"].ToString().Replace("\r\n\r\n", "\r\n"); 
      eventDetails += "\r\nEventCode: "  + item["EventCode"]; 
      eventDetails += "\r\nCatogory: "  + item["Category"]; 
      eventDetails += "\r\nRecord Number: " + item["RecordNumber"]; 
      eventDetails += "\r\nLocal Time: " + eventTimeLocal.ToString("yyyy-MM-dd HH:mm:ss"); 

      // Do something... 
     } 
    } 
} 

private ManagementScope CreateManagementScope(string computerName, string username = "", string password = "") 
{ 
    var managementPath = @"\\" + computerName + @"\root\cimv2"; 
    var scope = new ManagementScope(managementPath); 

    if (username != "" && password != "") 
    { 
     scope.Options = new ConnectionOptions 
     { 
      Username = username, 
      Password = password, 
      Impersonation = ImpersonationLevel.Impersonate, 
      Authentication = AuthenticationLevel.PacketPrivacy 
     }; 
    } 

    return scope; 
}