SQL Server 静默安装 Skill(金蝶云星空 / ERP 专用)
在 Windows 沙箱或自动化环境里,把 SQL Server 装好并配成 ERP 可用实例的可复用流程。
核心价值:绕过微软下载落地页、避开 2022 静默安装的 4 类配置坑、用 PowerShell 启动并阻塞等待防止安装"被取消"。
0. 适用场景与前置判定
- 用户要"安装 SQL Server / 装数据库",且最终用途是金蝶云星空等国产 ERP。
- 环境特征(本流程针对这些限制设计):
- Bash(git bash)不能直接执行
setup.exe(报 Permission denied),必须用 PowerShell 的Start-Process启动。 - 沙箱会掐断大文件下载(约 64KB 即断)→ 下载 ISO 必须
dangerouslyDisableSandbox: true+ 断点续传-C -。 - 系统级工具(
reg.exe/sc/wmic)常被禁 → 改用文件目录检查 + PowerShell 验证。 - 写 HKLM 注册表可能被拒绝(权限)→ 安装时用
TCPENABLED=1让 TCP/IP 在安装阶段生效,之后只读不写。
> 安装创建 Windows 服务/写注册表,最终执行那一步需管理员权限(用户已授权时在 PowerShell 关沙箱执行)。
硬件与前置要求(评测建议补充)
- 操作系统:Windows 10/11 或 Windows Server 2016+(64 位)。
- 内存:建议 ≥ 4 GB(金蝶云星空 + SQL 同机开发测试可跑;生产建议 8 GB+)。
- 磁盘:系统盘需 ≥ 6 GB 临时空间(ISO 解压 + 安装日志);数据目录(默认
D:\SqlData)建议预留 ≥ 20 GB,账套增长后更多。 - 权限:必须以 管理员 运行 PowerShell(挂载 ISO / 建 Windows 服务 / 写注册表都需要)。
- 网络:首次需联网下载官方 ISO(约 1.16 GB,国内直连 download.microsoft.com 直链)。
- .NET:SQL Server 2022 安装程序会自动处理运行库依赖,无需手动预装。
0.5 一键运行脚本(开箱即用,推荐)
本 skill 附带 scripts/Install-SqlServerSilent.ps1,把下面第 1~5 节全流程封装为单个可直接运行的脚本,普通用户无需逐条敲命令:
# 最简:ISO 自动下载 + 默认配置(sa=Sql@2022Dev, 排序规则 Chinese_PRC_CI_AS)
powershell -ExecutionPolicy Bypass -File scripts/Install-SqlServerSilent.ps1
# 指定密码/数据目录,复用已下载的 ISO:
powershell -ExecutionPolicy Bypass -File scripts/Install-SqlServerSilent.ps1 `
-SaPassword "MyStrong@Pwd2026" -DataDir "E:\SqlData" `
-IsoLocalPath "D:\SQLServer2022\SQLServer2022-Dev.iso"
脚本内部已包含:管理员检测 → 断点续传下载 → 挂载 → 生成 ConfigurationFile.ini → 阻塞安装 → 只读验证,并在失败时给出定位日志的具体指引(对应评测"异常处理提示不友好"的改进)。
> 手动逐节操作见下文 1~5 节;脚本与下文逻辑完全一致,二选一即可。
1. 下载官方 ISO(绕过落地页)
微软原 go.microsoft.com/fwlink/?linkid=2216017 已变为填表落地页,curl 只能拿到网页,必须换官方直链:
SQL Server 2022 Developer (x64, ~1.16GB):
https://download.microsoft.com/download/3/8/d/38de7036-2433-4207-8eae-06e247e17b25/SQLServer2022-x64-ENU-Dev.iso
步骤:
1. 先 HEAD 校验直链有效性(HTTP 200 + Content-Length ≈ 1.16e9):
bash
curl -sS -I --max-time 30 "<直链>" | head -20
2. 关沙箱 + 断点续传下载(前台若超时,转 run_in_background: true 续传):
bash
mkdir -p /d/SQLServer2022
curl -L --retry 5 --retry-delay 3 -C - -o /d/SQLServer2022/SQLServer2022-Dev.iso \
"<直链>" -w "\n完成: HTTP=%{http_code} 大小=%{size_download}\n"
3. 验证完整性:下载后再次 -C - 续传,若返回 HTTP 416 即已完整;或挂载后确认 setup.exe 存在。
2. 挂载 ISO(PowerShell)
$iso = "D:\SQLServer2022\SQLServer2022-Dev.iso"
try { Dismount-DiskImage -ImagePath $iso -ErrorAction SilentlyContinue } catch {}
$d = Mount-DiskImage -ImagePath $iso -PassThru | Get-Volume
$dl = $d.DriveLetter
"$dl" | Out-File -FilePath "D:\SQLServer2022\iso_drive.txt" -Encoding ascii
Write-Output "挂载盘符=$dl`: setup.exe 存在=$(Test-Path "$($dl):\setup.exe")"
> 记下 $dl(如 H:),后续 setup.exe 路径为 $dl:\setup.exe。
3. 编写 ConfigurationFile.ini(金蝶/ERP 关键配置)
把以下模板写到 D:\SQLServer2022\ConfigurationFile.ini。所有开关参数必须写 True/False,不能写 Y(这是 2022 最常见的坑)。
; SQL Server 2022 Developer - 金蝶云星空/ERP 适用静默配置
[OPTIONS]
ACTION=Install
ROLE=AllFeatures_WithDefaults
; 接受许可:必须 True(不能 Y)
IACCEPTSQLSERVERLICENSETERMS=True
; 静默安装(无 UI)
QUIET=True
QUIETSIMPLE=False
; 功能:数据库引擎(必选);可加 Replication, FullText
FEATURES=SQLENGINE
; 默认实例(金蝶连接时不写实例名)
INSTANCEID=MSSQLSERVER
INSTANCENAME=MSSQLSERVER
; 排序规则 —— 金蝶最关键!装错建账套失败/乱码,事后改代价极大
SQLCOLLATION=Chinese_PRC_CI_AS
; 混合身份验证(金蝶用 sa 或专用 SQL 账号连库)
SECURITYMODE=SQL
SAPWD="Sql@2022Dev"
; 服务账户:虚拟账户,无需密码(留空行/不留 SQLSVCPASSWORD 行)
SQLSVCACCOUNT="NT Service\MSSQLSERVER"
SQLSVCSTARTUPTYPE=Automatic
AGTSVCACCOUNT="NT Service\SQLSERVERAGENT"
AGTSVCSTARTUPTYPE=Automatic
; 安装阶段即启用 TCP/IP(避免事后改注册表被拒)
TCPENABLED=1
; 数据目录放非系统盘
INSTALLSQLDATADIR="D:\SqlData"
SQLUSERDBDIR="D:\SqlData\Data"
SQLUSERDBLOGDIR="D:\SqlData\Log"
SQLTEMPDBDIR="D:\SqlData\TempDB"
SQLTEMPDBLOGDIR="D:\SqlData\TempDB"
SQLBACKUPDIR="D:\SqlData\Backup"
先建好数据目录:
mkdir -p /d/SqlData/Data /d/SqlData/Log /d/SqlData/TempDB /d/SqlData/Backup
⚠️ 配置坑速查(已实测)
| 错误写法 | 后果 | 正确写法 |
|---|---|---|
IACCEPTSQLSERVERLICENSETERMS=Y |
error code 2/3 校验失败 | =True |
INDICATEPROGRESS=Y |
校验失败(/Q 下不需要) | 删掉或 =False |
INSTANCETYPE=Standalone |
2022 不识别 | 删除此行(默认实例用 INSTANCENAME) |
SQLSVCPASSWORD="" |
空密码触发校验错误 | 删除此行(虚拟账户无需密码) |
=Y 的任何开关 |
布尔期望型校验失败 | 一律 =True/False |
4. 启动安装(PowerShell 启动 + 阻塞等待)
最关键一步:用 PowerShell Start-Process 拉起 setup.exe,但必须阻塞轮询直到新 Summary 出现再退出,否则 PowerShell 会话结束会把安装子进程树一起杀掉 → 出现 Setup was canceled / Final result: Pending。
$ErrorActionPreference = "Stop"
$setup = "H:\setup.exe" # 用第2步得到的盘符
if (-not (Test-Path $setup)) { throw "setup.exe 不存在 (ISO 可能已卸载)" }
$arg = '/Q /ConfigurationFile="D:\SQLServer2022\ConfigurationFile.ini"'
$proc = Start-Process -FilePath $setup -ArgumentList $arg -PassThru -WindowStyle Hidden
# 阻塞等待:轮询新 Summary*.txt(文件名带机器名,形如 Summary_<MACHINE>_<时间戳>.txt)
$LOGDIR = "C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log"
$lastTs = "20260101_000000" # 设成早于本次的时间戳基线
$deadline = (Get-Date).AddMinutes(15)
while ((Get-Date) -lt $deadline) {
Start-Sleep -Seconds 20
$s = Get-ChildItem "$LOGDIR\*" -Filter "Summary*.txt" -Recurse -ErrorAction SilentlyContinue |
Sort-Object LastWriteTime -Descending | Select-Object -First 1
if ($s -and ($s.FullName -match '\\(\d{8}_\d{6})\\')) {
$ts = $Matches[1]
if ($ts -gt $lastTs) {
$c = Get-Content $s.FullName -Raw
if ($c -match 'Final result') { "COMPLETED: $($s.FullName)" | Out-File "D:\SQLServer2022\install_logs\done.log" -Encoding utf8; break }
}
}
}
> 安装日志目录:C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\<时间戳>\(160 = SQL 2022)。
> 失败会快速(约 30s)在 Summary 里报 Exit code/无效参数;成功则需 5–10 分钟,最终 Final result 含 Passed/相关 feature。
5. 验证安装与连通(PowerShell 只读)
# 1) 服务状态
Get-Service -Name MSSQLSERVER, SQLSERVERAGENT | ForEach-Object { "$($_.Name): $($_.Status)" }
# 2) TCP/IP 与端口(安装时 TCPENABLED=1 已生效;此处只读验证)
$base = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQLServer\SuperSocketNetLib\Tcp"
"Tcp Enabled: $((Get-ItemProperty $base -Name Enabled).Enabled)"
"TcpPort: $((Get-ItemProperty "$base\IPAll" -Name TcpPort).TcpPort)"
# 3) 用 sa 经 TCP 1433 实测连通 + 排序规则
$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Server=tcp:localhost,1433;User Id=sa;Password=Sql@2022Dev;Connection Timeout=15"
$conn.Open()
$cmd = $conn.CreateCommand()
$cmd.CommandText = "SELECT @@VERSION, SERVERPROPERTY('Collation'), SERVERPROPERTY('Edition'), SERVERPROPERTY('ProductVersion')"
$r = $cmd.ExecuteReader()
while ($r.Read()) { "VERSION: $($r[0])"; "COLLATION: $($r[1])"; "EDITION: $($r[2])"; "VERSION: $($r[3])" }
$r.Close(); $conn.Close(); "CONNECT_OK"
验收标准(金蝶云星空建账套前提):
- MSSQLSERVER 服务 Running
- Tcp Enabled = 1,端口 1433
- COLLATION = Chinese_PRC_CI_AS
- sa 经 tcp:localhost,1433 连接成功
6. 交付用户的连接信息模板
服务器: localhost (或本机名)
实例: 默认实例 (连接时不写实例名)
端口: 1433
身份验证: SQL Server 身份验证
登录名: sa
密码: <ConfigurationFile 中的 SAPWD>
排序规则: Chinese_PRC_CI_AS
7. 错误处理速查表
| 现象 / Exit code | 原因 | 处理 |
|---|---|---|
| 下载只到 64KB / 文件为空 | 沙箱掐断大文件下载 | dangerouslyDisableSandbox: true + -C - 断点续传 |
HTTP 416 on 续传 |
文件已完整 | 直接进入挂载/安装 |
| 原 fwlink 落地页 | 微软改填表下载 | 换 download.microsoft.com/download/.../SQLServer2022-x64-ENU-Dev.iso 直链 |
| Bash 跑 setup.exe → Permission denied | git bash 不能跑 Windows 原生 exe | 一律用 PowerShell Start-Process |
Setup was canceled / Final result: Pending,但实例目录已建 |
PowerShell 进程树被杀死 | 启动后阻塞轮询 Summary 再退出 |
error code 2/3 + invalid setting |
配置里有 =Y 或非法参数 |
见上方「配置坑速查」逐一改为 True/False 或删除 |
| 写 HKLM 注册表被拒 | 会话无注册表写权限 | 安装时 TCPENABLED=1 已开 TCP;只读验证即可 |
监控 Summary.txt 一直不出现 |
实际文件名带机器名 | 用 Summary*.txt 通配,并按时间戳过滤 |
8. 复装 / 排错提示
- 每次失败后 SQL 会生成全新日志子目录(按时间戳),实例目录不会创建 → 可安全重跑
setup.exe,先修配置再启动。 - 重跑前确保 ISO 仍挂载(盘符不变);若卸载了,回第 2 步重新挂载。
- 安装完成后 ISO 可卸载:
Dismount-DiskImage -ImagePath <iso>。 - 生产环境请把
SAPWD改为强密码,并考虑标准版/企业版(Developer 版仅限开发测试)。