私はすべてのドライブのチェックを実行し、VID/PIDのどれかが特定のものと一致するかどうかを確認する必要があります。その場合、そのフラッシュドライブのドライブ文字を取得する必要があります。 ありがとうございます! WMIはこれを処理することができるはずC#のUSBフラッシュドライブからVID/PIDを取得するにはどうすればよいですか?
7
A
答えて
1
...
あなたはSystem.ManagementのDLLへの参照を追加する必要がありますし、あなたが持っている必要があります。 「System.Managementを使用して、」ライン... CIM_DiskDriveのためのWin32クラスには、以下のパラメータがありMSDNから
using System.Management;
// Get all the disk drives
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
// Loop through each object (disk) retrieved by WMI
foreach (ManagementObject moDisk in mosDisks.Get())
{
// Add the HDD to the list (use the Model field as the item's caption)
cmbHdd.Items.Add(moDisk["Model"].ToString());
}
private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e)
{
// Get all the disk drives from WMI that match the Model name selected in the ComboBox
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
// Loop through the drives retrieved, although it should normally be only one loop going on here
foreach (ManagementObject moDisk in mosDisks.Get())
{
// Set all the fields to the appropriate values
lblType.Text = "Type: " + moDisk["MediaType"].ToString();
lblModel.Text = "Model: " + moDisk["Model"].ToString();
lblSerial.Text = "Serial: " + moDisk["SerialNumber"].ToString();
lblInterface.Text = "Interface: " + moDisk["InterfaceType"].ToString();
// The capacity in gigabytes is easily calculated
lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString() + " bytes (" + Math.Round(((((double)Convert.ToDouble(moDisk["Size"])/1024)/1024)/1024), 2) + " GB)";
lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString();
lblSignature.Text = "Signature: " + moDisk["Signature"].ToString();
lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"].ToString();
lblCylinders.Text = "Cylinders: " + moDisk["TotalCylinders"].ToString();
lblSectors.Text = "Sectors: " + moDisk["TotalSectors"].ToString();
lblHeads.Text = "Heads: " + moDisk["TotalHeads"].ToString();
lblTracks.Text = "Tracks: " + moDisk["TotalTracks"].ToString();
lblBytesPerSect.Text = "Bytes per Sector: " + moDisk["BytesPerSector"].ToString();
lblSectorsPerTrack.Text = "Sectors per Track: " + moDisk["SectorsPerTrack"].ToString();
lblTracksPerCyl.Text = "Tracks per Cylinder: " + moDisk["TracksPerCylinder"].ToString();
}
}
...スクリーンショット、より完全な説明のための下部にあるリンクを参照してください:「デバイスID」は何であるかのように見えます*
http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html
:あなたは...から取られたコードのclass Win32_DiskDrive : CIM_DiskDrive
{
uint16 Availability;
uint32 BytesPerSector;
uint16 Capabilities[];
string CapabilityDescriptions[];
string Caption;
string CompressionMethod;
uint32 ConfigManagerErrorCode;
boolean ConfigManagerUserConfig;
string CreationClassName;
uint64 DefaultBlockSize;
string Description;
string DeviceID;
boolean ErrorCleared;
string ErrorDescription;
string ErrorMethodology;
string FirmwareRevision;
uint32 Index;
datetime InstallDate;
string InterfaceType;
uint32 LastErrorCode;
string Manufacturer;
uint64 MaxBlockSize;
uint64 MaxMediaSize;
boolean MediaLoaded;
string MediaType;
uint64 MinBlockSize;
string Model;
string Name;
boolean NeedsCleaning;
uint32 NumberOfMediaSupported;
uint32 Partitions;
string PNPDeviceID;
uint16 PowerManagementCapabilities[];
boolean PowerManagementSupported;
uint32 SCSIBus;
uint16 SCSILogicalUnit;
uint16 SCSIPort;
uint16 SCSITargetId;
uint32 SectorsPerTrack;
string SerialNumber;
uint32 Signature;
uint64 Size;
string Status;
uint16 StatusInfo;
string SystemCreationClassName;
string SystemName;
uint64 TotalCylinders;
uint32 TotalHeads;
uint64 TotalSectors;
uint64 TotalTracks;
uint32 TracksPerCylinder;
};
上部を望みます
1
デバイスの接続を確認する必要がある場合は、問題がはるかに簡単です。 DBT_DEVICEARRIVAL
イベントを確認する必要があります。 Windowsフォームアプリケーションを作成する場合は、IMessageFilter
インターフェイスを実装しての関数Application
に渡すことでこれを行うことができます。 Formsアプリケーションを使用していない場合は、NativeWindow
からクラスを派生し、WndProcを上書きする必要があります。 RemeberはCreateHandleと呼ぶため、Windowsのメッセージキューに追加されます。
DBT_DEVICEARRIVAL
を受け取ったら、それを解析する必要があります。 (それはテストされていないので、次はIDEで書かれていませんでした)
// Constants from from Dbt.h
const int WM_DEVICECHANGE = 0x219;
const int DBT_DEVICEARRIVAL = 0x8000;
const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05;
const Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED");
bool PreFilterMessage(ref Message m)
{
if(m.Msg == case WM_DEVICECHANGE && m.WParam == DBT_DEVICEARRIVAL)
var broadcast = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_HDR));
if(broadcast.dbch_DeviceType == DBT_DEVTYP_DEVICEINTERFACE)
{
var devInterface = (DEV_BROADCAST_DEVICEINTERFACE)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_DEVICEINTERFACE));
if(devInterface.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE)
{
// devInterface.dbcc_name will contain the VID and PID for example:
// \\?\USB#Vid_067b&Pid_2517#6&12115ad4&2&1#{GUID}
DoSomthingSpecial(devInterface.dbcc_name);
}
}
}
return false;
}
[StructLayout(LayoutKind.Sequential)]
struct DEV_BROADCAST_HDR {
public uint dbch_Size;
public uint dbch_DeviceType;
public uint dbch_Reserved;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)]
public string dbcc_name;
}
すでに接続されているすべてのデバイスを列挙する必要がある場合、私はちょうどWMI methodを使用することをお勧めします。 WMIなしでコードを実行する方法を知りたい場合は、コードUSBViewをWindows Driver Development Kitにチェックアウトしてください。
1
public static bool GetDriveVidPid(string szDriveName, ref ushort wVID, ref ushort wPID)
{
bool bResult = false;
string szSerialNumberDevice = null;
ManagementObject oLogicalDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='" + szDriveName.TrimEnd('\\') + "'");
foreach(ManagementObject oDiskPartition in oLogicalDisk.GetRelated("Win32_DiskPartition"))
{
foreach(ManagementObject oDiskDrive in oDiskPartition.GetRelated("Win32_DiskDrive"))
{
string szPNPDeviceID = oDiskDrive["PNPDeviceID"].ToString();
if(!szPNPDeviceID.StartsWith("USBSTOR"))
throw new Exception(szDriveName + " ist kein USB-Laufwerk.");
string[] aszToken = szPNPDeviceID.Split(new char[] { '\\', '&' });
szSerialNumberDevice = aszToken[aszToken.Length - 2];
}
}
if(null != szSerialNumberDevice)
{
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(@"root\CIMV2", "Select * from Win32_USBHub");
foreach(ManagementObject oResult in oSearcher.Get())
{
object oValue = oResult["DeviceID"];
if(oValue == null)
continue;
string szDeviceID = oValue.ToString();
string[] aszToken = szDeviceID.Split(new char[] { '\\' });
if(szSerialNumberDevice != aszToken[aszToken.Length - 1])
continue;
int nTemp = szDeviceID.IndexOf(@"VID_");
if(0 > nTemp)
continue;
nTemp += 4;
wVID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier);
nTemp += 4;
nTemp = szDeviceID.IndexOf(@"PID_", nTemp);
if(0 > nTemp)
continue;
nTemp += 4;
wPID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier);
bResult = true;
break;
}
}
return bResult;
}
関連する問題
- 1. USBフラッシュドライブの製造元のシリアル番号を取得するにはどうすればよいですか?
- 2. USBフラッシュドライブからデータを読み取るにはどうすればよいですか?
- 3. CでマウントされたUSBフラッシュドライブのサイズを調べるにはどうすればよいですか?
- 4. ファイルをUSBフラッシュドライブにコピーするPowerShellスクリプトを作成するにはどうすればよいですか?
- 5. Cでディレクトリリストを取得するにはどうすればよいですか?
- 6. C#からUSBキーを一意に識別するにはどうすればよいですか?
- 7. osXでUSBドライバ、USBマップ、およびUSBポートにアクセスするにはどうすればよいですか?
- 8. C#アプリケーションからUSBドライブ文字を検出するにはどうすればよいですか?
- 9. Mac OS XでUSBポート番号を取得するにはどうすればよいですか?
- 10. C#のアクセスデータベースから列の説明を取得するにはどうすればよいですか?
- 11. Objective-Cから現在のMacBookのUUIDを取得するにはどうすればよいですか?
- 12. C#からWord文書のファイル名を取得するにはどうすればよいですか?
- 13. データKinect SDK C#からプレーヤーのDepthを取得するにはどうすればよいですか?
- 14. CのIPv4アドレスからホスト名を取得するにはどうすればよいですか?
- 15. C#からCOMコンポーネントのProgIDを取得するにはどうすればよいですか?
- 16. Cの文字配列から文字列を取得するにはどうすればよいですか?
- 17. Windowsソケット(C++)から接続ホストのIPアドレスを取得するにはどうすればよいですか?
- 18. データベースからLINQ C#のデータを取得するにはどうすればよいですか?
- 19. WinRTのC++からスタックトレースを取得するにはどうすればよいですか?
- 20. C#から無線アクセスポイントのMACアドレスを取得するにはどうすればよいですか?
- 21. C#でファイルから変更日を取得するにはどうすればよいですか?
- 22. Cでpcapからネットワーク層とトランスポート層プロトコルを取得するにはどうすればよいですか?
- 23. C#で不明な列挙型から値を取得するにはどうすればよいですか?
- 24. C#でXML Webサービスから値を取得するにはどうすればよいですか?
- 25. -captureStillImageAsynchronouslyFromConnection:completionHandler:から取得したCMSampleBufferからNSImageを取得するにはどうすればいいですか?
- 26. og:imageをページから取得するように設定するにはどうすればよいですか?
- 27. URLDownloadToFileがキャッシュから取得できないようにするにはどうすればよいですか?
- 28. UDPソケット(Windows C++)からIP情報を取得するにはどうすればよいですか?
- 29. URLを取得するにはどうすればいいですか?C#
- 30. これらのJSON結果からタイトルを取得するにはどうすればよいですか?
これは、WMIがトータルオーバーキルであるため、OP質問に対してはるかに良い解決策です。 –