WSUS中更新的管理逻辑
如果你探索过WSUS控制台界面,就会发现WSUS只给你提供了批准(Approve)和拒绝(Decline)更新的选项,并无办法删除更新。
如果你去WSUS服务器清理导向(WSUS Server Cleanup Wizard)中,也会发现只有删除已被拒绝三十天以上更新的选项。
那如果你想立刻删除一个更新,或者不小心同步(Synchronise)了不必要微软产品的更新,又该怎么做?
绕过控制台删除更新
好在,微软仍然给我们留下了一些空间来绕过这个愚蠢的强制设计。我们可以通过Powershell命令强行删除更新。
第1步:拒绝不必要的更新
首先,你需要在控制台中选中所有你不想要的更新,并通过右键拒绝他们。该控制台的设计非常老旧,并无直接的多选按钮。
要想连续多选,点击起始项,按住Shift
键,再点击末尾项。
要想在不取消选择其它项的情况下单选,按住Ctrl
键,单击所有你要勾选的项。
第2步:删除更新元数据
这将删除更新,使它们不会在控制台里显示,但不会删除关于他们的更新安装包本身(如果你曾下载过它们;它们将被储存在WSUS内容文件夹内)。不过不需要担心,这些安装包也可以被删除。
将下面的代码保存为一个后缀为.ps1
的文本文件 然后在Windows Powershell ISE中执行。你将能够列出当前所有的被拒更新。
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$declined=$wsus.GetUpdates() | Where {$_.IsDeclined -eq $true}
$declined.Count
如果该脚本无误地列出了你期望看到的被拒更新,那么接下来就是时候删除它们了。使用下面是Powershell脚本删除更新。
[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration")
$wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer();
$loopcontrol=$wsus.GetUpdates() | Where {$_.IsDeclined -eq $true}
$control=$loopcontrol.Count
DO{
Write-Host "$control left to go"
$declined=$wsus.GetUpdates() | Where {$_.IsDeclined -eq $true}| Select-Object -First 1000
$declined| ForEach-Object {$wsus.DeleteUpdate($_.Id.UpdateId.ToString()); Write-Host $_.Title removed}
$control=$control-1000
} Until ($control -lt 0)
第3步:删除更新安装包(WSUS Content)
到目前为止,我们只删除了更新在WSUS数据库中的元数据,因此它们不再在WSUS控制台中显示。然而,它们对应的更新安装包,如果你下载了的话,仍保留在WSUS内容文件夹中没有删除。
要想删除安装包,打开WSUS服务器清理导向,勾选删除不被任何更新或下游服务器需要的更新文件
。这将清理那些在数据库中找不到对应元数据的更新安装包。
如果你选择同步了非必要微软产品的更新…
你可以日后很轻松地在产品和分类
中作出更改。
参考资料
必须注明的是,本文中的Powershell脚本并非我所创,而是由这篇帖子里的用户kevinhughes2
所编写。