古くなったユーザー プロファイルや放置されたユーザー プロファイルの処理は、特に RDS (リモート デスクトップ サービス) サーバーでは時間の経過とともにプロファイルが蓄積され続けるため、非常に面倒です。何百ものプロファイルによってディスク領域が消費され、手動で削除するのがヒドラと格闘しているような感覚になったことがあるなら、あなただけではありません。幸いなことに、手動で実行するか、グループ ポリシーを使用するか、PowerShell でスクリプトを作成するかに関係なく、この問題を解決する方法はいくつかあります。目標は常に同じで、古くなったプロファイルをクリーンアップしてシステムを整理された状態に保つことです。ただし、プロファイル、特にレジストリの編集をいじると、注意しないと問題が発生する可能性があります。そのため、必ず最初にテストを行い、データをバックアップしてください。ここでは、これを実行するための実用的な方法をいくつか紹介します。後で頭を悩ませるのを防ぐための詳細も含まれています。
Windowsでユーザープロファイルを手動で削除する方法
高度なシステム設定を使用した手動削除
GUIを好む方には、この方法はまさにうってつけです。特に、誰かが退職した場合や、複数のマシンをまとめてクリーンアップしたい場合など、状況に応じてプロファイルを削除するのに最適です。この方法が有効な理由は、プロファイルのレジストリエントリとフォルダを削除するため、非常に徹底的な削除が可能です。ただし、一度に1つずつ削除したいプロファイルのみを対象としています。少数のプロファイルを扱う場合に便利です。
- [実行] ボックス ( ) を実行して、システムの詳細設定を開きます。
SystemPropertiesAdvancedWin + R - [ユーザー プロファイル]の下の[設定]をクリックします。
- リストにはプロファイルのサイズとパスが表示されます。削除したいプロファイルを選択し、「Delete」を押します。この方法ではレジストリが更新され、フォルダが自動的に削除されます。レジストリキーを手動で変更するのは、本当に理解していない限り、大惨事を招く可能性があるため、これは便利です。
Windows 11や10などの新しいバージョンでは、 「設定」 → 「アカウント」 → 「職場または学校へのアクセス」と進み、そこからユーザープロファイルを削除することもできます。これはGUIを使った簡単な方法です。ただし、プロファイルがアクティブに使用されていない、またはロックされていない場合にのみ機能することに注意してください。
多くの管理者は、 のプロファイルフォルダを削除しようとしますがC:\Users、これは大きな間違いです。レジストリが混乱したり、プロファイルエラーが発生したり、場合によってはシステムが破損したりする可能性があります。代わりに、GUIまたはレジストリを使ってクリーンアップするのが最善です。
レジストリのクリーンアップ
場合によっては、レジストリエントリを手動で削除する必要がありますHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList。要点は次のとおりです。各ユーザープロファイルには、SID にちなんで名付けられたキーが存在します。ユーザーのプロファイルフォルダを指すProfileImagePathを持つキーを探し、そのキーを削除します。これにより、Windows は存在しないプロファイルの読み込みを試行しなくなり、イベントログにエラーが記録されるのを回避できます。
- regedit.exeを開きます。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileListに移動します。
- サブキー(それぞれがSIDです)を確認します。削除したいユーザーを指しているProfileImagePathを見つけたら、そのサブキーを削除します。
プロのヒント:念のため、事前にキーをエクスポートしておくと便利です。自動化したい場合は、PowerShell が面倒な作業を自動化してくれるので、一括クリーンアップの救世主となります。
PowerShell でプロファイルを削除する
スクリプト作成が好きな方には、PowerShellが最適です。以下のコマンドは、ユーザー名で特定のプロファイルを検索し、削除することで、ディスクフォルダとレジストリエントリの両方をクリアします。素早く繰り返し実行でき、組み込みコマンドを使用するため、複雑なモジュールは必要ありません。
Get-CimInstance -Class Win32_UserProfile | Where-Object { $_. LocalPath.split('\\')[-1] -eq 'j.smith' } | Remove-CimInstance
`’j.smith’` を実際のユーザー名に置き換えてください。設定によっては、必要な権限を取得するために PowerShell を管理者として実行する必要がある場合があります。私の環境では複数のマシンで動作しましたが、他のマシンでは2回実行したり、再起動したりする必要があるかもしれません。
PowerShellリモート処理を使ってリモートからプロファイルを削除することもできます。対象マシンでリモート処理が有効になっていることを確認し、以下のコマンドを実行してください。
$comp = "mun-wks92s3" $user = "j.smith" Invoke-Command -ComputerName $comp -ScriptBlock { param($user) Get-CimInstance -Class Win32_UserProfile | Where-Object { $_. LocalPath.split('\\')[-1] -eq $user } | Remove-CimInstance } -ArgumentList $user
リモート PowerShell が適切に設定されている限り、複数のサーバーまたは RDS ホストを管理する場合に便利です。
GPO: 一定日数以上経過したユーザープロファイルを削除する
グループポリシーによるクリーンアップの自動化
Windowsには、実はこれを自動的に行う機能が組み込まれており、煩雑さを回避するのに非常に便利です。プロファイルがしばらく使用されていない場合は、再起動時に削除するように設定できます。これにより、管理時間とディスク容量を節約できます。非アクティブなプロファイルがいつまでも残ってしまうRDファームなどでは、この機能は理にかなっています。
- ターゲット マシンを含む OU を特定します ( [Active Directory ユーザーとコンピューター]を右クリックし、[このドメインに GPO を作成し、ここにリンクする] を選択します)。
- GPO に意味のある名前を付けて編集します。
- [コンピューターの構成] → [管理用テンプレート] → [システム] → [ユーザー プロファイル]に移動します。
- システムの再起動時に、指定された日数より古いユーザー プロファイルを削除するを有効にします。
- プロファイルをクリーンアップする頻度に応じて、45 日や 90 日などの日数を指定します。
設定が完了し、ポリシーが更新されると(通常は再起動後または 経由gpupdate /force)、Windows はその期間内に使用されていないプロファイルを自動的に削除します。これで完了です。手動でのクリーンアップは不要です。ただし、システムクロックが正しいことを確認してください。正しく設定されていないと、Windows はプロファイルがアクティブでないのにアクティブであると誤認識したり、その逆の誤認識をしたりする可能性があります。
この設定は、プロファイルの最終使用タイムスタンプに依存します。これは、最新の Windows では、ファイルの変更日付のみに依存していた古い方法よりも信頼性が高くなります。
注記:
この方法は、一部の古いWindowsバージョンではスムーズに動作しない可能性があり、ローカル管理者やシステムアカウントなどの特定のプロファイルは変更されません。まずは非本番環境のホストでテストを実行し、動作を確認し、重要なデータが意図せず削除されていないことを確認することをお勧めします。
PowerShell スクリプトで古いユーザー プロファイルを削除する
非アクティブなプロファイルの一括クリーンアップ
もっと的を絞った分析をしたい場合は、スクリプトを使うのがおすすめです。まず、プロファイルのサイズを測ることで、どれくらいの容量を消費しているかを把握できます。これは、Windowsでは標準ではできない簡単な概要のようなものですが、ここではその方法を解説します。
gci -force 'C:\Users\' | Where-Object { !($_. Attributes -match "ReparsePoint") } | ForEach-Object { $size = 0 gci -Recurse -Force $_. FullName | Measure-Object -Property Length -Sum | Select-Object -ExpandProperty Sum "{0:N2} GB" -f ($size / 1GB) }
このスクリプトはシンボリック リンクをスキップし、プロファイルの合計サイズを計算して、ディスクの使用状況をより明確に把握できるようにします。
次に、古いプロファイル(たとえば、60 日以上アクティブでないプロファイル)を識別して削除するには、次のスニペットが役立ちます。
Get-WMIObject -Class Win32_UserProfile | Where-Object { (!$_. Special) -and ($_. ConvertToDateTime($_. LastUseTime) -lt (Get-Date).AddDays(-60)) } | Measure-Object | Select-Object Count, Sum
しかし、実際に削除するには、より複雑なスクリプトが必要です。このスクリプトはプロファイルをリストし、最終使用日とサイズをチェックします。そして、-WhatIfパラメータを追加することで、すぐに削除するか、確認してから削除するかを選択できます。意図しない削除を防ぐため、これらのスクリプトは必ず最初に-WhatIfパラメータを付けて実行してください。削除対象としてフラグが付けられているユーザーを再度確認することをお勧めします。
除外事項を忘れないでください
システムアカウントや特定のアクティブユーザーアカウントなど、確実に保持しておきたいプロファイルもあります。スクリプトに除外リストを追加することで、「Public」、「Admin」、「svc」などのプロファイルが削除されないようにすることができます。
# List of profiles to exclude $exclude = @("Public", "admin", "svc") Get-WMIObject -Class Win32_UserProfile | Where-Object { -not $_. Special -and ($_. ConvertToDateTime($_. LastUseTime) -lt (Get-Date).AddDays(-60)) -and ($exclude -notcontains $_. LocalPath. Split('\')[-1]) } | Foreach-Object { # To actually delete, remove the comment below # $_ | Remove-WmiObject # And run with -WhatIf first Write-Host "Would delete" $_. LocalPath }
これらのスクリプトは根気強く実行してください。プロファイルが固かったりロックされていたりする場合があります。設定によっては、クリーンアップの前に再起動するとセッションロックが解除されることがあります。
まとめ
古いユーザープロファイルの削除は、必ずしも魅力的な作業とは言えませんが、システムをスリムに保ち、共有サーバーのディスク容量不足を防ぐためには不可欠です。手動で削除する、GPOを設定する、カスタムPowerShellスクリプトを作成するなど、それぞれのレベルのユーザーに合った方法があります。ただし、重要なデータのテストとバックアップを忘れず、削除する内容を再確認するようにしてください。プロファイルには重要な情報が含まれている可能性があります。これを数回繰り返すと、習慣化され、後々何時間も節約できるようになります。
まとめ
- 個々のプロファイルを手動でクリーンアップするには、詳細システム設定を使用します。
- 設定された時間が経過すると古いプロファイルを自動的に削除するようにグループ ポリシーを構成します。
- PowerShell スクリプトを活用して、一括または自動プロファイル管理を実行します。
- 特にリモート コマンドを使用する場合は、必ず最初にテスト サーバーまたは VM でスクリプトをテストしてください。
- レジストリの編集には注意してください。変更を加える前にバックアップしてください。
- 重要なプロファイルが削除されないように、クリーニング時に重要なアカウントを除外します。