使用wusa.exe安装.msu补丁文件不能与invoke-command一起使用

时间:2016-06-15 12:05:23

标签: powershell-v3.0 patch powershell-remoting invoke-command

我正在尝试使用.msu将带有wusa.exe的Windows补丁更新(Invoke-command补丁文件)安装到远程计算机。但它返回代码5会引发错误。

有没有其他方法可以不使用start-process或不提取和安装.cab文件?

2 个答案:

答案 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."
    }
}