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

CheckPorts函数调用Test-NetConnection返回错误0端口值问题求助

SQL Server预安装端口检测函数误报问题修复

问题现象

用于SQL Server安装前检测端口开放状态的CheckPorts函数,在多数服务器上运行正常,但两台服务器出现误报:实际端口均处于开放状态,函数却返回Port(s): 0, 0, 0, 0, 0, : are closed.的错误信息,对应错误哈希表如下:

{
    "definition": "SQL Server Installation: SQL01-SQL-S007, some ports needed for the installation are closed.",
    "errors": "Port(s): 0, 0, 0, 0, 0, : are closed.",            
    "result": "Error"
}

问题原因

核心问题出在Test-NetConnection的返回值可靠性上:当远程主机存在网络链路异常(比如WinRM通信受阻、DNS解析异常)时,该命令返回的对象中RemotePort字段会被设为0,而非实际测试的端口号。原函数依赖这个字段记录关闭的端口,自然会出现全0的误报。

另外原函数的if($ports = ...)赋值逻辑存在隐患,只要Test-NetConnection返回非空集合(哪怕是RemotePort为0的对象),就会判定有端口关闭。

修复后的函数

修改函数逻辑,直接绑定预设端口与测试结果,不再依赖不可靠的RemotePort字段:

Function CheckPorts
{
    param(
        [string]$computerName
    )
    $closedPorts = @()
    $portList = 3389, 445, 5985, 5986, 135
    
    foreach($port in $portList)
    {
        $testResult = Test-NetConnection -ComputerName $computerName -Port $port -ErrorAction SilentlyContinue
        # 明确测试失败,或测试命令执行失败(视为端口不可达)
        if(($testResult -and $testResult.TcpTestSucceeded -eq $false) -or (-not $testResult))
        {
            $closedPorts += $port
            if(-not $testResult)
            {
                Write-Warning "无法检测主机 $computerName 的端口 $port,标记为不可达"
            }
        }
    }

    return if($closedPorts) { "Port(s): $($closedPorts -join ', ') : are closed." } else { [string]::Empty }
}

修复要点

  1. 直接关联端口与测试:遍历预设的端口列表,每个端口单独测试,记录原端口号,彻底避免RemotePort字段异常的问题。
  2. 完善错误处理:添加-ErrorAction SilentlyContinue防止测试命令抛出异常中断流程,同时处理测试命令执行失败的场景(比如无法连接到主机)。
  3. 优化结果拼接:用-join简化端口列表拼接,解决原代码末尾多余逗号的问题。

调用代码无需调整

原调用逻辑可以直接使用修复后的函数,它会准确返回关闭的端口列表,或空字符串(所有端口正常开放)。

内容的提问来源于stack exchange,提问作者Purclot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:00:29