Windows 11で「システムの再起動時に指定した日数を超えるユーザープロファイルを削除する」GPOを有効にすると、次回再起動時に期限条件を満たすプロファイルがUser Profile Serviceによって自動削除されます。このGPOには、管理者が承認したSIDだけを除外する機能、削除前のdry-run一覧、1回の最大削除件数がありません。そのため、期限超過した全プロファイルを削除してよい端末グループにだけ使います。利用者が混在するPCではGPOを使わず、承認済みSIDを1件ずつ処理する別ワークフローにします。
一覧をレビューしてもGPOの削除対象は変わりません。レビュー結果に保護対象が1件でも含まれる端末は、その端末をGPO対象から外す必要があります。GPO適用後にCSVから行を消してもSID除外にはなりません。
GPOができること、できないこと
設定場所はComputer Configuration → Administrative Templates → System → User Profiles → Delete user profiles older than a specified number of days on system restartです。MicrosoftのPolicy CSP資料では、1日は対象プロファイルへアクセスしてから24時間として解釈され、設定日数以上使用されていないプロファイルを次回再起動時に削除します。無効または未構成なら、このポリシーによる自動削除は行いません。
- 端末単位のComputer Configurationであり、利用者ごとのGPOではない。
- 日数の閾値は一つで、保護するSIDの許可リスト/拒否リストは持たない。
- 削除予定だけを表示するdry-runモードは持たない。
- 再起動1回あたりの最大削除件数を指定できない。
- 削除前に管理者へ一件ずつ確認するプロンプトは出さない。
- 削除済みプロファイルをGPO無効化だけで復元する機能はない。
この制約から、学校の実習端末、コールセンターの固定用途端末、非永続的な共有端末など、期限を超えたすべての通常プロファイルを消してよい同質なデバイス群だけを専用OUまたはデバイスグループへ分けます。役員PC、開発者PC、オフライン勤務PC、ローカルデータ保持端末、用途不明の共有PCを同じGPOへ含めません。
プロファイル年齢をフォルダー日時だけで決めない
Windows 10、Windows Server 2019以降では、プロファイルの最終使用を示すレジストリのタイムスタンプが使われ、古いOSでNTUSER.DATのNTFS日時を使う方式より信頼性が高いとMicrosoftは説明しています。フォルダーのLastWriteTimeやNTUSER.DATだけを並べても、ソフトウェアがユーザーハイブを読み込んだ影響や同期処理により実際の対話利用と一致しないことがあります。Win32_UserProfileのSID、LocalPath、Loaded、Special、LastUseTimeと、Microsoft提供サンプルのレポート結果を併用します。
Get-CimInstance -ClassName Win32_UserProfile |
Select-Object SID,LocalPath,Loaded,Special,LastUseTime,RoamingConfigured,RoamingPreference |
Sort-Object LastUseTime
これは読み取り専用の棚卸しです。期待結果は端末上のプロファイルがSIDとパスで対応し、LoadedとSpecialを識別できることです。SIDが解決できない、LastUseTimeが空、同じ利用者の別パスがある、Loaded=True、Special=True、FSLogixのローカルプロファイルかコンテナか不明な行は自動削除の判断材料として不足しています。期限超過とみなさず、端末所有者へ確認します。
OneDrive・FSLogix・ドメイン・オフラインデータの確認
OneDrive Files On-Demandでは、オンラインのみ、ローカル利用可能、常にこのデバイス上に保持という状態が混在します。クラウドにあることと、デスクトップ、ダウンロード、アプリデータ、PST、秘密鍵、未同期ファイルまでバックアップ済みであることは同じではありません。同期エラー、未ログイン、別テナント、保留中ファイルを確認し、ローカル専用データを承認済みバックアップへ退避して復元試験します。
FSLogix Profile ContainerまたはODFC Containerを使う端末では、C:\Users配下の見かけだけでデータ所在を判断しません。コンテナVHD/VHDX、Cloud Cacheのプロバイダー、セッションの切断状態、DeleteLocalProfileWhenVHDShouldApplyなどFSLogix自身の設定を運用担当と確認します。ローカルプロファイル削除がコンテナの整理になるとは限らず、逆にローカルキャッシュだけにあるセッションデータを失う組み合わせもあります。
ドメインアカウントのプロファイルを削除すると、次回サインイン時に新しいローカルプロファイルが作られ、端末固有の設定、証明書、キャッシュ、オフラインファイル、アプリ状態が戻らない場合があります。キャッシュされたドメイン資格情報があることはプロファイルデータのバックアップを意味しません。長期出張や在宅でドメインへ接続していない利用者、休職者、障害対応用アカウントも最終使用日だけで判断しません。
GPOを使える端末グループの判定
- 専用OUの全端末で棚卸しを実行し、期限を超える各SIDの利用者、用途、データ所有者を確認する。
- 期限超過プロファイルを一件残らず削除してよい端末だけをGPO候補にする。保護対象が一件あれば端末ごと候補から外す。
- OneDrive同期、FSLogix、Offline Files、ローミングプロファイル、ローカル専用データ、暗号化証明書の有無を確認する。
- 代表端末でバックアップと復元を試し、次回サインインで業務アプリが再構成できることを確認する。
- パイロット端末数、削除日数、再起動時刻、最大起動遅延、停止条件を承認する。

GPO候補リストは端末単位です。「このSIDは残す」というレビュー表を作ってもGPOは読みません。混在端末を専用OUへ残しながら特定SIDだけ守る設計は不成立です。その端末は次節のSID単位手順へ回します。
同質な端末だけへGPOをパイロットする
たとえば60日を採用する場合も、組織の休職、長期出張、学期、災害時オフライン期間より十分長いかを決めます。専用GPOを作成し、パイロットOUの数台だけへリンクします。設定をEnabledにして日数を入力し、gpresultでWinning GPOを確認します。再起動前に棚卸し結果とバックアップ完了を再確認し、利用者がサインアウトした保守時間に再起動します。
gpupdate /target:computer /force
gpresult /scope computer /h "%TEMP%\ProfileCleanup-GPResult.html"
Get-CimInstance -ClassName Win32_UserProfile |
Select-Object SID,LocalPath,Loaded,Special,LastUseTime
期待結果はgpresultに専用GPOと設定日数が表示され、再起動後に期限条件を満たす通常プロファイルが削除され、期限内・Loaded・SpecialのプロファイルとOSが正常であることです。削除中は起動時間が延び、次回サインインでは新プロファイル作成とアプリ再初期化で時間が増える場合があります。最大許容時間を超える、対象外が消える、予定対象が残る、一時プロファイルになる、業務アプリが使えない場合は失敗です。リングを広げずロールバックします。
ポリシーが適用済みでも削除されない場合、MicrosoftはSCCMまたは第三者製品がWMIでUser Data and Profilesを管理し、GPOより優先する場合を案内しています。ConfigurationControlsのRoamingUserProfile、FolderRedirection、OfflineFilesを読み取り、値1なら管理元を確認します。値を手作業で消して回避せず、Configuration Managerまたは製品所有者と設定を調整します。

混在端末は承認済みSIDを一件ずつ処理する
混在端末ではGPOを未構成に保ち、まずMicrosoftのADDelProf.ps1サンプルを-Deleteなしで実行して候補を報告します。このサンプルは既定で報告のみ、-Deleteを指定した場合だけ削除し、未ロードかつSpecialではないプロファイルを対象にします。ただしMicrosoft標準サポート対象外のAS ISサンプルであり、これ自体にも「承認CSVどおり最大2件だけ」という組織固有のゲートはありません。出力をSIDで照合し、削除実行は別の承認手順に分けます。
# Microsoftサンプルを保存した管理端末で候補だけを表示する例
.\ADDelProf.ps1 -Days 60
# OS標準クラスで現在状態を再確認する
$ApprovedSids = @('S-1-5-21-111111111-222222222-333333333-1107')
$MaximumDeletes = 1
$Targets = Get-CimInstance Win32_UserProfile |
Where-Object { $ApprovedSids -contains $_.SID }
if ($Targets.Count -gt $MaximumDeletes) { throw '承認済み最大件数を超えたため中止' }
if ($Targets | Where-Object { $_.Loaded -or $_.Special }) { throw 'LoadedまたはSpecialのため中止' }
$Targets | Select-Object SID,LocalPath,Loaded,Special,LastUseTime
ここまでがdry-runです。期待出力は、承認票と同じSIDだけが最大1件表示され、Loaded=False、Special=False、LocalPathと利用者が一致することです。0件、複数件、パス不一致、LastUseTime不明、承認票にないSID、Loaded/Specialなら削除しません。最大件数はGPOの機能ではなく、この個別ワークフローが異常な承認入力を止めるための運用ゲートです。
データ所有者がバックアップからファイルを開けることを確認し、利用者がサインアウトした保守時間に、承認したSIDのWin32_UserProfileオブジェクトだけを一件ずつRemove-CimInstanceで削除します。フォルダーを直接消すとProfileListなどの登録が残るため採用しません。各件で確認プロンプト、削除後の再照会、OS再起動、対象利用者の新規サインインとデータ復元を終えてから次のSIDへ進みます。
$Target = Get-CimInstance Win32_UserProfile |
Where-Object { $_.SID -eq 'S-1-5-21-111111111-222222222-333333333-1107' }
$Target | Select-Object SID,LocalPath,Loaded,Special,LastUseTime
# 承認番号・バックアップ復元確認・Loaded=False・Special=Falseを再確認後だけ実行
$Target | Remove-CimInstance -Confirm
削除後は同じSIDでGet-CimInstanceを再実行し0件になること、旧LocalPathがプロファイルとして残らないこと、他のSIDが変化していないことを確認します。次回サインインで新プロファイルが作成され、業務アプリ、OneDrive/FSLogix、証明書、プリンター、オフラインデータを利用者と確認します。一つでも失敗したら残りの承認SIDを処理しません。
ロールバックと復旧
GPOの予防的ロールバックは、専用GPOをNot ConfiguredにするかパイロットOUのリンクを外し、対象端末を再起動する前にgpresultで非適用を確認することです。これで将来の自動削除は止められますが、既に削除されたプロファイルは戻りません。削除後の復旧は、新しいプロファイルを作成し、承認済みバックアップから利用者データ、アプリ設定、証明書を所定の方法で戻します。FSLogixはコンテナのバックアップと製品手順、OneDriveは正しいアカウントと同期状態を使います。
復旧の期待値は、正しいSIDでサインインでき、TEMPプロファイルではなく、復元対象ファイルを開け、OneDrive/FSLogix同期と主要アプリが正常であることです。バックアップが開けない、暗号化ファイルの鍵がない、FSLogixコンテナがマウントできない、ドメインへ接続できず初回プロファイルを作れない場合は失敗です。追加削除を止め、データ保護、ID、VDI担当へ引き継ぎます。

コメント