C# · 12月 31, 2021

c# – 如何识别驱动器是虚拟还是物理

这是从我关于IMAPI2的另一个问题出发的,可以确定DVD / CD驱动器是虚拟的还是物理的?解决方法 虚拟驱动器的目的是与其物理对象完全一样,只要没有物理介质即可.这两种驱动器与操作系统的工作方式与设备驱动程序相同.我非常怀疑它们之间的区别将在Win32 API中可见.这对虚拟驱动器的目的来说是直观的.

我看了WMI提供的信息(可以在C#中访问),并发现了一些有趣的东西.我的虚拟驱动器的设备ID开始于“SCSI”,而我的物理SATA驱动器的设备ID以“IDE”开头.我相信(所有的)虚拟驱动器软件大部分模拟SCSI驱动器;我不确定.通常,用户将具有IDE或SATA光驱,它们都将以“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中搜索功能将是一个高度可靠的解决方案.可能有虚拟驱动器识别自己的不同.我只测试了克隆驱动器和守护进程工具来研究你的问题.

如果您使用这种方法进行版权保护(还有什么用途?),那么您必须考虑虚假虚拟驱动器的确定机会是否值得激怒您的客户.

以下是使用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<ManagementObject>().SingleOrDefault();string deviceid = null;if (diskResult != null) deviceid = (string)diskResult[“deviceid”];