2013-02-18 2 views
1

Я видел по крайней мере два других вопроса, касающихся WMI, но никто не ответил на мой вопрос, так вот он;WQL Как инструкция и синтаксис

Я экспериментировал с интерфейсом WMI в своем коде. В основном это то, что у меня есть сейчас, и это работает. Но мне кажется, я мог бы написать это более эффективно:

public bool GetUsbStateById(string id) { bool returnValue = false;

try 
    { 
    ObjectQuery query = new ObjectQuery(); 
    query.QueryString = string.Format("Select * From Win32_PnPDevice"); 
    ManagementObjectSearcher mySearcher = new ManagementObjectSearcher(query); 

    List<ManagementObject> results = (from ManagementObject mo in mySearcher.Get().AsParallel() 
             where mo["SystemElement"].ToString().ToUpper().Contains(id.ToUpper()) 
             select mo).ToList(); 

    if (results.Count > 0) 
     returnValue = true; 
    } 
    catch (Exception ex) 
    { 
    // TODO: implement logging 
    } 

    return returnValue; 
} 

Так что здесь происходит то, что я получаю список ManagementObjects от ManagementObjectSearcher. Это прекрасно работает и также возвращает точные результаты, поскольку я ожидаю, что он сработает.

Но это кажется излишним для меня. Потому что сначала я получаю весь список, а затем фильтрую его. Но поскольку он использует WQL, чтобы заполнить список, я предположил, что я мог бы реализовать что-то вроде этого:

query.QueryString = string.Format("Select * From Win32_PnPDevice where SystemElement Like '%{0}%'",id);

это держит выбрасывания exception, что запрос не является правильным.

поэтому я попытался вместо этого:

query.QueryString = string.Format("Select SystemElement From Win32_PnPDevice);

Это работает, как хорошо, так что в следующий я попытался Win32_PnPDevice.SystemElement, но это не сработало.

любых примеры, я посмотрел на на интернет показал что-то вроде этого

Select * From Win32_Service Where Name Like "%SQL%"

но C# не может разобрать двойные кавычки, которые окружают %SQL% заявления там, используя \ маскирующие не дали никаких результатов или.

Чтобы проверить свой код и код размещен ниже я использовал WMI Code Creator от Microsoft

+1

так, очевидно, что Microsoft не реализовать подобный оператор для классов ref, как описано здесь. http://social.technet.microsoft.com/Forums/nl-BE/winserverpowershell/thread/24981775-e105-42a8-8313-b0b86972f6c3 – wterbeek

ответ

1

, если вы хотите запустить like запрос в WMI, то вы можете использовать ниже пример:

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

namespace WMISample 
{ 
    public class MyWMIQuery 
    { 
     public static void Main() 
     { 
      try 
      { 
       string strSearchText="win"; 
       string strSearchQuery=string.Format("SELECT * FROM Win32_Service where Name like '%{0}%'",strSearchText); 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",strSearchQuery ); 

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

Но вы не можете подать запрос like на номер Win32_PNPDevice как discussed

+0

Я попытался использовать это с моим кодом, но, как я уже говорил, это не работает, хотя я и не работаю. код, который я использовал, является следующим (взято из создателя кода WMI из Microsoft) – wterbeek

+0

вы проверили вышеуказанный код? – Arshad

+0

Почему вы удалили свой поисковый запрос – Arshad

Смежные вопросы