检测硬盘是通过 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
关联的值。但是要获得正确的 HDEVINFO
和 PSP_DEVINFO_DATA
句柄将需要一些工作。
【讨论】:
以上是关于检测硬盘是通过 USB 还是通过其他没有 WMI 的方式连接的的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 C# WMI / WMI Code Creator 检测 RealSense 摄像头
surface pro 5 通过USB扩展器连接4T硬盘后,无线网自动断联?