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コードクリエーターを使用しました