使用PowerShell配置SQL Server 2016/2019的1433端口GetSmoObject报错如何解决
报错原因
$dbmsName取值类型错误:Invoke-Sqlcmd -Query "SELECT @@servicename"返回的是DataRow对象,而非字符串类型的实例名,直接拼接进URI会导致路径匹配失败- 运行权限不足:修改SQL Server WMI配置必须以管理员身份启动PowerShell会话,否则无权限读取WMI对象
- URI格式错误:原脚本中URI定义存在换行,会额外插入空格导致WMI对象路径无效
- 依赖组件缺失:系统未安装SQL Server WMI提供程序(属于SQL Server管理工具配套组件,未安装时无法初始化ManagedComputer对象)
修复后的完整脚本
$pcName = $env:COMPUTERNAME # 显式提取实例名字符串 $dbmsName = (Invoke-Sqlcmd -Query "SELECT @@servicename").Column1 # 加载SQLPS模块 Import-Module SQLPS -DisableNameChecking -Force # 初始化WMI对象 $Wmi = New-Object ('Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer') $pcName # 无换行拼接正确URI $uri = "ManagedComputer[@Name='$pcName']/ServerInstance[@Name='$dbmsName']/ServerProtocol[@Name='Tcp']" # 获取TCP配置对象 $Tcp = $wmi.GetSmoObject($uri) $Tcp.IsEnabled = $true # 配置IPAll端口为1433 $wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value="1433" # 保存配置 $Tcp.Alter() # 重启SQL服务 Restart-Service -Name MSSQL* -Force Start-Sleep -s 30
可选排查步骤
如果修复后仍报错,可先执行以下命令验证基础配置:
- 列出当前服务器所有可识别的SQL实例:
$Wmi.ServerInstances | Select-Object Name,确认返回的实例名和$dbmsName取值一致 - 确认系统WMI服务正常运行:
Get-Service -Name winmgmt | Select-Object Status
内容的提问来源于stack exchange,提问作者Houssein Kemel
相关产品推荐
相关产品推荐

