簡體   English   中英

Powershell Start-Process msiexec在遠程計算機上無法運行

[英]Powershell Start-Process msiexec on a remote machine not working

出於某種原因,在遠程計算機上通過invoke命令運行時,Start-Process msiexec將無法工作。 我查了一下,雖然有些人建議使用psiexec我看到很多人使用普通的舊invoke-command在遠程機器上啟動msi安裝程序。

這是我目前使用的代碼:

$session = New-PSSession -computername $computerName -ea stop

$command = {

    Param(
    [Parameter()]
    [string]$computerName,

    [Parameter()]
    [string]$domain,

    [Parameter()]
    [string]$user,

    [Parameter()]
    [string]$password,

    [Parameter()]
    [string]$installDir
    )

    $msiArgumentList = "/i C:\Installer.msi /l c:\log.txt /quiet /qr /norestart IAGREE=Yes DOMAIN=$domain ACCOUNT=$user PASSWORD=$password PASSWORDCONFIRM=$password INSTALLDIR=$installDir"

        Start-Process msiexec -ArgumentList $msiArgumentList -Wait

}

Invoke-Command -session $session -ScriptBlock $command -ArgumentList $computerName, $domain, $user, $password, $installDir

Remove-PSsession -session $session

我使用相同的方法使用intallutil遠程安裝服務,它工作正常。 在目標計算機上啟用腳本以及遠程處理,以便所有帳戶都能正常工作。 兩台計算機都具有相同的憑據,但我仍嘗試向invoke-command和pssession添加憑據。 我在本地測試了代碼,安裝工作正常。 遠程它沒有,也沒有錯誤。 我可以在taskmanager的目標機器上看到msiexec已啟動但沒有任何反應。 我甚至試過禁用防火牆,但仍然沒有。 我試過&運算符啟動msiexec但仍然沒有。

不確定我還能嘗試什么。

您可以嘗試使用Passthru執行Start-Process以查看是否返回了錯誤:

(Start-Process -FilePath msiexec.exe -ArgumentList $msiArgumentList -Wait -Passthru).ExitCode

另一件可能有用的事情是將日志記錄增加到/l*v


更新1

你可以嘗試以下方法,只是為了檢查msi的遠程命令是否正常工作,它應該導致1619。

(Start-Process -FilePath msiexec.exe -ArgumentList "/i no.msi /quiet /qb!" -Wait -Passthru).ExitCode

也許你嘗試另一種方式,如果你不挺身而出? 使用任務計划程序,例如通過在遠程計算機上創建和執行任務來啟動命令行:

SchTasks /CREATE /XML mycommand.xml /TN "thiscommand"
SchTasks /RUN /TN "thiscommand"

這是用於在本地計算機上啟動任務(如)。 使用參數/ S,您可以在遠程計算機上創建任務,如下所示:

SchTasks /S thatPC /CREATE /XML mycommand.xml /TN "thiscommand"
SchTasks /S thatPC /RUN /TN "thiscommand"

有關參數的詳細信息以及定義任務的.xml文件的語法,您可以查看幫助。

似乎問題是msi安裝程序的構建方式和Windows服務器對交互式進程的限制的組合。 我最終使用psexec來繞過這個問題。

對我有用的唯一解決方案是輪詢流程狀態。 這可以在遠程PowerShell會話中的scriptblock內運行。

$res = Start-Process -FilePath $process -ArgumentList $arguments -Wait -PassThru

while ($res.HasExited -eq $false) { 
    Write-Host "Waiting for $process..."
    Start-Sleep -s 1
}

$exitCode = $res.ExitCode

使用上面的答案我最終得到了

$session = New-PSSession -ComputerName $serverName -Credential $mycred
invoke-command -Session $session -ScriptBlock { param ($argxs) write-host $argxs; start-process msiexec.exe -ArgumentList $argxs } -ArgumentList "/i `"$pathToMsi`" /qn /L*V `"E:\package.log`""

寫主機只是用於驗證擴充是否被正確轉義,但在調試中被證明是無價的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM