Invoke-Command仅在远程主机有用户登录时可执行静默安装问题求助
解决WinRM远程执行静默安装无活跃会话时挂起的问题
问题原因
多数Windows桌面应用安装包(即使带静默参数)依赖交互式会话的桌面环境,而WinRM默认创建的是非交互式会话,没有桌面资源,导致安装进程因等待桌面上下文而挂起。
解决方案
1. 调整Start-Process参数强制非交互式运行
给Start-Process添加-NoNewWindow参数,避免安装程序尝试创建桌面窗口,同时通过-PassThru获取进程状态确认结果:
# Create Session $session = New-PSSession -ComputerName $computer # Install the application on the remote computer Invoke-Command -Session $session -ScriptBlock { $installProcess = Start-Process -FilePath "c:\VMware-Horizon-Agent-x86_64-2312-8.12.0-23142606.exe" ` -ArgumentList "/s /v`"/qn ADDLOCAL=Core,USB,RTAV,VmwVaudio,GEOREDIR,V4V,PerfTracker,HelpDesk,PrintRedir REMOVE=ClientDriveRedirection`"" ` -Wait -NoNewWindow -PassThru Write-Output "安装进程退出码: $($installProcess.ExitCode)" }
2. 直接调用MSI安装包(推荐)
部分exe安装包实际是MSI的封装,可先提取MSI后直接用msiexec执行,完全避开exe的交互式依赖:
- 先在本地提取MSI:
VMware-Horizon-Agent-x86_64-2312-8.12.0-23142606.exe /extract c:\temp - 远程执行MSI安装:
Invoke-Command -Session $session -ScriptBlock { $installProcess = Start-Process msiexec.exe ` -ArgumentList "/i c:\temp\VMware-Horizon-Agent.msi /qn ADDLOCAL=Core,USB,RTAV,VmwVaudio,GEOREDIR,V4V,PerfTracker,HelpDesk,PrintRedir REMOVE=ClientDriveRedirection" ` -Wait -NoNewWindow -PassThru Write-Output "安装进程退出码: $($installProcess.ExitCode)" }
3. 用任务计划执行安装(最可靠的无会话方案)
任务计划可指定以SYSTEM权限在无用户登录时运行,不依赖桌面会话:
Invoke-Command -Session $session -ScriptBlock { # 创建安装任务动作 $taskAction = New-ScheduledTaskAction -Execute "c:\VMware-Horizon-Agent-x86_64-2312-8.12.0-23142606.exe" ` -Argument "/s /v`"/qn ADDLOCAL=Core,USB,RTAV,VmwVaudio,GEOREDIR,V4V,PerfTracker,HelpDesk,PrintRedir REMOVE=ClientDriveRedirection`"" # 创建10秒后触发的触发器 $taskTrigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(10) # 设置任务不依赖电池和网络 $taskSettings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RunOnlyIfNetworkAvailable:$false # 指定SYSTEM权限运行 $taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest # 注册并启动任务 Register-ScheduledTask -TaskName "HorizonAgentInstall" -Action $taskAction -Trigger $taskTrigger -Settings $taskSettings -Principal $taskPrincipal -Force Start-ScheduledTask -TaskName "HorizonAgentInstall" # 等待任务完成 do { Start-Sleep -Seconds 30 $taskStatus = Get-ScheduledTask -TaskName "HorizonAgentInstall" | Get-ScheduledTaskInfo } while ($taskStatus.Status -ne "Completed") # 输出结果并清理任务 Write-Output "任务退出码: $($taskStatus.LastTaskResult)" Unregister-ScheduledTask -TaskName "HorizonAgentInstall" -Confirm:$false }
总结
优先尝试方案1和2,若仍无效,方案3是无用户会话场景下最稳定的安装方式。
内容的提问来源于stack exchange,提问作者anton123
相关产品推荐
相关产品推荐

