使用 PowerShell 远程安装 Windows 更新。 (一些 PowerCLI)

问题描述 投票:0回答:4

我在远程 Windows 更新脚本方面遇到问题。 我的目标:从 PowerShell 更新所有 Windows 服务器,无需使用 WSUS 或 SCCM,无需登录所有服务器并启动更新过程。

对于我的脚本,我使用 powercli 和 PSWindowsUpdate 模块。 出于测试目的,我在 $hostname 变量中使用单个主机。

这就是我所拥有的。

$Cred = Get-Credential
Import-Module PSWindowsUpdate
Invoke-Command -ComputerName $HostName {Import-Module PSWindowsUpdate} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName {Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false} -Verbose -Credential $Cred
Invoke-Command -ComputerName $HostName -ScriptBlock {Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Out-File C:\Setup\PSWindowsUpdate.log } -credential $cred
Get-Content \\$HostName\c$\Setup\PSWindowsUpdate.log

运行脚本后,从关闭、快照、开机一切正常,但我无法安装任何更新。 我收到以下错误:

WARNING: To perform some operations you must run an elevated Windows PowerShell console.
WARNING: Can't access to machine "hostName". Try use: winrm qc

当我搜索时,我发现我无法在 PowerShell 本身中进行任何提升,并且我正在阅读一些有关运行 CMD bat 以提升权限启动 PowerShell 的帖子。 对我来说,将更新脚本复制到每个 Windows 服务器并批量以提升的权限运行它不是问题,但这是唯一的方法吗?

我将进行批量解决方案,看看我能实现什么,但是我面临的问题还有其他解决方案吗? 有人试过吗?

非常感谢您的宝贵时间! 我也欢迎对我的代码或修复发表任何评论!

windows powershell powercli windows-update
4个回答
0
投票

如果管理员正确,提升的提示是您的问题,以下内容可能会帮助您。

PS 代码检查是否以管理员身份运行。如果没有,它将以管理员身份重新启动。

If (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    $Arguments = "& '" + $MyInvocation.MyCommand.Definition + "'"
    Start-Process Powershell -Verb RunAs -ArgumentList $Arguments
    Break
}

您可能还需要在注册表中的

ConsentPromptBehaviorAdmin
处修改
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\

-

这是一个简单的 BAT 文件,它将绕过 PS 执行策略,然后启动 PS 脚本(假设它们的名称相同)。

REG ADD "HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell" /T REG_SZ /V ExecutionPolicy /D Unrestricted /F

Start PowerShell.exe -Command "& '%~dpn0.ps1'"

添加 PS 脚本的末尾,您可以使用

Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope LocalMachine -Force
将执行策略设置回限制或您设置的值。


0
投票

我在尝试使用

Invoke-Command
在远程计算机上导入模块时遇到了这个问题。有一个安全功能不允许您这样做。您可以尝试运行以下命令来查看导入新模块是否更成功。

$myPsSession = New-PSSession -ComputerName $HostName
Import-Module -Name PSWindowsUpdate -PSSession $myPsSession

0
投票

我选择了任务调度程序解决方案,因为它看起来更容易。

我创建了一个名为 WUpdates.ps1 的脚本

$Timestamp=((Get-Date).ToString('dd_MM_yyyy_HH_mm'))
Import-Module PSWindowsUpdate -Verbose
Add-WUServiceManager -ServiceID 7971f918-a847-4430-9279-4a52d1efe18d -Confirm:$false -Verbose
Get-WUInstall -MicrosoftUpdate -IgnoreUserInput -AcceptAll -AutoReboot -Confirm:$FALSE -Verbose | Format-Table -AutoSize | Out-File C:\Setup\WUpdates\PSWindowsUpdate_$Timestamp.log

以及一个用于创建名为 WinUpdateScheduler.ps1 的计划任务的脚本

Unregister-ScheduledTask -TaskName "WindowsUpdates" -Confirm:$False    
$Action = New-ScheduledTaskAction -Execute C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Argument '-f "C:\Setup\WUpdates\WUpdates.ps1"'
$Trigger =  New-ScheduledTaskTrigger -Once -At (get-date).AddSeconds(30)
Register-ScheduledTask -Action $Action -Trigger $Trigger -RunLevel Highest -User system -TaskName "WindowsUpdates" -Description "Running Windows updates."

然后在主脚本中,我调用计划脚本并安装更新。

Invoke-Command -ComputerName $HostName { c:\setup\WUpdates\WinUpdateScheduler.ps1 } -Credential $Cred

如果有人想要完整的脚本,我可以提供。 至于 Nixphhoe 和 Backin 的答案,我会检查它们,稍后我会回来评论它们。

非常感谢您的宝贵时间。


0
投票
Invoke-WUInstall -ComputerName Test-1 -Script { ipmo PSWindowsUpdate; Get-WUInstall -AcceptAll | Out-File C:\PSWindowsUpdate.log } 
-Confirm:$false –Verbose

https://4sysops.com/archives/install-windows-updates-remotely-with-the-powershell/

© www.soinside.com 2019 - 2024. All rights reserved.