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

标签 c#

这是从我关于 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 中,虚拟驱动器明确标识为克隆驱动器软件。您可以根据已知的虚拟驱动器软件列表检查制造商和产品名称。这可能会产生大量假阴性并且很难维护。

无论哪种方式,我都不确定在设备 ID 中搜索功能是否是一个高度可靠的解决方案。可能存在以不同方式标识自身的虚拟驱动器。在研究您的问题时,我只测试了 Clone Drive 和 Daemon Tools。

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

这是使用 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"];

关于c# - 如何识别驱动器是虚拟驱动器还是物理驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8525636/

相关文章:

c# - Google Sheets - 如何通过行索引获取多行数据

c# - Visual Studio 2012 与 Visual Studio 2010 的比较(增量)

c# - 如何通过 ViewModel 更改 View 中的某些内容

c# - 有没有办法把word文档升级到2010

c# - 使用线程异步执行 C# 方法

c# - 无法将具有 JSON 内容的字符串反序列化为 C# 对象

javascript - 父节点值是其所有子节点的总和

c# - 检查重叠日期

c# - 使用 C#/.NET 的电子邮件发送策略

c# - 动态创建的按钮单击事件在 asp.net c# 中不起作用