2014-05-22 5 views
1

지난 5 시간 이내에 오류가 발생하여 다른 컴퓨터에 대해 WMI 쿼리를 실행하려고합니다. WMI 쿼리를 실행할 때 적어도 where 절을 사용하여 초기 쿼리를 필터링하면 안됩니까?C# 원격 이벤트 로그를 읽는 WMI

다음

MSDN

에 WMI 코드 생성기에서 생성 된 샘플 떨어져 내 코드를 내놓고

임은 선택 쿼리 메신저 난 그냥 마지막에 오류의 개수를 얻을 수있다

private ManagementScope CreateNewManagementScope(string server) 
    { 
     string serverString = @"\\" + server + @"\root\cimv2"; 

     ManagementScope scope = new ManagementScope(serverString); 

     return scope; 
    } 

      ManagementScope scope = CreateNewManagementScope(servername); 
      scope.Connect(); 
      SelectQuery query = new SelectQuery("select * from Win32_NtLogEvent where TimeWritten > '" + DateTime.Now.AddHours(-5).ToString() + "'"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection logs = searcher.Get(); 

      int iErrCount = logs.Count; 

을 사용하고 있습니다 5 시간. 카운트를받을 때 오류가 발생합니다. 오류는 다소 모호한 "Generic Failure"입니다.

- 위의 코드와 [갱신과 같이 사용하여 날짜 지금]

   DateTime d = DateTime.UtcNow.AddHours(-12); 
      string dateFilter = ManagementDateTimeConverter.ToDmtfDateTime(d); 
      SelectQuery query = new SelectQuery("select * from Win32_NtLogEvent where Logfile='Application' AND Type='Error' AND TimeWritten > '" + dateFilter + "'"); 

나는 어떤 결과를 얻을 수 없다, 그러나 나는 이벤트 로그에서이 오류를 볼 수 있습니다. 날짜 필터에 문제가 있습니까?

임 예 http://msdn.microsoft.com/en-us/library/system.management.managementdatetimeconverter.todatetime.aspx

+0

코드가 던지는 오류는 무엇입니까? –

+0

"일반 오류" Win32_NtLogEvent 공급자를 사용하는 방법, 다른 방법으로 Win32_Service 공급자를 사용하여 같은 방식으로 연결하고 잘 작동합니다. – bitshift

+0

WMI가 날짜 형식을 까다롭게 생각하는 것처럼 보일 지 모르지만 결과는 잘못되었습니다. 날짜에 대해서는'var d = DateTimeOffset.Now.AddHours (-5); var wmiDate = String.Format ("{0 : yyyyMMddHHmmss.ffffff} {1}", d, d.Offset.TotalMinutes);'올바른 형식으로 날짜를 가져 오려면. 도움이 될지도 몰라. – Mark

답변

5

를 사용하여 나는 그것이 작동하도록하려면 다음을했다. 이게 도움이되기를 바랍니다.

static void Main(string[] args) 
    { 
     var conOpt = new ConnectionOptions(); 
     conOpt.Impersonation = ImpersonationLevel.Impersonate; 
     conOpt.EnablePrivileges = true; 
     conOpt.Username = "username"; 
     conOpt.Password = "password"; 
     conOpt.Authority = string.Format("ntlmdomain:{0}", "yourdomain.com"); 

     var scope = new ManagementScope(String.Format(@"\\{0}\ROOT\CIMV2", "yourservername.yourdomain.com"), conOpt); 

     scope.Connect(); 
     bool isConnected = scope.IsConnected; 
     if (isConnected) 
     { 

      /* entire day */ string dateTime = getDmtfFromDateTime(DateTime.Today.Subtract(new TimeSpan(1, 0, 0, 0))); 
      string dateTime = getDmtfFromDateTime("09/06/2014 17:00:08"); // DateTime specific 

      SelectQuery query = new SelectQuery("Select * from Win32_NTLogEvent Where Logfile = 'Application' and TimeGenerated >='" + dateTime + "'"); 
      ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); 
      ManagementObjectCollection logs = searcher.Get(); 
      foreach (var log in logs) 
      { 
       Console.WriteLine("Message : {0}", log["Message"]); 
       Console.WriteLine("ComputerName : {0}", log["ComputerName"]); 
       Console.WriteLine("Type : {0}", log["Type"]); 
       Console.WriteLine("User : {0}", log["User"]); 
       Console.WriteLine("EventCode : {0}", log["EventCode"]); 
       Console.WriteLine("Category : {0}", log["Category"]); 
       Console.WriteLine("SourceName : {0}", log["SourceName"]); 
       Console.WriteLine("RecordNumber : {0}", log["RecordNumber"]); 
       Console.WriteLine("TimeWritten : {0}", getDateTimeFromDmtfDate(log["TimeWritten"].ToString())); 
      } 
     } 

     //ReadLog(); 
     Console.ReadLine(); 
    } 

    private static string getDmtfFromDateTime(DateTime dateTime) 
    { 
     return ManagementDateTimeConverter.ToDmtfDateTime(dateTime); 
    } 

    private static string getDmtfFromDateTime(string dateTime) 
    { 
     DateTime dateTimeValue = Convert.ToDateTime(dateTime); 
     return getDmtfFromDateTime(dateTimeValue); 
    } 

    private static string getDateTimeFromDmtfDate(string dateTime) 
    { 
     return ManagementDateTimeConverter.ToDateTime(dateTime).ToString(); 
    }