GPOとPowerShellを使ってWindowsの古いユーザープロファイルを自動削除する方法
Windowsのワークステーションやサーバー、特にRDS(Remote Desktop Services)サーバーでは、C:\Usersから古い(未使用の)ユーザープロファイルを削除する作業が定期的に発生します。リモートデスクトップサーバーの最大の課題は、ローカルドライブ上のユーザープロファイルディレクトリのサイズが絶えず増大し続けることです。この問題は、FSRMやNTFSクォータを使ってユーザープロファイルの最大サイズに上限を設定することで部分的に解決できます。しかし、ターミナルサーバーのユーザー数が多い場合、時間の経過とともにC:\Usersディレクトリには、もはや不要となったユーザープロファイルのフォルダが大量に蓄積されてしまいます。
Windowsでユーザープロファイルを手動で削除する方法
多くのWindows管理者の初心者は、C:\Usersからユーザープロファイルフォルダを直接削除しようとしがちです。フォルダを手動で削除した後、レジストリキー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList から、そのフォルダへのリンクを含むユーザープロファイルのエントリを削除すれば、一応動作します。
ただし、Windowsでユーザープロファイルを正しく手動削除する正式な手順は以下の通りです。まず「システムのプロパティ」を開き、「システムの詳細設定」→「ユーザープロファイル」→「設定」の順に進みます。リストから対象ユーザーを選択し(「サイズ」列にローカルドライブ上のプロファイルサイズが表示されます)、「削除」ボタンをクリックします。

しかしこれはあくまで手動の方法です。運用を効率化するには、自動化を検討する価値があります。
GPOで指定日数より古いユーザープロファイルを削除する
Windowsには、指定した日数より古いユーザープロファイルを自動的に削除するためのグループポリシーが組み込まれています。ポリシー「システムの再起動時に指定した日数より古いユーザープロファイルを削除する」は、GPOの 「コンピューターの構成」→「管理用テンプレート」→「システム」→「ユーザープロファイル」 セクションにあります。このポリシーは、ローカルグループポリシーエディター(gpedit.msc)またはGPMC.mscを使ったドメインポリシーで有効化できます。
ポリシーを有効にし、ユーザープロファイルをアクティブとみなす日数を指定します。この期間を過ぎると、Windowsのユーザープロファイルサービスが次回の再起動時に自動的にプロファイルを削除します。ここでは45〜90日程度の期間を指定することをお勧めします。

このポリシーを使用する際は、サーバーのシャットダウンや再起動時にシステム時刻に問題がないことを必ず確認してください。時刻に異常があると、アクティブなユーザープロファイルまで削除される恐れがあります。
この自動削除方法の主なデメリットは、サーバーの再起動を待つ必要がある点と、選択性がない点です(ローカルアカウントや管理者アカウントなど、特定のユーザープロファイルの削除を除外できません)。また、サードパーティ製ソフトウェア(多くはウイルス対策ソフト)がユーザープロファイル内のNTUSER.DATファイルにアクセスして最終使用日を更新している場合、このポリシーが正しく機能しないことがあります。
PowerShellスクリプトで古いユーザープロファイルを削除する
上記の自動クリーンアップポリシーの代わりに、シンプルなPowerShellスクリプトを使って、無効または非アクティブなユーザーのプロファイルを検索・削除することもできます。
まず、以下のスクリプトでC:\Users内のすべてのユーザープロファイルフォルダのサイズを計算してみましょう。
gci -force 'C:\Users' -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
$sum = $sum + $len
}
"プロファイルの合計サイズ",'{0:N2} GB' -f ($sum / 1Gb)
この例では、C:\Users内のすべてのユーザープロファイルの合計サイズは31.5GBでした。

次に、60日以上使用されていないユーザーのリストを表示します。対象を特定するには、プロファイルのLastUseTimeフィールドの値を利用します。
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}| Measure-Object
この例では、RDSホスト上に127個の非アクティブなユーザーアカウント(プロファイル合計サイズ約18GB)が存在することが判明しました。

これらのプロファイルをすべて削除するには、ユーザーリストを Remove-WmiObject コマンドにパイプで渡すだけです(スクリプト実行前に、–WhatIfパラメータを使って出力を必ず確認することをお勧めします)。
Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-30))} | Remove-WmiObject –WhatIf
SystemやNetwork Serviceなどのシステムアカウント、ローカル管理者アカウント、アクティブなセッションを持つユーザーなど、削除対象から除外したいアカウント(除外リスト)がある場合は、スクリプトを次のように変更します。
#削除してはならないアカウントの除外リスト
$ExcludedUsers ="Public","zabbix_agent","svc","user_1","user_2"
$LocalProfiles=Get-WMIObject -class Win32_UserProfile | Where {(!$_.Special) -and (!$_.Loaded) -and ($_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-60))}
foreach ($LocalProfile in $LocalProfiles)
{
if (!($ExcludedUsers -like $LocalProfile.LocalPath.Replace("C:\Users\","")))
{
$LocalProfile | Remove-WmiObject
Write-host $LocalProfile.LocalPath, "プロファイルを削除しました" -ForegroundColor Magenta
}
}
このPowerShellスクリプトは、シャットダウン時に実行するGPOとして、またはタスクスケジューラに登録したPowerShellスクリプトとして実行できます。
注意: プロファイルの自動削除を設定する前に、必ず自身の環境でスクリプトをテストしてください。
ADグループを基準にプロファイルを削除する方法
特定のADグループ(例:DisabledUsersグループ)に追加されたすべてのユーザーのプロファイルを自動的に削除するように、スクリプトを変更することもできます。
$users = Get-ADGroupMember -Identity DisabledUsers | Foreach {$_.Sid.Value}
$profiles = Get-WmiObject Win32_UserProfile
$profiles | Where {$users -eq $_.Sid} | Foreach {$_.Delete()}
この方法を使えば、無効化したユーザーアカウントをADグループに追加するだけで、そのプロファイルを確実にクリーンアップできます。RDSサーバーのディスク容量管理において、GPOとPowerShellを適切に組み合わせることが、安定した運用の鍵となります。
-
PowerShellでファイルとフォルダーを削除する方法【Remove-Itemコマンド徹底解説】
ファイルやフォルダーをひとつずつ手動で削除するのは、意外と手間がかかる作業です。しかし、PowerShellの使い方をマスターしていれば、そんな面倒な作業も一瞬で終わらせられます。この記事では、PowerShellを使ってWindowsのファイルやフォルダーを削除するさまざまな方法を紹介します。 PowerShellとは PowerShellは、Windowsが無料で提供しているコマンドライン自動化ツールです。コマンドプロンプトのウィンドウ上で起動するシェルを通じて、OSをより細かくコントロールできるようになるのが特徴です。 PowerShellでは「コマンドレット(Cmdlet)」と呼ばれ
-
Windows 10 PCで古いファイルを特定して削除する方法【Disk Analyzer Pro活用術】
PCの中には、自分でも気づいていない何百、何千というファイルが眠っているかもしれません。その中には、長年の間に不要となり、いつしか忘れ去られてしまったファイルも含まれています。こうしたファイル自体はコンピューターに害を及ぼすわけではありませんが、より重要なデータを保存できるはずの貴重なストレージ容量を無駄に占有しているのです。PC上の古いファイルをすべて手作業で探し出すのは現実的ではないため、「Disk Analyzer Pro」のようなサードパーティ製ソフトウェアを活用するのがおすすめです。 関連記事:Disk Analyzer Proでハードディスクの中身をわかりやすく整理・可視化する方法