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 } }
修复要点
- 直接关联端口与测试:遍历预设的端口列表,每个端口单独测试,记录原端口号,彻底避免
RemotePort字段异常的问题。 - 完善错误处理:添加
-ErrorAction SilentlyContinue防止测试命令抛出异常中断流程,同时处理测试命令执行失败的场景(比如无法连接到主机)。 - 优化结果拼接:用
-join简化端口列表拼接,解决原代码末尾多余逗号的问题。
调用代码无需调整
原调用逻辑可以直接使用修复后的函数,它会准确返回关闭的端口列表,或空字符串(所有端口正常开放)。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

