[英]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.