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

时间:2011-12-15 19:38:33

标签: c#

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

3 个答案:

答案 0 :(得分:2)

虚拟驱动器的目的是完全像物理对象一样,只是没有物理介质。两种驱动器都以与设备驱动程序相同的方式与操作系统一起使用。我非常怀疑它们之间的区别在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中,虚拟驱动器被明确标识为克隆驱动器软件。您可以根据已知的虚拟驱动器软件列表检查制造商和产品名称。这可能会产生很多漏报,并且很难维护。

无论哪种方式,我都不相信在设备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"];

答案 1 :(得分:0)

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

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

答案 2 :(得分:-4)

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