Windows系统下如何实现检测指定驱动是否已加载的PowerShell函数?
PowerShell 无系统修改的驱动加载状态检测实现
你当前使用verifier.exe的方案会临时修改系统驱动验证规则,不符合CI环境纯只读校验的要求,可直接通过WMI查询系统当前运行的内核驱动列表实现需求,全程仅做读取操作,不会修改任何系统配置。
最终实现代码
# 检查指定驱动是否已加载到内核 function Check-Driver { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$DriverName ) # 兼容带.sys后缀和不带后缀的输入 $cleanName = $DriverName.TrimEnd('.sys', [System.StringComparison]::OrdinalIgnoreCase) # 查询所有运行状态的系统驱动,忽略大小写匹配名称 $matchedDriver = Get-CimInstance -ClassName Win32_SystemDriver | Where-Object { $_.State -eq 'Running' -and ($_.Name.TrimEnd('.sys', [System.StringComparison]::OrdinalIgnoreCase) -eq $cleanName -or $_.DisplayName.TrimEnd('.sys', [System.StringComparison]::OrdinalIgnoreCase) -eq $cleanName) } return $null -ne $matchedDriver }
使用说明
调用时直接传入驱动名即可,支持带或不带.sys后缀:
# 返回True代表驱动已加载,False代表未加载 Check-Driver -DriverName "nvlddmkm" Check-Driver -DriverName "acpi.sys"
该方案无需管理员权限即可运行,完全适配CI自动化校验场景。
备选兼容方案
如果运行环境WMI服务异常,可以使用系统内置sc.exe命令实现同样的只读校验:
function Check-Driver { [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$DriverName ) $cleanName = $DriverName.TrimEnd('.sys', [System.StringComparison]::OrdinalIgnoreCase) $queryResult = sc.exe query type= driver $cleanName 2>&1 return $queryResult -match 'STATE.*\s+RUNNING' }
内容的提问来源于stack exchange,提问作者Nick Banks
相关产品推荐
相关产品推荐

