2010-12-12 6 views
1

У меня возникла проблема с использованием приведенного ниже кода для извлечения данных из события журнала безопасности моей локальной машины. Я тестировал на разных компьютерах: локальная машина - это windows xp sp3. Запрос не имеет ошибки, но возвращает 0 записей. Для удаленных компьютеров он отлично работает Любой может дать мне решение? Это код:запрос на Win32_NTLogEvent WHERE Logfile = 'Security' работает только на удаленном компьютере

using System; 
using System.Management; 
using System.Windows.Forms; 

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       string[] arrComputers = {".","clientN"}; 
       foreach (string strComputer in arrComputers) 
       { 
        Console.WriteLine("=========================================="); 
        Console.WriteLine("Computer: " + strComputer); 
        Console.WriteLine("=========================================="); 

        ManagementObjectSearcher searcher = 
         new ManagementObjectSearcher(
         "\\\\" + strComputer + "\\root\\CIMV2", 
         "SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security'"); 

        foreach (ManagementObject queryObj in searcher.Get()) 
        { 
         Console.WriteLine("-----------------------------------"); 
         Console.WriteLine("Win32_NTLogEvent instance"); 
         Console.WriteLine("-----------------------------------"); 
         Console.WriteLine("RecordNumber: {0}", queryObj["RecordNumber"]); 
         Console.WriteLine("SourceName: {0}", queryObj["SourceName"]); 
         Console.WriteLine("TimeGenerated: {0}", queryObj["TimeGenerated"]); 
        } 
       } 
      } 
      catch(ManagementException err) 
      { 
       MessageBox.Show("An error occurred while querying for WMI data: " + err.Message); 
      } 
     } 
    } 
} 

я понял, что с использованием уровня олицетворения для запроса Wmi в VBS он работает.

Set objWMI = GetObject("winmgmts:" _ 
& "{impersonationLevel=impersonate,(Security)}!\\" _ 
& strComputer & "\root\cimv2") 
Set colLoggedEvents = objWMI.ExecQuery _ 
("Select * from Win32_NTLogEvent Where Logfile = 'Security'") 

Так что я должен перевести на C#.

ответ

1

Хорошо, поэтому я закрываю этот вопрос, используя свой код. код:

 using System; 
     using System.Management; 
     namespace WMISample 
     { 
      public class MyWMIQuery 
      { 
       public static void Main() 
       { 
        try 
        { 
         ConnectionOptions oConn = new ConnectionOptions(); 
         oConn.Impersonation = ImpersonationLevel.Impersonate; 
         oConn.EnablePrivileges = true; 

         string[] arrComputers = {".","clientN"}; 
         foreach (string strComputer in arrComputers) 
         { 
          Console.WriteLine("=========================================="); 
          Console.WriteLine("Computer: " + strComputer); 
          Console.WriteLine("=========================================="); 
          ManagementObjectSearcher searcher = new ManagementObjectSearcher 
          (
           new ManagementScope("\\\\" + strComputer + "\\root\\CIMV2", oConn), 
           new ObjectQuery(@"SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security'") 
          ); 


          foreach (ManagementObject queryObj in searcher.Get()) 
          { 
           Console.WriteLine("-----------------------------------"); 
           Console.WriteLine("Win32_NTLogEvent instance"); 
           Console.WriteLine("-----------------------------------"); 
           Console.WriteLine("RecordNumber: {0}", queryObj["RecordNumber"]); 
           Console.WriteLine("SourceName: {0}", queryObj["SourceName"]); 
           Console.WriteLine("TimeGenerated: {0}", queryObj["TimeGenerated"]); 
          } 
         } 
        } 
        catch(ManagementException err) 
        { 
         MessageBox.Show("An error occurred while querying for WMI data: " + err.Message); 
        } 
       } 
      } 
     } 

0

попробуйте использовать локальное имя компьютера вместо «.». поэтому, вместо того, чтобы

string[] arrComputers = {".","clientN"}; 

вы бы

string[] arrComputers = { Environment.GetEnvironmentVariable("computername"), "clientN"};

+0

, к сожалению, это то же самое, как писать имя компьютера и doesen't работу. – AlessandroG

+0

почему отрицательный голос? – AlessandroG

+0

Я тоже задавался вопросом об отрицательном голосовании, поэтому я дал ему положительный ... это достойный вопрос. Я пытаюсь понять, почему вы не можете запросить WMI на локальном компьютере, если мне повезет, я обновлю свой ответ :-) – weloytty