我正在尝试使用.msu
将带有wusa.exe
的Windows补丁更新(Invoke-command
补丁文件)安装到远程计算机。但它返回代码5会引发错误。
有没有其他方法可以不使用start-process
或不提取和安装.cab
文件?
答案 0 :(得分:0)
Windows更新不允许您通过Powershell远程会话执行安装,因为它不允许任何远程身份验证令牌。
这是一个类似的问题: https://serverfault.com/questions/559287/what-does-wusa-exe-return-code-5-mean
上述问题的建议答案是使用PSRemoting在计算机上创建计划任务。
答案 1 :(得分:0)
我遇到了同样的问题,所以我写了一个函数来利用计划任务。只需几个参数即可。
我不愿意以纯文本形式传递管理员凭据,但是,有些更新需要这些凭据才能无头运行计划的任务。另外,我想在多个临时虚拟机上使用它,所以一套编码的凭据对我不起作用。
哦,也许不需要睡觉,但是我想确保它不会运行得太快并发现不正确的状况。
tempdir变量是可执行文件所在的工作目录。任务调度程序要求您位于可执行文件的工作目录中,因为即使您指定了完整的文件路径,它也会在文件路径中添加工作目录的前缀
#scheduled task wrapper for installing files which normally fail due to
#windows restrictions on invoke-command
function Use-TaskWrapperInstaller {
param(
[string]$ffile,
[string]$farguments,
[string]$ftaskname,
[string]$ftempDir,
[string]$fadmin,
[string]$fpassword
)
Invoke-Command -Session $Global:s -ScriptBlock {
$action=$(New-ScheduledTaskAction -Execute "$Using:ftempDir\$Using:ffile" -Argument $Using:farguments)
$principal=$(New-ScheduledTaskPrincipal -GroupId "BUILTIN\Administrators" -RunLevel Highest)
$settings=$(New-ScheduledTaskSettingsSet)
$task=(New-ScheduledTask -Action $action -Principal $principal -Settings $settings)
Set-Location "$Using:ftempDir"
if ($(Get-ScheduledTask -TaskName "$Using:ftaskname" -ErrorAction SilentlyContinue).State -eq "Ready") {
Unregister-ScheduledTask -TaskName "$Using:ftaskname" -Confirm:$false
}
Register-ScheduledTask -TaskName "$Using:ftaskname" -InputObject $task -User "$Using:fadmin" -Password "$Using:fpassword" -ErrorAction SilentlyContinue -Force
Start-Sleep -Seconds "2"
Write-Host "Starting installation task: $Using:ftaskname"
Start-ScheduledTask -TaskName "$Using:ftaskname"
Start-Sleep -Seconds "2"
Do {
Start-Sleep -Seconds "1"
} Until ($(Get-ScheduledTask -TaskName "$Using:ftaskname" -ErrorAction SilentlyContinue).State -match "Ready")
Write-Host "Installation of $Using:ftaskname using Task Wrapper complete."
}
}