2012-05-02 24 views
2

SATA、IDE、eSATAまたはFirewireを介して、接続されたドライブがUSB接続されているかどうか確認します。 WMIを使わずにそれを見つける方法はありますか?私はいくつかの情報を得るためにこのコードを使用しています。HDDがUSB経由で接続されているかWMIなしで他の手段で接続されているかを検出

DriveInfo[] drives = DriveInfo.GetDrives(); 
foreach (DriveInfo drive in drives) { 
    // DriveType.Fixed && DriveType.Removable 

} 

は、残念ながら、これは、すべてのHDDのUSB DriveType.Fixedスルー接続のために戻って、唯一のUSBスティックはDriveType.Removableであることを取得します。

私はこのようなものを探していると思います...私が実際に探しているものはわかりません。残念ながらGetVolumeInformationは、私はWMIをスキップしたいInterfaceType

[DllImport("kernel32.dll")] 
    private static extern long GetVolumeInformation(
     string PathName, 
     StringBuilder VolumeNameBuffer, 
     UInt32 VolumeNameSize, 
     ref UInt32 VolumeSerialNumber, 
     ref UInt32 MaximumComponentLength, 
     ref UInt32 FileSystemFlags, 
     StringBuilder FileSystemNameBuffer, 
     UInt32 FileSystemNameSize); 

を知るための方法を提供していません。私は多かれ少なかれこのコードでそれを見つけることができたことを知っています:

ManagementObjectSearch theSearcher = new ManagementObjectSearcher(
    "SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'"); 

私はそれを避けることを好むでしょう。

+2

WMIについて、それを避けたいのはどうですか? –

+0

それの背後には大きな理由はありません。可能であれば、私はそれをスキップすることができるようにしたいと思います。常に私のために学ぶために新しい何か。 「道」がない場合は、WMIを使用します。 – MadBoy

+0

CodeProjectのC++には[このサンプル](http://www.codeproject.com/Articles/6559/How-To-get-the-usbdisk-s-drive-letter-properly)があります。 C#で翻訳するのはあまり簡単ではありません。 – Steve

答えて

0

なぜこのようなバリエーションが必要なのかわかりません。 WMIを使用する必要があります。残念ながら、USBベースのハードドライブは取り外し可能ですが、フラッシュメモリではなく実際のディスクを使用しています。したがって、DriveInfoは、それが修正されたと考えられる可能性が高くなります。

唯一の代替方法は、System.Managementアセンブリをインポートすることです。

各ドライブのBus Infoを取得できます。または、このツールを使用してHID Descriptionsを取得することもできます。または通常custom driversを書くのに使用される別のツール。

しかし、これはあなたのベストスイートです。ドライブが外部またはでないと単純に判断する方法が含まれているため、ではありません。 Which obviously won't address the fixed/removable but will assist in targeting the type of device

お役に立てば幸いです。

0

デバイスマネージャAPIは、各ディスクが接続されているバスとコントローラを確かめることができます。しかしそれはあまりp/invoke friendlyではありません。私はコードのこの部分をC++で書いてから、C++/CLIまたは設計向け/呼び出し用のエクスポートのいずれかを使ってC#フレンドリーなインターフェースを作成することをお勧めします。

SetupDiGetDeviceRegistryPropertyこのソリューションのコアは、SPDRP_BUSTYPEGUIDに関連付けられた値を取得します。しかし、右にHDEVINFOPSP_DEVINFO_DATAハンドルを取得するには、いくつかの作業が必要です。

関連する問題