使用 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 两条主流路径:
  1. SqlServer 模块(新版推荐):内置封装好的 SMO 加载逻辑(Import-Module SqlServer)
  2. 手动加载 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 服务配置(非引擎内部配置)
关键区分两类配置:
  1. 引擎内部配置(最大内存、并行度、认证模式、数据库参数):SMO 通过 TDS 下发 T-SQL 执行;
  2. 服务层配置(端口、启用命名管道、服务启动账号、跟踪标志):SMO 依靠 SQL WMI Provider 读写注册表,不需要引擎启动也可修改。

三、SMO 核心程序集清单(依赖文件)

必备核心 DLL(C:\Program Files\Microsoft SQL Server\<版本>\SDK\Assemblies\)

  1. Microsoft.SqlServer.Smo.dll —— 核心对象模型
  2. Microsoft.SqlServer.SmoExtended.dll —— 备份、还原、维护计划对象
  3. Microsoft.SqlServer.ConnectionInfo.dll —— 连接管理、认证
  4. Microsoft.SqlServer.SqlEnum.dll —— 枚举、枚举常量定义
  5. Microsoft.SqlServer.Management.Sdk.Sfc.dll —— SMO 底层框架(SFC)
  6. 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()

内部执行时序拆解

  1. SMO 创建 Server 对象,建立 TDS 会话;
  2. 赋值 .ConfigValue 仅修改内存中的 SMO 对象属性;
  3. 调用 .Alter() 才会生成对应的 T-SQL(sp_configure / ALTER DATABASE);
  4. 通过 SqlClient 下发 T-SQL 给 SQL 引擎;
  5. sqlservr 执行,更新 master 系统表;
  6. 部分配置需要 RECONFIGURE,SMO 内部自动追加;
重要特性:
 
SMO 只是T-SQL 代码生成器;所有变更最终都是标准 T-SQL,没有绕过数据库引擎的 “私有通道”。

模式 B:SMO WMI 管理实例服务、网络协议(引擎停止依然可用)

场景:修改 TCP 端口、启用 / 禁用 Named Pipes、修改服务启动参数
 
对应命名空间:root\Microsoft\SqlServer\ComputerManagementXX
powershell
# SMO内部封装等价操作
Get-SqlInstance -MachineName localhost
链路差异:
 
SMO → WMI Client → winmgmt.exe → sqlmgmtprovider.dll → 读写注册表
 
路径:HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\<实例ID>\MSSQLServer
 
✅ 优势:SQL 服务未启动也能改端口、协议;
 
❌ 限制:修改后必须重启 sqlservr 生效。

五、完整数据流示例:PowerShell+SMO 修改 SQL 最大内存

  1. PowerShell 加载 SMO 托管程序集;
  2. New-Object Server(服务器名) → 建立 TDS 连接(Windows 身份 / SQL 认证);
  3. $server.Configuration.MaxServerMemory.ConfigValue = 8192
     
    → 仅修改本地对象属性,不产生任何网络流量;
  4. $server.Configuration.Alter()
     
    → SMO 自动拼接脚本:
    sql
    sp_configure 'show advanced options',1;RECONFIGURE;
    sp_configure 'max server memory (MB)',8192;RECONFIGURE;
  5. SqlClient 通过 TDS 发送至 sqlservr.exe;
  6. SQL 引擎更新内部配置、写入 master 数据库;
  7. 返回执行结果,SMO 包装为托管对象传回 PowerShell。

六、依赖配套链汇总

1)运行时依赖

  1. .NET Framework /.NET(匹配 SMO 版本)
    • SQL 2016 及更早 SMO → .NET Framework
    • 新版跨平台 SqlServer PowerShell 模块 → .NET
  2. 网络载体:TCP/Shared Memory/Named Pipes(TDS 传输)
  3. 权限分层
    • 修改引擎配置:需要 SERVER ALTER SETTINGS 服务器权限;
    • WMI 修改网络 / 服务配置:Windows 管理员权限(注册表权限)。

2)持久化载体

  1. 引擎运行参数:master.sys.configurations(系统目录视图,持久化在 master.mdf)
  2. 服务、网络协议、端口:注册表 HKLM\SOFTWARE\Microsoft\Microsoft SQL Server
  3. 认证模式(混合模式 / SQL 仅):同时存在注册表标记 + master 系统元数据

七、底层关键约束与常见踩坑点

  1. 忘记调用 .Alter (),修改不生效
     
    SMO 是 “延迟更新模型”;属性赋值仅本地内存生效,Alter () 才提交。
  2. 区分 ConfigValue vs RunValue
  • ConfigValue:已保存的配置(待生效)
  • RunValue:当前正在运行的实时值
     
    部分参数需要重启 SQL 服务两者才一致。
  1. WMI 配置与引擎内部配置隔离
     
    端口、协议属于 Windows 服务层(注册表);最大内存、并行度属于引擎内部(master 库),两套独立存储,不要混淆。
  2. SMO 版本兼容性
     
    高版本 SMO 可连接低版本 SQL 实例;低版本 SMO 无法识别新版新增配置项。
  3. PowerShell 会话程序集锁定
     
    加载 SMO DLL 后进程持有文件锁;重启 pwsh 才能替换更新 SMO 程序集。
  4. 跨平台限制
     
    传统 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。

九、故障分层定位模型

  1. 无法加载 SMO DLL
     
    缺少对应版本 SQL Shared Management Objects;安装 Feature:SQL Server 管理工具 SDK。
  2. Alter () 报错权限不足
     
    确认登录账号拥有对应服务器范围权限;区分 Windows 权限与 SQL 内部权限。
  3. SMO 修改成功,但 SQL 运行参数不变
     
    参数需要重启引擎生效;区分动态配置 / 静态配置项。
  4. 能连接引擎,但无法修改 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 实例有多个端点,则需要相应地更改端口号。

posted @ 2024-05-24 01:12  suv789  阅读(127)  评论(0)    收藏  举报