检测硬盘是通过 USB 还是通过其他没有 WMI 的方式连接的

Posted

技术标签:

【中文标题】检测硬盘是通过 USB 还是通过其他没有 WMI 的方式连接的【英文标题】:Detecting if HDD is connected thru USB or by other means without WMI 【发布时间】:2012-05-02 21:04:45 【问题描述】:

我想知道连接的驱动器是否通过 SATA、IDE、eSATA 或 Firewire 连接到 USB。有没有办法在不使用 WMI 的情况下找到它?我正在使用此代码来获取一些信息。

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

 

不幸的是,所有通过 USB DriveType.Fixed 连接的 HDD 都会返回,并且只有 USB 记忆棒才能成为 DriveType.Removable

我想我正在寻找这样的东西......只是我不知道我真正在寻找什么。不幸的是,GetVolumeInformation 没有提供了解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);

我想跳过 WMI。我知道我可以通过或多或少的代码找到它:

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

但我宁愿避免它。

【问题讨论】:

WMI 是什么让你想避免它? 没有big 背后的原因。如果可能的话,我希望能够跳过它。总是有新东西要为我学习。如果没有way,那我就用WMI。 CodeProject 上的 C++ 中有 this sample。用 C# 翻译不是很容易。 【参考方案1】:

我不知道为什么你需要这么具体的变化;但你必须使用 WMI。不幸的是,尽管基于 USB 的硬盘驱动器是可移动的,但它仍然使用实际磁盘而不是闪存。所以DriveInfo 更有可能认为它已修复。

唯一的选择是导入System.Management 程序集。

您可以检索每个驱动器的总线信息。或者可能使用此工具检索HID Descriptions。或者其他通常用来写custom drivers的工具。

但这可能是您最好的套房;因为它包括一种简单地确定驱动器是外部还是的方法。 Which obviously won't address the fixed / removable but will assist in targeting the type of device.

希望对你有所帮助。

【讨论】:

【参考方案2】:

设备管理器 API 肯定能够告诉您每个磁盘连接到哪个总线和控制器。但它对 p/invoke 不是很友好。我建议用 C++ 编写这部分代码,然后使用 C++/CLI 或为 p/invoke 导出而设计的 C# 友好界面。

此解决方案的核心将调用SetupDiGetDeviceRegistryProperty 以获取与SPDRP_BUSTYPEGUID 关联的值。但是要获得正确的 HDEVINFOPSP_DEVINFO_DATA 句柄将需要一些工作。

【讨论】:

以上是关于检测硬盘是通过 USB 还是通过其他没有 WMI 的方式连接的的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 C# WMI / WMI Code Creator 检测 RealSense 摄像头

surface pro 5 通过USB扩展器连接4T硬盘后,无线网自动断联?

移动硬盘问题 非ATA设备不支持SMART测试

VC能否获取所有硬件信息,现只获得CPU的信息,其他的都不行

vc++如何获取usb接口个数?

移动硬盘无法读取,是啥原因?