分類:[C#]
2010/12/20(Mon) 13:23:50 編集(投稿者)
お世話になります。
OS:Windows XP
環境:VisualStudio2010
使用言語:C#
.NET:4.0
C#にてWMIを使用してUSBメモリのシリアル番号を取得したいと思い、下記URLを参考に作ってみたのですが、取得に失敗してしまいます。
http://blogs.yahoo.co.jp/kinuyo_asami/16010191.html
VBにコピペしてみたところ動作しましたので、権限等の問題では無いと思われます。
エラー時のクエリは、以下のようになっています。
QueryString = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='Disk #3, Partition #0'} WHERE AssocClass = Win32_LogicalDiskToPartition"
クエリの記述やパラメータの使い方に何か問題でもあるのでしょうか?
よろしくお願いします。
using System.Management; // 参照の追加も必要
private void button1_Click(object sender, EventArgs e)
{
label1.Text = USB_SerialGet("G:");
}
private string USB_SerialGet(string strDriveLetter)
{
ManagementObjectCollection mocDiskDrives;
ManagementObjectCollection mocLogicalDisks;
ManagementObjectCollection mocPartitions;
string strDriveDeviceID;
string strPartitionDeviceID;
string strLogicalDeviceID;
string strPNPDeviceID;
using (ManagementObjectSearcher mojWMISeacher = new ManagementObjectSearcher(
"root\\CIMV2", "SELECT * FROM Win32_DiskDrive Where InterfaceType=\'USB\'")) // USBドライブから検索
// "root\\CIMV2", "SELECT * FROM Win32_DiskDrive")) // 全てのドライブから検索
{
mocDiskDrives = mojWMISeacher.Get();
foreach (ManagementObject mojDrive in mocDiskDrives)
{
strDriveDeviceID = mojDrive.GetPropertyValue("DeviceID").ToString(); // 実行時、"\\\\.\\PHYSICALDRIVE3" が入る
//strDriveDeviceID = strDriveDeviceID.Replace(@"\\",@"\"); // Replaceが必要?
mojWMISeacher.Query.QueryString =
"ASSOCIATORS OF {Win32_DiskDrive.DeviceID=\'" +
strDriveDeviceID + "\'} WHERE AssocClass = " +
"Win32_DiskDriveToDiskPartition";
mocPartitions = mojWMISeacher.Get();
if (mocPartitions.Count == 0) continue;
foreach (ManagementObject mojPartition in mocPartitions)
{
strPartitionDeviceID = mojPartition.GetPropertyValue("DeviceID").ToString();
mojWMISeacher.Query.QueryString =
"ASSOCIATORS OF {Win32_DiskPartition.DeviceID=\'" +
strPartitionDeviceID + "\'} WHERE AssocClass = " +
"Win32_LogicalDiskToPartition";
mocLogicalDisks = mojWMISeacher.Get(); // ←ここで失敗している
if (mocLogicalDisks.Count == 0) continue;
foreach (ManagementObject mojLogicakDisk in mocLogicalDisks)
{
strLogicalDeviceID = mojLogicakDisk.GetPropertyValue("DevieID").ToString();
strPNPDeviceID = mojDrive.GetPropertyValue("PNPDeviceID").ToString();
// 確認用
MessageBox.Show("Disk:" + strLogicalDeviceID + "---" + strPNPDeviceID);
if (strLogicalDeviceID == strDriveLetter)
{
int iYen = strPNPDeviceID.LastIndexOf('\\');
return strPNPDeviceID.Substring(iYen);
}
}
}
}
}
return string.Empty;
}
}