Windows Server 2016 および 2019 における Windows ファイアウォール規則の肥大化について

Last Update: feedback 共有

本記事はマイクロソフト社員によって公開されております。

本記事は 2018 年 10 月 24 日に Windows Server 2016 および 2019 における Windows ファイアウォール ルールの肥大化について に公開された記事、および 2019 年 3 月 7 日に Windows Server 2016 および 2019 における Windows ファイアウォール ルールの肥大化について に公開された記事の最新版になります。

こんにちは。Windows プラットフォーム サポートの丸山です。

今回は、Windows Server 2016、Windows Server 2019 および Windows 10 にて UWP アプリケーションに関する Windows ファイアウォールの規則、および Windows Notification Framework (WNF) と呼ばれる機能に関するレジストリ値が大量に登録されが登録され、肥大化する問題についてご紹介します。

事象 - Symptom

リモート デスクトップ環境など、多くのユーザーが繰り返しログオン、ログオフする環境において、UWP アプリケーションに関する Windows ファイアウォールの規則が大量に登録される、あるいは Windows Notification Framework (WNF) と呼ばれる機能に関するレジストリ値が大量に登録されることにより、以下のような事象が発生することが報告されております。

  • スタート メニューまたは検索ウィンドウ、Cortana を開くことができない
  • ログイン時に黒い画面のまま、デスクトップの表示までに時間がかかる
  • パフォーマンスの劣化
  • サーバーがハング
  • Internet Explorer を起動できない

この事象は、主に Remote Desktop Service が有効化された Windows Server 2016 環境、Windows Server 2019 環境のほか、VDI として構築された Windows 10 環境でも発生する可能性があります。

また、本問題の発生時には、以下のようなイベントが記録されます。

Source: Microsoft-Windows-AppModel-Runtime
Date:
Event ID: 21
Task Category: None
Level: Error
Keywords: (70368744177664),AppContainer
Description: CreateAppContainerProfile failed for AppContainer Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy with error 0x800705AA.

Source: Microsoft-Windows-AppModel-Runtime
Date:
Event ID: 21
Task Category: None
Level: Error
Keywords: (70368744177664),AppContainer
Description: CreateAppContainerProfile failed for AppContainer Microsoft.Windows.Cortana_cw5n1h2txyewy with error 0x800705AA.

※ Microsoft-Windows-AppModel-Runtime の ID 21 のイベントが記録され、エラー コードとして、0x800705AA が記録されていることがポイントでございます。

※ 本事象は、Windows 8.1 や Windows Server 2012、Windows Server 2012 R2 環境にてストア アプリを利用している場合にも発生する可能性があります。

※ 本事象は、Windows Server 2022 および Windows 10 version 2004 以降のバージョンでは発生いたしません。

条件 - Condition

ユーザーがログオフするタイミングでユーザー プロファイルが削除され、次回ログオン時にユーザー プロファイルが新規で作成される環境で発生します。特に以下のような環境が該当します。

パターン 1: 移動ユーザー プロファイルを使用し、且つ以下のポリシーを設定している場合

+ [コンピューターの管理]
+ [管理用テンプレート]
+ [システム]
+ [ユーザー プロファイル]
+ [一時記憶された移動プロファイルのコピーを削除する]

※上記ポリシーが適用されていない場合にも、定期的にプロファイルのキャッシュの削除が行われている環境が該当します。

パターン 2 : Remote Desktop Service 環境にて、User Profile Disk (UPD) を使用している場合

User Profile Disk (UPD) を利用している環境では、ログオフ時にプロファイルの削除が行われませんが、ログオン時に UWP アプリケーションに関する Windows ファイアウォールの規則の登録、WNF に関するレジストリ値の登録が行われます。

パターン 3 : その他、ログオンの都度ユーザープロファイルの割り当てが行われる場合

VDI 基盤など、仮想化製品の動作により、ログオンの都度ユーザープロファイルの割り当てが行われる場合には、本事象が発生することがございます。

原因 - Cause

本事象は、Windows では、ユーザー プロファイルの新規作成時に UWP アプリケーションに関する Windows ファイアウォールの規則の登録、および WNF に関するレジストリ値の登録が行われますが、ユーザー プロファイルの削除時にはそれらの情報が削除されないことにより発生いたします。

これにより、移動プロファイル環境や、VDI 環境など、ログオン時に都度ユーザー プロファイルが割り当てられる環境では、ログオンの度に UWP アプリケーションに関する情報が重複して追加され、以下のレジストリが肥大化していきます。

  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Notifications

※ OS のバージョン、導入いただいておりますソフトウェアの違いなどにより、肥大化するレジストリ キーや、その程度は変化いたします。

対処策 - Resolution

本件に対処するためには、肥大化したレジストリ値の削除を実施いただき、更新プログラムを適用の上、必要に応じて DeleteUserAppContainersOnLogoff レジストリ値を設定してください。

また、固定プロファイルをお使いでございます場合には、追加で [一時プロファイルのコピーを削除する] のポリシーを有効にしてください。

事情があり、更新プログラムの適用が出来ない場合には、肥大化したレジストリ値の削除を定期的に実施いただくことをご検討ください。

1. 肥大化してしまったレジストリ値の削除について

後述の更新プログラムを適用いただき、必要に応じて DeleteUserAppContainersOnLogoff レジストリ値を設定いただくことで、Windows ファイアウォールの規則はユーザーがログオン、ログオフする都度すこしずつ削除されるようになりますが、ファイアウォールの規則の肥大化が起きている環境におきましては、DeleteUserAppContainersOnLogoff レジストリ値を設定しますと、ログオフの処理に遅延が生じるようになることが報告されております。

また、レジストリ設定後も、対象の環境にログオンしていないユーザーに紐付いたファイアウォールの規則は自動的に削除されず、更新プログラムの適用よりも前に肥大化してしまった Notifications キー配下のレジストリ値の削除が行われません。

このため、レジストリ情報の肥大化が発生しております場合には、以下の PowerShell スクリプトを [管理者として実行] いただき、まずは肥大化したレジストリ値の削除を実施のうえ、コンピューターを再起動してください。

deleterules.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Delete HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System
if( Test-Path HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System )
{
$rules = Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System
$i = 0
$count = $rules.ValueCount
foreach( $rule in $rules.GetValueNames() )
{
Write-Progress -Activity "Deleting 1 of 3" -percentComplete (($i += 100) / $count)
if( $rules.GetValue($rule).Contains('AppPkgId=S-1-15-2') )
{
# Faster than Remove-ItemProperty command.
REG.EXE DELETE HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System /V $rule /F
}
}
}

# Delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules
if( Test-Path HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules )
{
$rules = Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules
$i = 0
$count = $rules.ValueCount
foreach( $rule in $rules.GetValueNames() )
{
Write-Progress -Activity "Deleting 2 of 3" -percentComplete (($i += 100) / $count)
if( $rules.GetValue($rule).Contains('AppPkgId=S-1-15-2') )
{
# Faster than Remove-ItemProperty command.
REG.EXE DELETE HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules /V $rule /F
}
}
}

# Delete HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
if( Test-Path HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules )
{
$rules = Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
$i = 0
$count = $rules.ValueCount
foreach( $rule in $rules.GetValueNames() )
{
Write-Progress -Activity "Deleting 3 of 3" -percentComplete (($i += 100) / $count)
if( $rules.GetValue($rule).Contains('AppPkgId=S-1-15-2') )
{
# Faster than Remove-ItemProperty command.
REG.EXE DELETE HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules /V $rule /F
}
}
}

# Delete HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Notifications
if( Test-Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Notifications" )
{
REG.EXE DELETE "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Notifications" /VA /F
}

本スクリプトは、Windows ファイアウォールの規則に関するレジストリ情報を取得した上で、UWP アプリケーションに関する Windows ファイアウォールの規則のみを抽出し、削除することで、回避策の実施によるシステムへの影響を最小限にとどめることを意図しております。

また、肥大化した Notifications キー配下の情報を削除しつつ、/VA オプションの付与によりサブ キー配下の値は削除しないことで、回避策の実施によるシステムへの影響を最小限にとどめることを意図しております。

※ Windows Server 2016 および Windows 10 Enterprise LTSC 2016 における注意事項について

Windows Server 2016 および Windows 10 Enterprise 2016 LTSB 環境では、Notifications キー配下の値を削除しますと、ローカル プロファイルが残されているユーザーにおいてスタート ボタンが効かなくなる問題が確認されております。

Notifications キー配下の値の削除により、スタート メニューが開けなくなってしまったユーザーにおきましては、プロファイルを再作成するか、各ユーザー権限にて以下のコマンドを実行し、復旧してください。

1
tdlrecover.exe -reregister

※ Windows Server 2019 および Windows 10 Enterprise 2019 LTSC および Windows 10 version 1803 以降の環境における注意事項について

Windows Server 2019 および Windows 10 Enterprise 2019 LTSC および Windows 10 version 1803 以降の環境では、Notifications キー配下にある、Data サブ キー配下の値を削除してしまいますと、タスク スケジューラに登録されているタスクが実行されなくなることがある問題が確認されております。

Data サブ キー配下の値の削除により、タスク スケジューラに登録されているタスクが実行されなくなってしまった環境におきましては、管理者として実行されたコマンドプロンプトより以下のコマンドを実行し、対処してください。

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Notifications\Data" /V 41960B29A3BC0C75 /T REG_BINARY /D 0300000001000000  

本 BLOG にて紹介しております PowerShell スクリプトでは、REG DELETE コマンドに /VA オプションを付与しており、サブ キーの削除を行いませんので、この問題は発生しません。

2. 更新プログラムの適用

肥大化したレジストリ値の削除を実施いただきましたら、各 OS バージョン毎に、以下の KB 番号よりも新しい更新プログラムを適用してください。

Windows Server 2016 および Windows 10 Enterprise LTSC 2016

KB4550947 以降の更新プログラムを適用してください。

2020 年 4 月 21 日 - KB4550947 (OS ビルド 14393.3659)
https://support.microsoft.com/ja-jp/help/4550947/windows-10-update-kb4550947

※過去には、KB4467684 の更新プログラムをご案内しておりましたが、KB4550947 以降の更新プログラムでは、追加で Notifications キー配下のレジストリ値がリークする問題に対する修正が含まれております。

※更新プログラムの適用後はプロファイルの削除時に UWP に関する Windows ファイアウォールの規則が削除されるよう、以下のレジストリ値を設定します。

キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy
名前 : DeleteUserAppContainersOnLogoff
種類 : REG_DWORD
値 : 1 ※ユーザー プロファイル削除時に Windows ファイアウォールの規則を削除します。

Windows 10 version 1709

Windows 10 version 1709 以前の環境につきましては、本件に対する更新プログラムのご用意がございません。Windows 10 version 20H2 以降の環境への移行をご検討ください。

Windows 10 version 1803

DeleteUserAppContainersOnLogoff レジストリ値を設定の上、KB4493437 以降の更新プログラムを適用することにより、Windows ファイアウォールの規則の肥大化を抑止できますが、WNF に関するレジストリの肥大化を防ぐことは出来ません。Windows 10 version 20H2 以降の環境への移行をご検討ください。

2019 年 4 月 26 日 — KB4493437 (OS ビルド 17134.753)
https://support.microsoft.com/ja-jp/help/4493437/windows-10-update-kb4493437

※更新プログラムの適用後はプロファイルの削除時に UWP に関する Windows ファイアウォールの規則が削除されるよう、以下のレジストリ値を設定します。

キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy
名前 : DeleteUserAppContainersOnLogoff
種類 : REG_DWORD
値 : 1 ※ユーザー プロファイル削除時に Windows ファイアウォールの規則を削除します。

Windows Server 2019 および Windows 10 Enterprise 2019 LTSC および Windows 10 version 1809

KB4571748 以降の更新プログラムを適用してください。

2020 年 8 月 20 日 KB4571748 (OS ビルド 17763.1432) プレビュー
https://support.microsoft.com/ja-jp/help/4571748/windows-10-update-kb4571748

※過去には、KB4490481 の更新プログラムをご案内しておりましたが、KB4550969 以降の更新プログラムでは、追加で Notifications キー配下のレジストリ値がリークする問題に対する修正が含まれております。

※また、KB4571748 以降の更新プログラムでは、固定プロファイル環境下において Notifications キー配下のレジストリ値がリークする問題に対する修正が含まれております。

※更新プログラムの適用後はプロファイルの削除時に UWP に関する Windows ファイアウォールの規則が削除されるよう、以下のレジストリ値を設定します。

キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy
名前 : DeleteUserAppContainersOnLogoff
種類 : REG_DWORD
値 : 1 ※ユーザー プロファイル削除時に Windows ファイアウォールの規則を削除します。

Windows 10 version 1903 および Windows 10 version 1909

KB4559004 以降の更新プログラムを適用してください。

2020 年 7 月 21 日—KB4559004 (OS ビルド 18362.997 および 18363.997) プレビュー
https://support.microsoft.com/ja-jp/help/4559004/windows-10-update-kb4559004

※ Windows 10 version 1903 環境以降では、DeleteUserAppContainersOnLogoff レジストリ値の設定は不要でございます。

Windows Server 2022 および Windows 10 version 2004 以降

製品出荷時より修正が含まれておりますので、更新プログラムの適用、および DeleteUserAppContainersOnLogoff レジストリ値の設定は不要でございます。

3. [一時プロファイルのコピーを削除する] のポリシーを有効にする

固定プロファイルをお使いでございます場合には、追加で [一時プロファイルのコピーを削除する] のポリシーを有効にしてください。

+ [コンピューターの管理]
+ [管理用テンプレート]
+ [システム]
+ [ユーザー プロファイル]
+ [一時記憶された移動プロファイルのコピーを削除する]

※固定プロファイルをお使いではない場合、本手順の実施は不要です。

4. PowerShell によるファイアウォールの規則の削除が出来ない場合

PowerSehll スクリプトがエラーになる、実行の非常に時間がかかる場合など、PowerShell による規則の削除が出来ない状況でございます場合には、以下手順の実施をご検討ください。

※ “1. 肥大化してしまったレジストリ値の削除について” を実施済みの場合、本手順の実施は不要です。

  1. クリーン インストールされた同一バージョンの OS をご用意いただき、以下のコマンドにて Windows ファイアウォールの規則をエクスポートします。
1
netsh advfirewall export [ファイルの配置先]\[ファイル名]

コマンド例:

1
netsh advfirewall export \\server\share\firewall.wfw
  1. 問題が起きている環境にて、以下のコマンドを実行し、レジストリ値を削除します。
1
2
3
4
REG DELETE "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Notifications" /VA  
REG DELETE "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules" /VA
REG DELETE "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\Configurable\System" /VA
REG DELETE "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\RestrictedServices\AppIso\FirewallRules" /VA

※ OS バージョンの違いにより、上記のレジストリ キーの一部は存在しない場合がございます。

  1. 問題が起きている環境にて、コンピューターを再起動します。
  2. 手順 1. にてエクスポートした Windows ファイアウォールの規則を、問題が起きている環境にインポートします。
1
netsh advfirewall import [ファイルの配置先]\[ファイル名]

コマンド例:

1
netsh advfirewall import \\server\share\firewall.wfw

上記手順により、Windows ファイアウォールの規則が既定の構成に戻り、肥大化した状態が一時的に解消されます。

※ 更新プログラムの適用、ならびに DeleteUserAppContainersOnLogoff のレジストリ値が適用されていない場合、再度肥大化が発生いたしますので、定期的に本手順の実施が必要になります。

※ 本手順の実施により、ファイアウォールの規則はすべて既定値に戻り、カスタマイズされた内容は失われてしまいますので、必要に応じてファイアウォールの規則の再設定をお願いします。

更新履歴 - Update History

  • 2018/10/24 : 本 Blog の公開
  • 2018/10/31 : Windows Server 2019 について追記
  • 2018/11/29 : Windows Server 2016 の更新プログラム追加によるResolutionを記載しました。
  • 2019/07/05 : 対処方法について一部追加
  • 2019/07/17 : 対処方法について一部追加
  • 2020/04/22 : 対処方法について一部追加
  • 2020/10/08 : 対処方法について一部追加、体裁の見直しなど
  • 2020/11/13 : 対処方法について一部追加
  • 2021/10/04 : 対処方法について一部追加、変更
  • 2021/12/27 : 対処方法について一部変更
  • 2022/02/07 : 対処方法について一部変更、Windows Server 2022 について追記
  • 2022/08/16 : レジストリ値を削除する PowerShell スクリプトを高速化しました
  • 2022/08/23 : 対処方法について一部変更
  • 2022/09/26 : 対処方法について一部変更