2012-03-26 3 views
1

C#でテキストファイルとして特定の時間間隔からWindowsイベントログを保存できるかどうかは誰にも分かりますか?たとえば、システムイベントログをテキストファイルに保存するとします。可能であれば、誰かが良いチュートリアルへのリンクを持っているのでしょうか、それとも、私を得ることができるコードスニペットですか?私はオンラインで検索しましたが、私が探しているものは取得できません。ただ、WMIクエリの一部として、時間帯によってイベントログをフィルタリングする方法については他の人のための情報を追加することC#を使用して指定された期間からイベントログを収集する

答えて

1

「TimeGenerated」は、イベントが発生したときに、「TimeWritten」がログに記録されたときに発生します。 'RecordNumber'はユニークなインデックスで、衝突や重複したログを防ぐのに便利です。

System.Management.ManagementDateTimeConverter C#DateTimeとWMI CIM_DATETIME形式を変換します。 しかし、Kind Unspecifiedを残している間はUTC CIMをローカルDateTimeにしてしまうので、後で頭痛を避けるためにKindを設定してください!

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; 
}