问题
启用 Windows 更新以自动下载并安排安装。安排在特定日期(星期六)运行。
我尝试过的解决方案
powershell
使用gpmc
/模块编写脚本grouppolicy
来更改 Windows 更新设置。
我所期待的最终状态是:
管理控制台-->Administrative Templates/Windows Components/Windows Update
配置自动更新->
Enabled
Auto download and schedule the install (4)
Every Saturday (7)
面临的问题
没有找到使用 powershell 为 Windows Server 2016 执行此操作的任何文档。
笔记:
- 该机器不是 AD 的一部分。
- 我正在尝试改变当地政策。
答案1
不幸的是,Get-GPO
cmdlet 只能从域中获取 GPO;似乎没有任何与 COM 方法等效的托管方法IGroupPolicyObject::OpenLocalMachineGPO
。不过,还有其他方法可以设置。假设现有组策略尚未指定此策略设置,则直接调整注册表应该可以正常工作:
$hklm = [Microsoft.Win32.RegistryKey]::OpenBaseKey('LocalMachine', 'Default')
$wu = $hklm.CreateSubKey('SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU')
$wu.SetValue('NoAutoUpdate', 0, 'DWord')
$wu.SetValue('AUOptions', 4, 'DWord')
$wu.SetValue('ScheduledInstallDay', 7, 'DWord')
$wu.SetValue('ScheduledInstallTime', 0, 'DWord')
$wu.Dispose()
$hklm.Dispose()
这不会影响您在本地组策略编辑器中看到的内容,但 Windows 更新基础结构会看到它。由于您没有说明应在一天中的什么时间安装更新,因此我将其设置为午夜。您可以通过更改值来更改它ScheduledInstallTime
。
要确定哪些注册表设置对应于给定的策略,您可以使用我的开源应用程序中的元素检查器工具政策加分说到 Policy Plus,您还可以从 PowerShell 将其作为程序集加载以编辑本地 GPO。首先,下载它并使用 Explorer 中的“属性”选项卡来“解除阻止”;这样 .NET 就可以将其加载到另一个进程中。然后将其放在与此脚本相同的目录中:
[System.Reflection.Assembly]::LoadFile((gi '.\Policy Plus.exe').FullName) | Out-Null
$loader = [PolicyPlus.PolicyLoader]::new('LocalGpo', '', $false)
$pol = $loader.OpenSource()
$pol.SetValue('SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', 'NoAutoUpdate', 0, 'DWord')
$pol.SetValue('SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', 'AUOptions', 4, 'DWord')
$pol.SetValue('SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', 'ScheduledInstallDay', 7, 'DWord')
$pol.SetValue('SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', 'ScheduledInstallTime', 0, 'DWord')
$loader.Save()
$loader.Close()
这利用了 Policy Plus 的PolicyLoader
和PolFile
类。脚本完成后,您应该看到此输出(由于最后两次调用):
saved to disk and invoked policy refresh
True
这样,变化将要在本地组策略编辑器中可见,并且正常组策略基础结构会将它们应用到注册表。