2

WMIに関して他に少なくとも2つの質問を見てきましたが、私の質問に対する答えはありませんでした。

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%"

%SQL%ただし、c#は、ステートメントを囲む二重引用符を解析できません\。エスケープ文字を使用しても、結果は得られません。

私のコードと以下に投稿されたコードをテストするために、MicrosoftのWMIコードクリエーターを使用しました

4

1 に答える 1

3

クエリのように実行する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

于 2013-02-18T14:20:47.603 に答える