检测硬盘是否通过 USB 或其他方式在没有 WMI 的情况下连接

本文关键字:WMI 连接 情况下 方式 其他 是否 硬盘 USB 检测 | 更新日期: 2023-09-27 18:32:54

我想了解连接的驱动器是否通过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'");

但我宁愿避免它。

检测硬盘是否通过 USB 或其他方式在没有 WMI 的情况下连接

我不确定为什么你这么需要这个变体;但你必须使用 WMI。 不幸的是,尽管基于USB的硬盘驱动器是可移动的,但它仍然使用实际的磁盘而不是闪存。因此,DriveInfo更有可能认为它是固定的。

唯一的选择是导入System.Management大会。

您可以检索每个驱动器的总线信息。 或者可能使用此工具检索HID Descriptions。或通常用于编写自定义驱动程序的其他工具。

但这可能是您最好的套件;因为它包括一种简单地确定驱动器是否被视为外部驱动器的方法。 这显然不会解决固定/可移动的问题,但将有助于针对设备类型。

希望对您有所帮助。

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

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