检测硬盘是否通过 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'");
但我宁愿避免它。
我不确定为什么你这么需要这个变体;但你必须使用 WMI。 不幸的是,尽管基于USB的硬盘驱动器是可移动的,但它仍然使用实际的磁盘而不是闪存。因此,DriveInfo
更有可能认为它是固定的。
唯一的选择是导入System.Management
大会。
您可以检索每个驱动器的总线信息。 或者可能使用此工具检索HID Descriptions
。或通常用于编写自定义驱动程序的其他工具。
但这可能是您最好的套件;因为它包括一种简单地确定驱动器是否被视为外部驱动器的方法。 这显然不会解决固定/可移动的问题,但将有助于针对设备类型。
希望对您有所帮助。
设备管理器 API 当然能够告诉您每个磁盘连接到哪个总线和控制器。 但它不是很友好 p/调用。 我建议用C++编写这部分代码,然后使用 C++/CLI 或为 p/invoke 导出设计一个 C# 友好的界面。
此解决方案的核心是调用 SetupDiGetDeviceRegistryProperty
以获取与 SPDRP_BUSTYPEGUID
关联的值。 但是获得正确的HDEVINFO
和PSP_DEVINFO_DATA
句柄需要一些工作。