如何识别驱动器是虚拟的还是物理的

这来自我关于IMAPI2的另一个问题是否可以识别DVD / CD驱动器是虚拟的而不是物理的?

虚拟驱动器的目的是完全像物理对应物一样,只是没有物理介质。 两种驱动器都以与设备驱动程序相同的方式与操作系统一起使用。 我非常怀疑它们之间的区别是否会在Win32 API中可见。 这对于虚拟驱动器的目的来说是违反直觉的。

我查看了WMI提供的信息(可以通过C#访问)并找到了一些有趣的内容。 我的虚拟驱动器的设备ID以’SCSI’开头,而我的物理SATA驱动器的设备ID以’IDE’开头。 我相信大多数(全部?)虚拟驱动器软件模拟SCSI驱动器; 我不确定。 通常,用户可能具有IDE或SATA光驱,其ID都以“IDE”开头。

Virtual Drive Device: "SCSI\CDROM&VEN_ELBY&PROD_CLONEDRIVE&REV_1.4\1&00000000&0&000000" Real Drive Device: "IDE\CDROMASUS_DRW-24B1ST_________________________1.03____\5&295AF142&0&5.0.0" 

请注意,在我的示例设备ID中,虚拟驱动器被明确标识为Clone Drive软件。 您可以根据已知的虚拟驱动器软件列表检查制造商和产品名称。 这可能会产生很多漏报并且很难维护。

无论哪种方式,我都不相信在设备ID中搜索function将是一个非常可靠的解决方案。 可能存在以不同方式识别自身的虚拟驱动器。 我只测试了克隆驱动器和守护进程工具来研究你的问题。

如果你使用这种方法进行版权保护(你还会用它做什么?)那么你必须考虑虚假驱动器确定的可能性是否值得激怒你的客户。

以下是使用WMI检查驱动器并访问设备ID的C#代码。 您需要引用System.Management程序集。

 string driveLetter = "F"; ManagementObjectSearcher diskQuery = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_CDROMDrive WHERE Drive='{0}:'", driveLetter)); ManagementObject diskResult = diskQuery.Get().OfType().SingleOrDefault(); string deviceID = null; if (diskResult != null) deviceID = (string)diskResult["DeviceID"]; 

查看“DriveInfo”…查看它的DriveType属性。

System.IO.DriveInfo di = new System.IO.DriveInfo(“X:\”);

一种方法是导航到您的计算机目录,c:/ drive和可移动硬盘。 使用物理硬盘驱动器,如果右键单击并弹出介质,cd / dvd托盘将滑出; 但是,虚拟驱动器只会清除存储在驱动器上的数据,但不会将笔记本电脑/计算机上的托盘滑出。