我正在尝试使用 powershell 在远程服务器上安装 msi 文件。
服务器 1 是我的构建服务器,服务器 2 是我的应用程序服务器。 当构建服务器完成构建后,我想触发一个 powershell 脚本以将最新版本安装到我的应用程序服务器。
我使用以下命令创建会话并执行安装:
# Create session to Application Server
$Session = New-PSSession -Name <ApplicationServer> -ComputerName <ApplicationServer> -Auth CredSSP -cred OURDOMAIN\MyUser
# Prepare expression and create script block
$Script = "Invoke-Expression 'msiexec /i <InstallerFile> /qn /L*v C:\Temp\install_fail.log'"
$ScriptBlock = [Scriptblock]::Create($Script)
# Execute in the session
Invoke-Command -ScriptBlock $ScriptBlock -Session $Session
# Clean up the session
Remove-PSSession $Session
日志有以下错误(完整日志见附件install_fail.log)
MSI (s) (C4:1C) [17:08:05:333]: Note: 1: 1708
MSI (s) (C4:1C) [17:08:05:333]: Product: WindowsService1 -- Installation failed.
MSI (s) (C4:1C) [17:08:05:335]: Windows Installer installed the product. Product Name: WindowsService1. Product Version: 8.0.0.0. Product Language: 1033. Manufacturer: MyCompany. Installation success or error status: 1603.
当我在 powershell 命令提示符上启动会话并执行安装时,安装成功(有关完整日志,请参阅附件 install_success.log): ENTER-PSSession-计算机名 调用表达式 'msiexec /i /qn /L*v C:\Temp\install_success.log' 退出
当我在这两种情况下打印 whoami 时,它都会返回 OURDOMAIN\MyUser。
Microsoft 列出了有关 1603 的以下内容:(http://support.microsoft.com/kb/834484) 您尝试安装 Windows Installer 软件包的文件夹已加密。
文件夹未加密
包含您尝试安装 Windows Installer 软件包的文件夹的驱动器将作为替代驱动器进行访问。
驱动器是服务器硬盘上的一个分区
SYSTEM 帐户对您尝试安装 Windows Installer 软件包的文件夹没有完全控制权限。您注意到该错误消息是因为 Windows Installer 服务使用 SYSTEM 帐户来安装软件。
SYSTEM 帐户对驱动器和所有文件夹具有完全控制权。
请指教...
您尝试过使用 PSEXEC 吗?或者您使用 powershell 是有原因的?我发现远程安装比尝试通过 powershell 更容易。
只需将 PSEXEC 写入服务器 CMD 即可。将文件复制到本地,然后运行 MSIExec 进行安装。
我在尝试使用 PowerShell 远程连接并执行“msiexec”进行软件安装时遇到了同样的问题。相反,我使用了cmd。这是一个例子:
$RemoteServers = 'server1','server2','server3'
foreach ($RemoteServer in $RemoteServers) {
$Session = New-PSSession -ComputerName $RemoteServer
$CommandToRun = "cmd /c msiexec.exe /qn /i C:\Windows\Temp\mymsi.msi /l*v C:\log.txt"
Invoke-Command -Session $Session -ScriptBlock {
param($Command1, $Command2)
Invoke-Expression -Command $Command1
} -ArgumentList $CommandToRun
# Close the PSSession
Remove-PSSession $Session
}
我最终编写了第二个 PowerShell 脚本,该脚本在服务器上运行,监视特定文件夹中是否有新的 msi 文件。该脚本运行实际执行安装任务的第一个脚本。