PowerShellでWSUSから64ビット版 Windows 10, バージョン1607 向け以外の更新プログラムを拒否する

このスクリプトは現状ベースで作成されたものです。今後の更新プログラムに対応するためにはスクリプトのメンテナンスが必要になることを理解してください。

WSUSの設定

製品と分類の選択はストレージに余裕をもって設定をしてください。
製品: ~Driversはマスターイメージに組み込み、更新があれば展開する計画を立てます。
分類: UpgradesはWindows 10の1507→1511や1507,1511→1607へのアップグレードを含みますので、承認をする前に必要なSKUのみ選択します。

製品の選択

分類の選択

  • Feature Packs, Service Packs, Upgrades, セキュリティ問題の修正プログラム, ツール, 更新, 修正プログラム集, 重要な更新, 定義更新プログラム)

免責事項

このスクリプトを利用したことによる問題に対する責任は一切負いません。
実行する前に必ず検証をしてください。

スクリプト

Write-Host "* 20170307 WSUS から不要な更新プログラムを拒否する"
Write-Host "** 64ビット版 Windows 10, バージョン1607 向け以外の更新プログラムを拒否します"
Write-Host "** 2017/3/7 更新"
Write-Host
Write-Host "このスクリプトは現状ベースで作成されたものです。今後の更新プログラムに対応するためにはスクリプトのメンテナンスが必要になることを理解してください。"
Write-Host "** このスクリプトを利用したことによる問題に対する責任は一切負いません。実行する前に必ず検証をしてください。"
Write-Host
$Wsus = Get-WsusServer -Name localhost -PortNumber 8530

Write-Host
Write-Host "* 更新プログラムを拒否"
Write-Host "** 更新プログラムを拒否するフィルターを作成"
$FilteredUpdates = @()
$AllUpdates = $Wsus.GetUpdates() | Where IsDeclined -eq $False 
#デバッグ用: "Windows 10"を含む更新プログラムを検索
#$AllUpdates = $Wsus.SearchUpdates("Windows 10") | Where IsDeclined -eq $False

#この項目のコメントアウトを外す前に、該当する更新プログラムを他のPCが必要としていないか確認をしてください
# $FilteredUpdates += $AllUpdates | Where IsSuperseded -eq $True
# Write-Host "*** 置き換えられた更新プログラム を追加しました"

#この項目のコメントアウトを外す前に、該当する更新プログラムを他のPCが必要としていないか確認をしてください
# $FilteredUpdates += $AllUpdates | Where UpdateClassificationTitle -eq "Upgrades"
# Write-Host "*** 分類:Windows 10の機能更新 をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*890830_X86_WIN8_MRT_*"
# Write-Host "*** 32ビット版Windows用 悪意のあるソフトウェアの削除ツール をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win10-RTM-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win10-TH1-RTM-*"
# Write-Host "*** Windows 10, バージョン 1507用更新プログラム をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win10-TH2-RTM-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win10-Partner-TH2RTM-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win10-RTM-TH2RTM-*"
# Write-Host "*** Windows 10, バージョン 1511用更新プログラム をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*Windows10Rs1Client-RTM-X86*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*Win10-RTM-RS1RTM-X86*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*Windows10Rs1Client-RTM-AdobeFlashPlayer-X86*"
# Write-Host "*** 32ビット版 Windows 10, バージョン 1607用更新プログラム をフィルターに追加しました"


#OOBE ZDP, Feature On Demand, Dynamic Update, GDR-DUなどを選択した場合
# $FilteredUpdates += $AllUpdates | Where {$_.ProductTitles -eq "Windows 8.1" -and $_.ProductTitles -eq "OOBE ZDP"}
# Write-Host "*** Windows 8.1 OOBE ZDP をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*KB3179271-Win10-TH1-GDR-DU-RTM-*"
# Write-Host "*** Windows 10 Insider Preview 14390 (LanguageFeatureOnDemand) をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*KB3193497-Windows10Rs1Server-RTM-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*KB3192967-Windows10Rs1Server-RTM-*"
# Write-Host "*** Windows Server 2016 向け Windows 10 Feature On Demand をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "KB3109599-Win10FeatureOnDemand*-RTM-X86-*"
# Write-Host "*** 32ビット版 Windows 10 Lang Pack (Language Features) Feature On Demand をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where {$_.LegacyName -like "*KB3109599-Win10FeatureOnDemandLang-RTM-X64-*" -and $_.Title -notlike "*JPN*"}
# Write-Host "*** 64ビット版 Windows 10 Lang Pack (Language Features) Feature On Demand (日本語以外) をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "KB3180033-Win10FeatureOnDemandLang-RTM-TH2RTM-*-TSL-CHT"
# Write-Host "*** 台湾向け Windows 10 Feature On Demand をフィルターに追加しました"


#製品と分類でWindows 10ドライバーを選択した場合
# $FilteredUpdates += $AllUpdates | Where ProductTitles -eq "Windows 10 and later drivers"
# $FilteredUpdates += $AllUpdates | Where ProductTitles -eq "Windows 10 and later upgrade & servicing drivers"
# $FilteredUpdates += $AllUpdates | Where ProductTitles -eq "Windows 10 Anniversary Update and Later Upgrade & Servicing Drivers"
# $FilteredUpdates += $AllUpdates | Where ProductTitles -eq "Windows 10 Anniversary Update and Later Servicing Drivers"
# $FilteredUpdates += $AllUpdates | Where ProductTitles -eq "Windows 10 Anniversary Update Server and Later Servicing Drivers"
# Write-Host "*** Windows 10 用ドライバー をフィルターに追加しました"


#Office 製品の選択をした場合
# $FilteredUpdates += $AllUpdates | Where {$_.Title -like "*64 ビット版*" -and $_.Title -notlike "*32 ビット版*" -and $_.ProductTitles -eq "Office 2016"}
# Write-Host "*** 64ビット版 Office 2016 をフィルターに追加しました"


#Windows 7
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "WINDOWS7CLIENT-*-X86-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "WINDOWS7CLIENT-*-X64-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "WINDOWS6-1-*-X86-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "WINDOWS6-1-*-X64-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-Partner-X64-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-Partner-X86-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-RTM-X86-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-RTM-X64-*"
# Write-Host "*** Windows 7 RTM をフィルターに追加しました"

##$FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-SP1-X86-*"
##$FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win7-SP1-X64-*"
##Write-Host "*** Windows 7 SP1 をフィルターに追加しました"

#.Net Framewok
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "NDP4.0*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "NDP40*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "Net4Client_*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-DOTNET40-X64-TSL"
# Write-Host "*** .NET Framework 4.0 をフィルターに追加しました"

# $FilteredUpdates += $AllUpdates | Where LegacyName -like "IE10-RTM-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "IE9-RTM-*"
# Write-Host "*** Internet Explorer 10, 9 をフィルターに追加しました"

#Windows 8.1
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win8.1-RTM-X86-TSL"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-Win8.1-RTM-X64-TSL"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-WinBlue-Partner-X86-*"
# $FilteredUpdates += $AllUpdates | Where LegacyName -like "*-WinBlue-Partner-X64-*"
# Write-Host "*** Windows 8.1 をフィルターに追加しました"


Write-Host
Write-Host "** 指定されたフィルターに該当する更新プログラムを拒否"
$FilteredUpdates | Foreach-Object {
    #デバッグするときは下の1行を外します
    $_.Decline()
    #拒否した一覧が不要な場合はコメントアウトしてください
    Write-Host "*** 拒否済み: " $_.Title
}

Write-Host
Write-Host "* クリーンアップ"
$Wsus | Invoke-WsusServerCleanup -CleanupObsoleteUpdates -CleanupUnneededContentFiles -CompressUpdates -DeclineExpiredUpdates

Write-Host
Write-Host "* 更新プログラムの一覧"
#Write-Host "** 拒否された更新以外のすべて"
#$Wsus.GetUpdates() | Where IsDeclined -eq $False | Foreach-Object {
#    Write-Host "*** 拒否された更新以外のすべて: " $_.Title
#}

#Write-Host
#Write-Host "** 承認済みの更新プログラム"
#$Wsus.GetUpdates() | Where {$_.IsDeclined -eq $False -and $_.IsApproved -eq $True} | Foreach-Object {
#    Write-Host "*** 承認済みの更新プログラム: " $_.Title
#}

Write-Host
Write-Host "** 未承認の更新プログラム"
$Wsus.GetUpdates() | Where {$_.IsDeclined -eq $False -and $_.IsApproved -eq $False} | Foreach-Object {
    Write-Host "*** 未承認の更新プログラム: " $_.Title
}

#デバッグ用
#$Wsus.GetUpdates() | Where IsDeclined -eq $False | Select LegacyName, Title | Format-Table -AutoSize
#$Wsus.SearchUpdates("Windows 10") | Where IsDeclined -eq $False | Select LegacyName, Title | Format-Table -AutoSize

Pause