プログラムが特定の USB フラッシュ ドライブ (単一の製造元の) でのみ動作し、他のすべての USB フラッシュ ドライブ (他の製造元の) を無視する必要があります。
.NET 2.0 を使用している Windows で特定の USB カードが挿入されていることを確認することはできますか? どうやって?
WMI で見つけた場合、どうにかして USB ドライブがどのドライブ文字にあるかを特定できますか?
編集:ドライブ文字を印刷するためのコードを追加しました。
この例がうまくいくかどうかを確認してください。WMIを使用します。
Console.WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
...
Console.WriteLine(" Name: {0}", c["Name"]); // here it will print drive letter
完全なコードサンプル:
namespace WMISample
{
using System;
using System.Management;
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
Console.WriteLine("PNPDeviceID: {0}", queryObj["PNPDeviceID"]);
Console.WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
Console.WriteLine("Model: {0}", queryObj["Model"]);
foreach (ManagementObject b in queryObj.GetRelated("Win32_DiskPartition"))
{
Console.WriteLine(" Name: {0}", b["Name"]);
foreach (ManagementBaseObject c in b.GetRelated("Win32_LogicalDisk"))
{
Console.WriteLine(" Name: {0}", c["Name"]); // here it will print drive letter
}
}
// ...
Console.WriteLine("--------------------------------------------");
}
}
catch (ManagementException e)
{
Console.WriteLine(e.StackTrace);
}
Console.ReadLine();
}
}
}
これらのプロパティは、純正のUSBドライブを他のドライブと区別するのに役立つはずです。複数のペンドライブでテストして、値が同じかどうかを確認します。Win32_DiskDriveプロパティの完全なリファレンスは、次を参照してください。
http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx
この記事があなたにも役立つかどうかを確認してください。
Win32 CM_(デバイス管理)またはWMIのいずれかを通過し、PNPIDを取得します。VID(ベンダーID)を探します。
Win32_USBControllerDevice
下に挿入したデバイスの情報が表示されWin32_DiskDrive
ます。
この情報は、WMIを介して取得できる場合があります。以下は、WMIを使用してWin32_DiskDriveオブジェクトに関する情報を取得するvbsスクリプト(実行するには.vbsを含むテキストファイルにコピー)です。メーカー情報には標準ディスクドライブと記載されている場合がありますが、モデル番号には探しているものが含まれている場合があります。
Set Drives = GetObject("winmgmts:{impersonationLevel=impersonate,(Backup)}").ExecQuery("select * from Win32_DiskDrive")
for each drive in drives
Wscript.echo "Drive Information:" & vbnewline & _
"Availability: " & drive.Availability & vbnewline & _
"BytesPerSector: " & drive.BytesPerSector & vbnewline & _
"Caption: " & drive.Caption & vbnewline & _
"CompressionMethod: " & drive.CompressionMethod & vbnewline & _
"ConfigManagerErrorCode: " & drive.ConfigManagerErrorCode & vbnewline & _
"ConfigManagerUserConfig: " & drive.ConfigManagerUserConfig & vbnewline & _
"CreationClassName: " & drive.CreationClassName & vbnewline & _
"DefaultBlockSize: " & drive.DefaultBlockSize & vbnewline & _
"Description: " & drive.Description & vbnewline & _
"DeviceID: " & drive.DeviceID & vbnewline & _
"ErrorCleared: " & drive.ErrorCleared & vbnewline & _
"ErrorDescription: " & drive.ErrorDescription & vbnewline & _
"ErrorMethodology: " & drive.ErrorMethodology & vbnewline & _
"Index: " & drive.Index & vbnewline & _
"InterfaceType: " & drive.InterfaceType & vbnewline & _
"LastErrorCode: " & drive.LastErrorCode & vbnewline & _
"Manufacturer: " & drive.Manufacturer & vbnewline & _
"MaxBlockSize: " & drive.MaxBlockSize & vbnewline & _
"MaxMediaSize: " & drive.MaxMediaSize & vbnewline & _
"MediaLoaded: " & drive.MediaLoaded & vbnewline & _
"MediaType: " & drive.MediaType & vbnewline & _
"MinBlockSize: " & drive.MinBlockSize & vbnewline & _
"Model: " & drive.Model & vbnewline & _
"Name: " & drive.Name & vbnewline & _
"NeedsCleaning: " & drive.NeedsCleaning & vbnewline & _
"NumberOfMediaSupported: " & drive.NumberOfMediaSupported & vbnewline & _
"Partitions: " & drive.Partitions & vbnewline & _
"PNPDeviceID: " & drive.PNPDeviceID & vbnewline & _
"PowerManagementSupported: " & drive.PowerManagementSupported & vbnewline & _
"SCSIBus: " & drive.SCSIBus & vbnewline & _
"SCSILogicalUnit: " & drive.SCSILogicalUnit & vbnewline & _
"SCSIPort: " & drive.SCSIPort & vbnewline & _
"SCSITargetId: " & drive.SCSITargetId & vbnewline & _
"SectorsPerTrack: " & drive.SectorsPerTrack & vbnewline & _
"Signature: " & drive.Signature & vbnewline & _
"Size: " & drive.Size & vbnewline & _
"Status: " & drive.Status & vbnewline & _
"StatusInfo: " & drive.StatusInfo & vbnewline & _
"SystemCreationClassName: " & drive.SystemCreationClassName & vbnewline & _
"SystemName: " & drive.SystemName & vbnewline & _
"TotalCylinders: " & drive.TotalCylinders & vbnewline & _
"TotalHeads: " & drive.TotalHeads & vbnewline & _
"TotalSectors: " & drive.TotalSectors & vbnewline & _
"TotalTracks: " & drive.TotalTracks & vbnewline & _
"TracksPerCylinder: " & drive.TracksPerCylinder & vbnewline
next
アンマネージ Win32 API 呼び出しを使用してこれを処理できます。
http://www.codeproject.com/KB/system/EnumDeviceProperties.aspx
Win32_DiskDrive
探している情報がオブジェクトから得られない場合は、WMI オブジェクトのWin32_PhysicalMediaクラスを調べることもできます。これらには、製造元、モデル、部品番号、および説明のプロパティがあり、役立つ場合があります。
他の誰かが C++-CLI でこれを行うのに十分なほど狂っている場合に備えて、ここにスミンクの答えの移植があります:
using namespace System;
using namespace System::Management;
void GetUSBDeviceList()
{
try
{
ManagementObjectSearcher^ searcher =
gcnew ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_DiskDrive");
for each (ManagementObject^ queryObj in searcher->Get())
{
Console::WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
Console::WriteLine("PNPDeviceID: {0}", queryObj["PNPDeviceID"]);
Console::WriteLine("Manufacturer: {0}", queryObj["Manufacturer"]);
Console::WriteLine("Model: {0}", queryObj["Model"]);
for each (ManagementObject^ b in queryObj->GetRelated("Win32_DiskPartition"))
{
Console::WriteLine(" Name: {0}", b["Name"]);
for each (ManagementBaseObject^ c in b->GetRelated("Win32_LogicalDisk"))
{
Console::WriteLine(" Name: {0}", c["Name"]); // here it will print drive letter
}
}
// ...
Console::WriteLine("--------------------------------------------");
}
}
catch (ManagementException^ e)
{
Console::WriteLine(e->StackTrace);
}
Console::ReadLine();
}
注:System.Management
プロジェクト プロパティにライブラリへの参照を手動で追加する必要がありました。
こんにちは、WMIを使用してこれを試してください
Option Explicit
Dim objWMIService, objItem, colItems, strComputer
' On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" _
& strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery(_
"Select Manufacturer from Win32_DiskDrive")
For Each objItem in colItems
Wscript.Echo "Computer: " & objItem.SystemName & VbCr & _
"Manufacturer: " & objItem.Manufacturer & VbCr & _
"Model: " & objItem.Model
Next
モデルはメーカーよりも役立つ可能性があります。アプリを 1 つのメーカーと 1 つの (いくつかの) ファームウェア リビジョンのみにロックしたい場合は、FirmwareRevision を参照してください。
それが役に立てば幸い。
おそらく #usblib: