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

spa*_*rky 11 c#

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

Sco*_*ott 2

虚拟驱动器的目的是与物理驱动器完全相同,只是没有物理介质。这两种驱动器与操作系统的工作方式与设备驱动程序相同。我非常怀疑它们之间的差异在 Win32 API 中是否可见。这与虚拟驱动器的目的是违反直觉的。

\n\n

我查看了 WMI 提供的信息(可以在 C# 中访问)并发现了一些有趣的信息。我的虚拟驱动器的设备 ID 以 \xe2\x80\x98SCSI\xe2\x80\x99 开头,而我的物理 SATA 驱动器的设备 ID 以 \xe2\x80\x98IDE\xe2\x80\x99 开头。我相信大多数(全部?)虚拟驱动器软件都模拟 SCSI 驱动器;我不知道。通常,用户拥有 IDE 或 SATA 光驱,其 ID 均以 \xe2\x80\x98IDE\xe2\x80\x99 开头。

\n\n
Virtual Drive Device: "SCSI\\CDROM&VEN_ELBY&PROD_CLONEDRIVE&REV_1.4\\1&00000000&0&000000"\nReal Drive Device: "IDE\\CDROMASUS_DRW-24B1ST_________________________1.03____\\5&295AF142&0&5.0.0"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

不管怎样,我不相信在设备 ID 中搜索功能是一个高度可靠的解决方案。可能存在以不同方式标识自身的虚拟驱动器。我在研究你的问题时只测试了克隆驱动器和守护进程工具。

\n\n

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

\n\n

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

\n\n
string driveLetter = "F";\nManagementObjectSearcher diskQuery = new ManagementObjectSearcher(String.Format("SELECT * FROM Win32_CDROMDrive WHERE Drive=\'{0}:\'", driveLetter));\nManagementObject diskResult = diskQuery.Get().OfType<ManagementObject>().SingleOrDefault();\nstring deviceID = null;\nif (diskResult != null)\n    deviceID = (string)diskResult["DeviceID"];\n
Run Code Online (Sandbox Code Playgroud)\n