如何在未插入设备时确定设备驱动程序的版本?

时间:2015-01-22 00:05:01

标签: c# wmi wmi-query

感谢其他一些有用的StackOverflow问题,我找到了一种查询WMI设备驱动程序的方法。但是,在我看来,数据存储在不能很好地连接在一起的不同地方。

我有一个使用FTDI驱动程序的USB转串口电缆。我可以查询Win32_SystemDrivers以确定是否已安装驱动程序,如下所示:

SelectQuery query = new SelectQuery("Win32_SystemDriver");
query.Condition = "Name = 'FTDIBUS'";

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection drivers = searcher.Get();
bool installed = (drivers.Count > 0);

但是那个集合并没有告诉我关于版本信息的事情。所以我发现我可以查询Win32_PnPSignedDriver来查找设备驱动程序的版本。所以我正在做这样的事情:

SelectQuery query = new SelectQuery("Win32_PnPSignedDriver");
query.Condition = "DriverProviderName = 'FTDI'";

ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection drivers = searcher.Get();

foreach (ManagementBaseObject driverObject in drivers)
{
    ManagementObject driver = (ManagementObject)driverObject;
    string version = driver["DriverVersion"].ToString();
}

然而,第二个代码块只有在实际插入电缆(设备)时才会成功。我想做的是检查已安装的设备驱动程序的版本,无论设备是否是目前插入。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

似乎Win32_SystemDriver class可以为您提供相关驱动程序.sys文件的PathName。

示例:“\ SystemRoot \ System32 \ drivers \ afd.sys”

然后您可以使用以下命令获取.sys文件版本:

String path = @"C:\Windows\System32\drivers\afd.sys"
var myFileVersionInfo = FileVersionInfo.GetVersionInfo(path);
var version = myFileVersionInfo.ProductVersion;

答案 1 :(得分:3)

请记住,您要求解决鸡蛋问题,从来没有一个非常健康的开始任何计划。即插即用在Windows中播放的基础是设备驱动程序可以在设备可用时动态定位,必要时下载。那是一只鸡。

如果驱动程序已预先安装或以前使用过,您只能希望找到鸡蛋。并非完全不常见。在这种情况下,它将在驱动程序商店中提供。当你枚举它时,你应该能够找到它。

执行此操作的示例程序是available here。用C#编写,这是你想要的好开始。我将复制截图:

enter image description here

注意显示的驱动程序日期和版本,您要问的内容。请记住,可能存在多个版本。您可能想要查看源代码,它非常简单。它实际上依赖于Windows实用程序来填充ListView,PnPUtil.exe使用/ e选项枚举存储。通过从命令行运行它来尝试。

您还可以使用资源管理器轻松查看商店内容,这些文件存储在c:\ windows \ system32 \ driverstore \ filerepository中。读取.inf文件以添加其他过滤可能很有用。您在屏幕截图的第1列中列出的.inf文件名实际上是复制到c:\ windows \ inf目录中的文件名。