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"];

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...