You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PowerShell通过WMI枚举注册表项?FirewallRules代码故障排查

防火墙注册表值枚举代码问题排查与修复

问题根源

  1. 过时的WMI调用:Get-WmiObject已被PowerShell官方弃用,兼容性较差,换成Get-CimInstance更稳定可靠。
  2. 权限缺失:访问FirewallRules注册表路径必须拥有管理员权限,非管理员身份运行会直接调用失败。
  3. 无结果输出与错误处理:原代码仅执行了枚举方法,但未输出结果,也未捕获调用失败的情况。

修复后的代码

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:03:19