远程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 }
关键修改点说明
- 变量传递:所有本地变量前添加
Using:前缀,确保远程会话能正确读取这些值(PowerShell 3.0+支持)。 - 密码安全处理:本地用SecureString存储密码,远程会话中再转换为明文传递给安装程序,兼顾安全与参数要求。
- 模块替换:用
SqlServer模块替代老旧的SQLPS,这是微软当前官方推荐的PowerShell模块,兼容性和稳定性更好。 - 参数复用:用哈希表封装
Invoke-Sqlcmd的公共参数,减少重复代码,提升可读性。
额外注意事项
- 确保执行脚本的账号对远程机器
DB12345有管理员权限,且能访问D:\Setup.exe安装介质。 - 如果远程机器未安装
SqlServer模块,需要先在远程机器上以管理员身份运行Install-Module SqlServer -Force -AllowClobber(需允许从PowerShell Gallery下载模块)。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

