You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程PowerShell安装SQL Server 2016报错,请求协助排查问题

解决远程安装SQL Server 2016的两个关键错误

看起来你遇到了两个独立的问题,我们逐个拆解解决:

错误1:SAPWD参数无效(Expected SqlSecureString)

这个错误的核心原因是本地变量没有传递到远程会话——你的$INSTANCENAME、$SAPASS等变量是在本地定义的,但Invoke-Command的远程ScriptBlock默认无法访问这些本地变量,导致安装程序接收到的SAPWD是空值,进而触发类型错误。

错误2:SQLPS模块加载失败

旧版的SQLPS模块路径经常未被加入PowerShell的模块搜索路径,而且微软现在已经推荐使用SqlServer模块替代老旧的SQLPS,这就是为什么你会遇到程序集找不到的问题。


修改后的完整脚本(带注释说明)

# 本地定义变量
$INSTANCENAME = 'DB1234INST01'
$VOLNAME = '1234INST01'
# 安全起见,将明文密码转换为SecureString存储
$SAPASS = ConvertTo-SecureString "abc@12345" -AsPlainText -Force
$InstMem = '4096'
$remoteComputer = 'DB12345'

Invoke-Command -ComputerName $remoteComputer -ScriptBlock {
    # 将SecureString转换为明文(SQL安装程序需要明文SAPWD参数)
    $sapwdPlain = [System.Net.NetworkCredential]::new("", $Using:SAPASS).Password

    # 执行SQL Server安装(所有本地变量用Using:前缀传递到远程会话)
    D:\Setup.exe `
    /SkipRules=RebootRequiredCheck `
    /ACTION=Install `
    /AGTSVCSTARTUPTYPE=Automatic `
    /BROWSERSVCSTARTUPTYPE=Automatic `
    /ERRORREPORTING=False `
    /FEATURES="SQLEngine,DQ" `
    /IACCEPTSQLSERVERLICENSETERMS `
    /INSTANCEDIR="E:\$Using:VOLNAME" `
    /INSTANCEID=$Using:INSTANCENAME `
    /INSTANCENAME=$Using:INSTANCENAME `
    /ISSVCSTARTUPTYPE=Automatic `
    /QUIETSIMPLE `
    /SAPWD=$sapwdPlain `
    /SECURITYMODE=SQL `
    /SQLSVCSTARTUPTYPE=Automatic `
    /SQLSYSADMINACCOUNTS="bac\Domain Admins" "bac\DB Admins" `
    /SQMREPORTING=False `
    /TCPENABLED=1 `
    /UpdateEnabled=1 `
    /UpdateSource=MU

    # 方案1:使用微软推荐的SqlServer模块(替代旧SQLPS)
    # 如果远程机器未安装该模块,先运行:Install-Module SqlServer -Force -AllowClobber(需管理员权限)
    Import-Module SqlServer -DisableNameChecking

    # 方案2:如果必须用SQLPS,指定完整路径(SQL Server 2016对应版本号130)
    # Import-Module "C:\Program Files\Microsoft SQL Server\130\Tools\PowerShell\Modules\SQLPS" -DisableNameChecking

    # 复用Invoke-Sqlcmd参数,让代码更简洁
    $sqlCmdParams = @{
        ServerInstance = ".\$Using:INSTANCENAME"
        Username = "sa"
        Password = $sapwdPlain
        Query = ""
    }

    # 配置SQL实例内存
    $sqlCmdParams.Query = "EXEC sys.sp_configure 'show advanced options', 1"
    Invoke-Sqlcmd @sqlCmdParams

    $sqlCmdParams.Query = "RECONFIGURE"
    Invoke-Sqlcmd @sqlCmdParams

    $sqlCmdParams.Query = "EXEC sys.sp_configure 'max server memory (MB)', $Using:InstMem"
    Invoke-Sqlcmd @sqlCmdParams

    $sqlCmdParams.Query = "EXEC sys.sp_configure 'show advanced options', 0"
    Invoke-Sqlcmd @sqlCmdParams

    $sqlCmdParams.Query = "RECONFIGURE"
    Invoke-Sqlcmd @sqlCmdParams
}

关键修改点说明

  1. 变量传递:所有本地变量前添加Using:前缀,确保远程会话能正确读取这些值(PowerShell 3.0+支持)。
  2. 密码安全处理:本地用SecureString存储密码,远程会话中再转换为明文传递给安装程序,兼顾安全与参数要求。
  3. 模块替换:用SqlServer模块替代老旧的SQLPS,这是微软当前官方推荐的PowerShell模块,兼容性和稳定性更好。
  4. 参数复用:用哈希表封装Invoke-Sqlcmd的公共参数,减少重复代码,提升可读性。

额外注意事项

  • 确保执行脚本的账号对远程机器DB12345有管理员权限,且能访问D:\Setup.exe安装介质。
  • 如果远程机器未安装SqlServer模块,需要先在远程机器上以管理员身份运行Install-Module SqlServer -Force -AllowClobber(需允许从PowerShell Gallery下载模块)。

内容的提问来源于stack exchange,提问作者Abhishek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:24:12