如何用PowerShell通过WMI枚举注册表项?FirewallRules代码故障排查
防火墙注册表值枚举代码问题排查与修复
问题根源
- 过时的WMI调用:
Get-WmiObject已被PowerShell官方弃用,兼容性较差,换成Get-CimInstance更稳定可靠。 - 权限缺失:访问
FirewallRules注册表路径必须拥有管理员权限,非管理员身份运行会直接调用失败。 - 无结果输出与错误处理:原代码仅执行了枚举方法,但未输出结果,也未捕获调用失败的情况。
修复后的代码
$HKEY_LOCAL_MACHINE = 2147483650 $KeyPath = "SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" $names = $null $valueTypes = $null try { # 用Get-CimInstance替代过时的Get-WmiObject $reg = Get-CimInstance -Namespace root\default -ClassName StdRegProv -ErrorAction Stop $result = $reg.EnumValues($HKEY_LOCAL_MACHINE, $KeyPath, [ref]$names, [ref]$valueTypes) # 0表示调用成功,输出枚举到的名称 if ($result.ReturnValue -eq 0) { "枚举到的注册表值名称:" $names | ForEach-Object { " - $_" } } else { "调用失败,返回值:$($result.ReturnValue)" } } catch { "获取CIM实例失败:$($_.Exception.Message)" }
更简洁的替代方案
直接使用PowerShell内置的注册表cmdlet,代码更易读,同样需要管理员权限:
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" | Select-Object -ExpandProperty PSObject | Select-Object -ExpandProperty Properties | Where-Object { $_.Name -notmatch '^PS' } | Select-Object -ExpandProperty Name
注意:所有代码必须以管理员身份运行PowerShell才能正常执行。
内容的提问来源于stack exchange,提问作者KingVoodoo
相关产品推荐
相关产品推荐

