我正在编写一个 Powershell 脚本,用于在远程服务器上安装 SQL Server。我有两台由同一个人同时构建的 VM 服务器,运行 Windows Server 2019。它们的 CPU 数量和安装的内存略有不同(应我的要求),但除此之外应该是相同的,尽管我已经在一台服务器上手动安装了该应用程序。脚本遵循的过程如下:
- 在远程服务器上创建远程会话和会话配置以解决双跳问题。
- 关闭会话并使用新创建的会话配置启动一个新会话。
- 从第三台服务器挂载 ISO(因此需要会话配置)。
- 运行安装。
- 卸载 ISO。
- 关闭会话
如果我针对一台服务器(我手动安装的那台)运行此程序,它工作得很好。如果我针对第二台服务器运行它,它将创建会话配置,但无法创建第二个远程会话。我所做的所有搜索都显示“WS-Management 服务配置为不接受任何远程 shell 请求”,但这不是我的问题。我可以连接并创建/更新会话配置,但第二次连接尝试失败,并显示消息“服务配置为拒绝此插件的远程连接请求“,我找不到任何关于此的信息。
以下是脚本的相关部分:
# Start remote session $ServerName
$cred = Get-Credential $env:USERDOMAIN\$env:USERNAME
$remote = New-PSSession -ComputerName $ServerName -Credential $cred
$ConfigurationName = "DBAdmin"
# Create configuration on remote server if one doesn't exist, else update it
# (This allows double-hop to installation media)
"Starting remote session ...."
Invoke-Command -Session $remote -ScriptBlock {
param($configname, [PSCredential]$cred)
$config = Get-PSSessionConfiguration -Name $configname
if($config) {
if($config.RunAsUser -ne $cred.UserName) {
"Updating remote session configuration ...."
Set-PSSessionConfiguration -Name $configname -RunAsCredential $cred
}
} else {
"Creating remote session configuration ...."
Register-PSSessionConfiguration -Name $configname -RunAsCredential $cred
}
} -ArgumentList $ConfigurationName, $cred
# Stop remote session
Remove-PSSession -Session $remote
### Fails on this next line - on one server only ###
# Run installation on remote machine using configuration
$remote = New-PSSession -ComputerName $ServerName -Credential $cred -ConfigurationName $ConfigurationName
Invoke-Command -Session $remote -ScriptBlock {
param($path, $params)
# Mount ISO to drive letter
"Mounting installation ISO ...."
$isopath = $path + "*.iso"
$iso = (Get-ChildItem -Path $isopath).Name
$path += $iso
$mnt = Mount-DiskImage -ImagePath $path -PassThru
$drive = ($mnt | Get-Volume).DriveLetter
# Check for PID
if($params.Contains("pid-goes-here")) {
$pidpath = $drive[0] + ":\x64\DefaultSetup.ini"
$pidvalue = Get-Content -Path $pidpath | Where-Object {$_ -match "PID="} | ConvertFrom-StringData
$params = $params.Replace("pid-goes-here", $pidvalue.PID)
$params = $params.Replace("`"", "")
}
# Run installation
"Running installation ...."
# Write out command and parameters for testing
Write-Host ($drive[0] + ":\setup.exe")
Write-Host $params
# Uncomment following line to actually run setup
#Start-Process -FilePath ($drive[0] + ":\setup.exe") -ArgumentList $params -Wait
# Un-mount ISO
"Un-mounting ISO ...."
$mnt = Dismount-DiskImage -ImagePath $path
} -ArgumentList $InstallMediaPath, $Parameters
# Stop remote session
"Closing remote session ...."
Remove-PSSession -Session $remote
有什么想法可以尝试吗?我已将组策略从未配置更新为启用以允许远程访问,尽管我不认为这是问题所在,而且这也没有帮助。这是我第一次尝试任何严肃的 Powershell 脚本,所以我可能会遗漏一些显而易见的东西。
我的下一步是像在第一台服务器上一样手动运行安装,如果它能正常工作,则尝试弄清楚它在做什么,因为手动安装违背了我的脚本的目的!
谢谢!