powershell远程安装msi失败

问题描述 投票:0回答:3

我正在尝试使用 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 帐户对驱动器和所有文件夹具有完全控制权。

请指教...

powershell windows-installer
3个回答
0
投票

您尝试过使用 PSEXEC 吗?或者您使用 powershell 是有原因的?我发现远程安装比尝试通过 powershell 更容易。

只需将 PSEXEC 写入服务器 CMD 即可。将文件复制到本地,然后运行 MSIExec 进行安装。


0
投票

我在尝试使用 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
}

-1
投票

我最终编写了第二个 PowerShell 脚本,该脚本在服务器上运行,监视特定文件夹中是否有新的 msi 文件。该脚本运行实际执行安装任务的第一个脚本。

© www.soinside.com 2019 - 2024. All rights reserved.