如何使用 PowerShell 自动执行 Windows 更新?

如何使用 PowerShell 自动执行 Windows 更新?

我为什么要这么做

当 Windows 更新毫无预警地运行时,占用了大量的资源,导致我的电脑长时间无法使用,

我曾经使用过:

 net stop wuauserv
 wmic service where name="TrustedInstaller" call stopservice
 taskkill /f /im TiWorker.exe

并遇到了严重的后果(更新失败并且在(重新)启动时不断安装并不断回滚),但是为了安全起见,保持我的计算机更新是很重要的。

我想要实现的目标

安排时间自动扫描、下载和安装更新并防止不定期的自动更新,仅在我不使用计算机时安装更新,这样就不会降低我的电脑速度。

我曾尝试过

命令:

Reg Add HKLM\SYSTEM\CurrentControlSet\Services\TrustedInstaller /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc /v Start /t REG_dword /d 3 /f
Reg Add HKLM\SYSTEM\CurrentControlSet\Services\wuauserv /v Start /t REG_dword /d 3 /f

我可以确认这些设置不会达到我想要的结果。

gpedit.msc “本地计算机策略”->“计算机配置”->“管理模板”->“Windows 组件”->“Windows 更新”->“配置自动更新”

我已将其配置为:

在此处输入图片描述

(每月第四周每周日00:00)

效果如下:

在此处输入图片描述

如果不是所有的更新都限制在时间表内,那么它就毫无意义;

我知道我可以暂停 Windows 更新,但手动操作会很累,尽管暂停 Windows 更新很有用。我可以使用 taskchd 为脚本文件创建计划任务,我想以编程方式暂停 Windows 更新并安排自动更新。

更新:

我在@TOOGAM 的帮助下完成了这些工作,使用来自此链接的信息:

https://erdentec.com/pausing-windows-10-updates-indefinitely/

我的成果:

$PauseStart=(Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
$PauseEnd=(Get-Date).AddMonths(1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseFeatureUpdatesEndTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseQualityUpdatesEndTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseUpdatesExpiryTime" -Type "String" -Value $PauseEnd
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseFeatureUpdatesStartTime" -Type "String" -Value $PauseStart
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" -Name "PauseQualityUpdatesStartTime" -Type "String" -Value $PauseStart
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Type "DWord" -Value 2
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Type "DWord" -Value 1
Start-Service -Name "Wuauserv"

但是我不能让它自动安装更新,我已经运行了这个:

Get-Command -Module *Update*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Get-WindowsUpdateLog                               1.0.0.0    WindowsUpdate
Function        Get-WUAVersion                                     1.0.0.2    WindowsUpdateProvider
Function        Get-WUIsPendingReboot                              1.0.0.2    WindowsUpdateProvider
Function        Get-WULastInstallationDate                         1.0.0.2    WindowsUpdateProvider
Function        Get-WULastScanSuccessDate                          1.0.0.2    WindowsUpdateProvider
Function        Install-WUUpdates                                  1.0.0.2    WindowsUpdateProvider
Function        Start-WUScan                                       1.0.0.2    WindowsUpdateProvider

我运行了这个并遇到一个错误:

Start-WUScan
Invoke-CimMethod: C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\WindowsUpdateProvider\MSFT_WUOperations.psm1:13
Line |
  13 |  …  $scanres = Invoke-CimMethod -Namespace root/Microsoft/Windows/Window …
     |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     | Provider load failure

Start-WUScan: Scan hit error: .ReturnValue

另外,我无法让 PowerShell 管理位于 taskschd 中的 \Microsoft\Windows\WindowsUpdate 中的计划任务(虽然我可以在 cmd 中使用 schtasks,并且我知道我可以在 pwsh 中使用 cmd 命令,但我想以纯粹的 PowerShell 精神来执行此操作...)

我能够使用 taskschd,并且可以创建一个计划任务来运行.ps1 文件(只需将“C:\Program Files\PowerShell\7\pwsh.exe”放入程序/脚本并使用 -file path\to\ps1 作为参数)

我怎样才能解决我遇到的问题?

更新:

我已经安装了模块:PSWindowsUpdate

Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
Install-Module -Name PSWindowsUpdate

运行完毕,结果如下:

Get-WindowsUpdate

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
UTILCOM-466… -------    KB4577194  607MB SQL Server 2019 RTM Cumulative Update (CU) 8 KB4577194
UTILCOM-466… -D-----    KB4592438  103GB 2020-12 Cumulative Update for Windows 10 Version 20H2 for x64-based Systems (…

注意 KB4592438 的大小...它是 103GB...

看看这个:

https://www.catalog.update.microsoft.com/Search.aspx?q=KB4592438

在此处输入图片描述

到底出了什么问题?

我整理了以下内容:

if ("PSWindowsUpdate" -notin (Get-Module -ListAvailable).name) {Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted;Install-Module -Name PSWindowsUpdate}

我知道我可以使用:

Get-WindowsUpdate
Install-WindowsUpdate

理论上它可以工作,但看看 Get-WindowsUpdate 显示的 KB4592438 的大小......

免责声明

知道我可以使用此 cmd 单行命令自动扫描、下载和安装 Windows 更新,但这不是 PowerShell,而且这完全违背了纯粹的 PowerShell 精神,我不得不明确地声明我打算使用“PowerShell Core 7”和“任务计划程序”来实现这一点,并且只使用它们,而不是cmd,在我看来这不够专业:

wuauclt /detectnow /updatenow

相关内容