使用 PowerShell 和 SMO (SQL Server Management Objects) 修改 SQL Server 实例的默认端口号 1433。以下是一个基本的 PowerShell 脚本,它可以用来修改 SQL Server 实例的默认端口号:
PowerShell + SMO 修改 SQL Server 实例 完整解构文档
一、基础定位
SMO(SQL Server Management Objects)
一套面向 .NET 的托管程序集,是 SSMS、PowerShell SQL 管理的核心对象模型;
本质:封装 T-SQL、SQL Native Client / ODBC、SQL Server WMI,向上提供面向对象编程接口。
PowerShell 使用 SMO 两条主流路径:
- SqlServer 模块(新版推荐):内置封装好的 SMO 加载逻辑(
Import-Module SqlServer) - 手动加载 SMO dll:
[Reflection.Assembly]::LoadFrom()直接载入程序集(兼容旧环境)
核心链路概括:PowerShell(托管运行时)→ SMO 托管程序集 → SQL Client 访问层 → TDS 协议 → SQL Server 实例引擎 (sqlservr.exe)SMO 不直接操作数据库文件,全部通过标准 SQL 协议与数据库引擎通信。
二、完整调用栈树形结构
plaintext
PowerShell (pwsh.exe/powershell.exe)
↓ 加载 SqlServer Module / 手动Load SMO程序集
Microsoft.SqlServer.Smo.dll(核心对象模型)
├─ SMO 高层对象(Server/Database/Login/Table/Configuration)
│ ↓ Microsoft.SqlServer.ConnectionInfo(连接上下文)
│ ↓ Microsoft.Data.SqlClient(旧版:System.Data.SqlClient)
│ ↓ TDS 协议实现(Tabular Data Stream)
│ ↓ TCP/Named Pipes/Shared Memory 传输层
│ ↓
sqlservr.exe (SQL Server Database Engine)
│ ├─ 解析收到的命令,转换为内部执行计划
│ ├─ 修改内存元数据、系统目录(master/model等)
│ └─ 持久化修改到 mdf/ldf(数据文件、事务日志)
│
└─分支:SMO WMI Provider(针对服务、网络协议、端口、启动参数)
↓ SqlWmiProvider → winmgmt.exe → 注册表
↔ SQL Server 服务配置(非引擎内部配置)
关键区分两类配置:
- 引擎内部配置(最大内存、并行度、认证模式、数据库参数):SMO 通过 TDS 下发 T-SQL 执行;
- 服务层配置(端口、启用命名管道、服务启动账号、跟踪标志):SMO 依靠 SQL WMI Provider 读写注册表,不需要引擎启动也可修改。
三、SMO 核心程序集清单(依赖文件)
必备核心 DLL(C:\Program Files\Microsoft SQL Server\<版本>\SDK\Assemblies\)
Microsoft.SqlServer.Smo.dll—— 核心对象模型Microsoft.SqlServer.SmoExtended.dll—— 备份、还原、维护计划对象Microsoft.SqlServer.ConnectionInfo.dll—— 连接管理、认证Microsoft.SqlServer.SqlEnum.dll—— 枚举、枚举常量定义Microsoft.SqlServer.Management.Sdk.Sfc.dll—— SMO 底层框架(SFC)Microsoft.Data.SqlClient.dll—— .NET SQL 客户端驱动(TDS 通信载体)
配套辅助组件:
SqlWmiProvider.mof/sqlmgmtprovider.dll:SQL WMI 提供程序(服务 / 网络配置)sqlservr.exe:SQL 数据库引擎sqlbrowser.exe:实例解析(多实例环境)
四、两大工作模式深度拆解
模式 A:SMO 对象操作数据库引擎配置(在线配置,依赖 sqlservr 运行)
典型场景:修改最大服务器内存、调整 cost threshold for parallelism、创建登录名、修改数据库恢复模式
PowerShell 示例片段
powershell
[System.Reflection.Assembly]::LoadFrom("C:\...\Microsoft.SqlServer.Smo.dll")
$server = New-Object Microsoft.SqlServer.Management.Smo.Server("localhost")
$server.Configuration.MaxServerMemory.ConfigValue = 8192
$server.Configuration.Alter()
内部执行时序拆解
- SMO 创建
Server对象,建立 TDS 会话; - 赋值
.ConfigValue仅修改内存中的 SMO 对象属性; - 调用
.Alter()才会生成对应的 T-SQL(sp_configure/ALTER DATABASE); - 通过 SqlClient 下发 T-SQL 给 SQL 引擎;
- sqlservr 执行,更新 master 系统表;
- 部分配置需要
RECONFIGURE,SMO 内部自动追加;
重要特性:SMO 只是T-SQL 代码生成器;所有变更最终都是标准 T-SQL,没有绕过数据库引擎的 “私有通道”。
模式 B:SMO WMI 管理实例服务、网络协议(引擎停止依然可用)
场景:修改 TCP 端口、启用 / 禁用 Named Pipes、修改服务启动参数
对应命名空间:
root\Microsoft\SqlServer\ComputerManagementXXpowershell
# SMO内部封装等价操作
Get-SqlInstance -MachineName localhost
链路差异:
SMO → WMI Client → winmgmt.exe → sqlmgmtprovider.dll → 读写注册表
路径:
✅ 优势:SQL 服务未启动也能改端口、协议;
❌ 限制:修改后必须重启 sqlservr 生效。
HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\<实例ID>\MSSQLServer
五、完整数据流示例:PowerShell+SMO 修改 SQL 最大内存
- PowerShell 加载 SMO 托管程序集;
New-Object Server(服务器名)→ 建立 TDS 连接(Windows 身份 / SQL 认证);$server.Configuration.MaxServerMemory.ConfigValue = 8192→ 仅修改本地对象属性,不产生任何网络流量;$server.Configuration.Alter()→ SMO 自动拼接脚本:sqlsp_configure 'show advanced options',1;RECONFIGURE; sp_configure 'max server memory (MB)',8192;RECONFIGURE;- SqlClient 通过 TDS 发送至 sqlservr.exe;
- SQL 引擎更新内部配置、写入 master 数据库;
- 返回执行结果,SMO 包装为托管对象传回 PowerShell。
六、依赖配套链汇总
1)运行时依赖
- .NET Framework /.NET(匹配 SMO 版本)
- SQL 2016 及更早 SMO → .NET Framework
- 新版跨平台 SqlServer PowerShell 模块 → .NET
- 网络载体:TCP/Shared Memory/Named Pipes(TDS 传输)
- 权限分层
- 修改引擎配置:需要 SERVER ALTER SETTINGS 服务器权限;
- WMI 修改网络 / 服务配置:Windows 管理员权限(注册表权限)。
2)持久化载体
- 引擎运行参数:
master.sys.configurations(系统目录视图,持久化在 master.mdf) - 服务、网络协议、端口:注册表
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server - 认证模式(混合模式 / SQL 仅):同时存在注册表标记 + master 系统元数据
七、底层关键约束与常见踩坑点
-
忘记调用 .Alter (),修改不生效SMO 是 “延迟更新模型”;属性赋值仅本地内存生效,Alter () 才提交。
-
区分 ConfigValue vs RunValue
- ConfigValue:已保存的配置(待生效)
- RunValue:当前正在运行的实时值
部分参数需要重启 SQL 服务两者才一致。
-
WMI 配置与引擎内部配置隔离端口、协议属于 Windows 服务层(注册表);最大内存、并行度属于引擎内部(master 库),两套独立存储,不要混淆。
-
SMO 版本兼容性高版本 SMO 可连接低版本 SQL 实例;低版本 SMO 无法识别新版新增配置项。
-
PowerShell 会话程序集锁定加载 SMO DLL 后进程持有文件锁;重启 pwsh 才能替换更新 SMO 程序集。
-
跨平台限制传统 SMO 程序集仅 Windows;跨平台 PowerShell 使用
SqlServer模块依靠兼容层,部分 WMI 功能不可用(Linux SQL 无 WMI)。
八、SMO vs 直接 Invoke-SqlCmd 本质区别
| 方式 | 实现原理 | 优势 | 短板 |
|---|---|---|---|
| SMO 对象模型 | 对象封装,自动生成 T-SQL | 面向对象,无需手写复杂脚本;内置校验、依赖检测 | 依赖 SMO 程序集,版本需要匹配 |
| Invoke-SqlCmd | 直接发送原始 T-SQL | 无额外托管依赖,轻量化 | 需要自行拼接 SQL,容易注入、缺少对象校验 |
通俗总结:SMO = “带语法检查、对象模型的 SQL 脚本生成工具”;最终输出仍然是 TDS+T-SQL。
九、故障分层定位模型
- 无法加载 SMO DLL
缺少对应版本 SQL Shared Management Objects;安装 Feature:SQL Server 管理工具 SDK。
- Alter () 报错权限不足
确认登录账号拥有对应服务器范围权限;区分 Windows 权限与 SQL 内部权限。
- SMO 修改成功,但 SQL 运行参数不变
参数需要重启引擎生效;区分动态配置 / 静态配置项。
- 能连接引擎,但无法修改 TCP 端口
修改端口属于 WMI 注册表操作,需要 Windows 管理员,而非仅 SQL SA 权限。
使用 PowerShell 和 SMO (SQL Server Management Objects) 修改 SQL Server 实例的默认端口号 1433。以下是一个基本的 PowerShell 脚本,它可以用来修改 SQL Server 实例的默认端口号:
powershellCopy Code
# 导入 SQL Server 模块
Import-Module SQLPS -DisableNameChecking
# 设置 SQL Server 实例名称和新端口号
$serverInstance = "YourSQLServerInstance"
$newPortNumber = 1500
# 创建 Server 对象
$server = New-Object Microsoft.SqlServer.Management.Smo.Server($serverInstance)
# 修改端口号
$server.Configuration.Mirror.Endpoints.TCP.ListenerPort = $newPortNumber
$server.Configuration.Alter()
Write-Output "SQL Server port has been changed to $newPortNumber."
在这个脚本中,你需要将 "YourSQLServerInstance" 替换为你的 SQL Server 实例的名称,并将 $newPortNumber 变量设置为你想要的新端口号。运行脚本后,SQL Server 实例的默认端口号将被修改为新端口号。请注意,如果你的 SQL Server 实例有多个端点,则需要相应地更改端口号。

浙公网安备 33010602011771号