運用を開始して、2年ほどたったWindows Server 2019のサーバの再起動に、20~30分程度かかってしまう現象が出ていました。

原因は、レジストリの肥大化でした。

 

下記に保存されているキーの数が膨大すぎて、GUIでは開けない。

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles

 

  • 環境要因

問題が発生しているサーバは、Citrix XenAppのSBCサーバで、複数のユーザがログインします。

ログインのたびに、プリンタサーバの共有プリンタをマウントしているのですが、

上記のレジストリに、プリンタドライバーのキーが大量に生成されていました。

 

上記レジストリを格納しているファイル

 C:\Windows\System32\config\SOFTWARE

このキャプチャした環境だと、ファイルサイズが、1GBを超えています。

 

 

 

  • 対処
手動でちまちま削除はできないので、スクリプトを書いて、自動処理させましょう。
 ※バックアップは、必ず、実施しておいてください。
 管理者でもそのままでは削除できないキーだったので、SYSTEM権限で削除しました。
 

1 PSEXECを使って、Powershellを起動。SYSTEM権限で実行する。

C:\Users\nouka> psexec -i -s powershell

 以下のスクリプトは、SYSTEM権限のPowershell内で実行
2 レジストリのエクスポート。この後、削除対象のキーを限定するのに使います。
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles C:\SOFTWARE_PnpLockdownFiles.reg
 
3 spoolキーワードが入っているキーのみ削除。
Get-Content "C:\SOFTWARE_PnpLockdownFiles.reg" |select-string "spool" | % { `
$path = ($_.ToString().Replace("[",'').Replace("]",""));
reg delete $path /f
}
 
この手順でレジストリは削除されて、OSの起動も1~2分に戻りました。
ただ、レジストリファイルは収縮されないので、
ファイル自体を圧縮する場合は、別途手段が必要です。
私の案件では実施しませんでしたが、手順だけ調べたので、メモしておきます。
 
1 WindowsのインストールISOなどを使って、PE起動する。
2 Shift+F10などで、cmd起動
3 regeditを起動し、C:\Windows\System32\config\SOFTWAREをハイブ読み込み。
4 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFilesを保存。
 保存するときは、ハイブ形式。
 
5 ハイブのアンロード。できないときは、PE再起動。
6 C:\Windows\System32\config\SOFTWAREと、エクスポートしたファイルをスワップ。
 
 
 
 
  • 予後
レジストリを削除して、2~3週間運用しましたが、まったくトラブルは発生していない。
なんためのレジストリキーなのかは調査できていません。