Очистка кэша и временных файлов в профилях пользователей в Windows (RDS) с помощью PowerShell и GPO

Администраторы ферм Windows Server RDS часто сталкиваются с проблемой нехватки места на системном диске из-за большого количества пользовательских данных. В этой статье показано, как использовать PowerShell и групповые политики для автоматической очистки папок Recycle Bin, Downloads, Temp и Cache в пользовательских профилях на Windows.

Автоматическая очистка папок Temp и Download с помощью Windows Storage Space

Вы можете использовать встроенный Storage Sense функция автоматического удаления старых и временных файлов на Windows Server 2019/2022 и Windows 10/11. Она имеет специальные параметры GPO, позволяющие очищать папки Temp и Downloads.

Storage Space - удаление временных файловПространство для хранения - удаление временных файлов

Как очистить корзину для пользователей Windows?

По умолчанию папка корзины ($Recycle.Bin) для удаленных файлов включена на хосте Windows. Для каждого пользователя создается отдельная папка Recycle Bin в этом каталоге (с SID пользователя в качестве имени) на сервере RDS. Со временем вы обнаружите, что общий размер файлов в корзинах всех пользователей будет занимать значительный объем дискового пространства на хосте RDS.

Файлы $Recycle.Bin других профилей пользователей$Recycle.Bin файлы других профилей пользователей

По умолчанию размер корзины в Windows составляет около 5 % от размера диска. Вы можете изменить максимальный размер корзины для каждого диска в его свойствах. Здесь же можно полностью отключить корзину с помощью команды Не перемещать файлы в корзину опция. Однако это изменит настройки корзины только для текущего пользователя.

настройка параметров корзины настройка параметров корзины

Вы можете установить максимальный размер корзины для пользователей с помощью опции Максимально допустимый размер корзины Параметр GPO в разделе Конфигурация пользователя -> Административные шаблоны -> Компоненты Windows -> Проводник файлов. Максимальный размер корзины задается в процентах от размера диска. Установка значения 0 отключает корзину на всех дисках.

GPO: Максимально допустимый размер корзины GPO: Максимально допустимый размер корзины

Чтобы очистить корзину в Windows, можно воспользоваться командой Clear-RecycleBin команда (доступна в PowerShell 5.1 и новее для Windows 10). Чтобы очистить корзину без запроса, выполните следующую команду:

Clear-RecycleBin -Force

Если выполнить эту команду от имени обычного пользователя на хосте RDS, будет очищена только корзина текущего пользователя. Вы можете добавить эту команду в сценарии выхода из системы GPO, чтобы очищать корзину при выходе пользователя из системы:

%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command Clear-RecycleBin -Confirm:$false

Для предыдущих версий Windows (со старыми версиями PowerShell) можно использовать следующий код для очистки корзины RecycleBin:

$Shell = New-Object -ComObject Shell.Application
$RecycleBin = $Shell.Namespace(0xA)
$RecycleBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}

Очистка папок Cache, Temp и Downloads в профиле пользователя с помощью PowerShell

Рассмотрим сценарий PowerShell для очистки папок Temp, Downloads и некоторых других временных папок в профиле пользователя на Windows Server RDS или настольном компьютере под управлением Windows 10/11.

Комментарии к сценарию:

  • В этом примере мы удалим файлы старше 14 дней в папке Downloads (этот параметр можно изменить). Другие папки с кэшем и временными файлами будут полностью пусты;
  • Сценарий запускается в контексте текущего пользователя (сценарий удаляет старые файлы, когда пользователь выходит из Windows, и запускается как сценарий выхода из GPO);
    При использовании в среде RDS убедитесь, что пользователи нажимают кнопку Logout/Login для завершения сеанса. Мы также рекомендуем настроить таймауты сеансов RDS, чтобы сеансы автоматически завершались после определенного периода бездействия.
  • Вся информация об удаленных файлах будет сохраняться в текстовом файле журнала (вы можете отключить эту функцию после отладки сценария на тестовых пользователях);
  • Также будет очищена история и кэш RDP-соединений;
  • Очищается папка Windows Error Reporting (WER) в профиле пользователя;
  • Строки, очищающие кэш Google Chrome, закомментированы в сценарии. Если ваши пользователи используют его и кэш Chrome занимает много места, откомментируйте строки с путями;
  • Вы можете добавить дополнительную операцию проверки текущего размера папки профиля пользователя до и после очистки (это позволяет получить более точную информацию, но занимает некоторое время). Или можно просто проверить свободное место на диске до и после очистки (это делается быстро).
# You can use this script to clean folders in a user profile (cache, temp, downloads, google chrome cache) on RDS hosts, VDIs, or workstations
# Run the PowerShell script under a commaon user account (no administrator privileges are required). Only temporary files and the current user's cache are deleted.
# You can run this script via GPO (logoff script) or with the Task Scheduler
# Test the script in your environment and then remove the WhatIf option to permanently delete files
$Logfile = "$env:USERPROFILE\cleanup_profile_script.log"
$OldFilesData = (Get-Date).AddDays(-14)
# Complete cleanup of cache folders
[array] $clear_paths = (
    'AppData\Local\Temp',
    'AppData\Local\Microsoft\Terminal Server Client\Cache',
    'AppData\Local\Microsoft\Windows\WER',
    'AppData\Local\Microsoft\Windows\AppCache',
    'AppData\Local\CrashDumps'
    #'AppData\Local\Google\Chrome\User Data\Default\Cache',
    #'AppData\Local\Google\Chrome\User Data\Default\Cache2\entries',
    #'AppData\Local\Google\Chrome\User Data\Default\Cookies',
    #'AppData\Local\Google\Chrome\User Data\Default\Media Cache',
    #'AppData\Local\Google\Chrome\User Data\Default\Cookies-Journal'
)
# Folders where only old files should be removed
[array] $clear_old_paths = (
    'Downloads'
)
function WriteLog {
    Param ([string]$LogString)
    $Stamp = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    $LogMessage = "$Stamp $LogString"
    Add-content $LogFile -value $LogMessage
}
WriteLog "Starting profile cleanup script"
# If you want to clear the Google Chrome cache folder, stop the chrome.exe process
$currentuser = $env:UserDomain + "\"+ $env:UserName
WriteLog "Stopping Chrome.exe Process for $currentuser"
Get-Process -Name chrome -ErrorAction SilentlyContinue | Where-Object {$_.SI -eq (Get-Process -PID $PID).SessionId} | Stop-Process
Start-Sleep -Seconds 5
# Clean up cache folders
ForEach ($path In $clear_paths) {
    If ((Test-Path -Path "$env:USERPROFILE\$path") -eq $true) {
        WriteLog "Clearing $env:USERPROFILE\$path"
        Remove-Item -Path "$env:USERPROFILE\$path" -Recurse -Force -ErrorAction SilentlyContinue -WhatIf -Verbose 4>&1 | Add-Content $Logfile
    }
}
# Delete old files 
ForEach ($path_old In $clear_old_paths) {
    If ((Test-Path -Path "$env:USERPROFILE\$path_old") -eq $true) {
        WriteLog "Clearing $env:USERPROFILE\$path_old"
        Get-ChildItem -Path "$env:USERPROFILE\$path_old" -Recurse -Force -ErrorAction SilentlyContinue | Where-Object {($_.LastWriteTime -lt $OldFilesData)} | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue -WhatIf -Verbose 4>&1 | Add-Content $Logfile
    }
}
WriteLog "End profile cleanup script"

Аналогичным образом можно добавить другие папки, которые необходимо очистить в профиле пользователя, в $clear_paths .

Полную версию скрипта смотрите в моем репозитории на GitHub: https://github.com/maxbakhub/winposh/blob/main/RDS/CleanupUserProfile.ps1.

Этот сценарий PowerShell может запускаться при завершении сеанса RDP-сервера пользователя. Самый простой способ назначить сценарий — использовать политику logoff GPO.

  1. Создайте новый GPO и назначьте его организационной единице (OU), в которой расположены ваши хосты RDS;
  2. Включите опцию Настроить групповую политику пользователя Режим обработки шлейфа. Это необходимо для применения настроек из раздела Пользователи к компьютеру; включить обработку обратной петли gpoвключить обработку обратной связи gpo
    Дополнительные сведения см. в разделе Почему групповая политика не применяется к компьютеру/пользователю.
  3. Скопируйте файл сценария PowerShell в папку Net logon на контроллере домена (\\woshub.com\netlogon\CleanupUserProfile.ps1);
    Вы можете подписать код сценария PowerShell сертификатом, чтобы защитить его от несанкционированного изменения.
  4. Перейдите в раздел GPO User Configuration -> Policies -> Windows Settings -> Scripts -> Logoff. Откройте раздел Сценарии PowerShell вкладку и добавьте UNC-путь к файлу PS1 в Netlogon;
  5. GPO: запуск сценария powershell при выходе из системыGPO: запуск сценария powershell при выходе из системыВыйдите из Windows, чтобы применить новые параметры GPO;
  6. При завершении сеанса пользователя на сервере RDS указанные папки будут автоматически очищены. Список удаленных файлов и папок можно просмотреть в текстовом файле журнала в профиле пользователя.

журнал очистки профиляжурнал очистки профиля

Вы также можете использовать следующие методы, позволяющие управлять размером пользовательского профиля на серверах Windows Server RDS:

  • Как удалить старые профили пользователей?
  • Включение дисковых квот NTFS

Рассмотренные здесь методы очистки пользовательских папок можно применять как к локально хранящимся пользовательским профилям, так и к дискам пользовательских профилей или контейнерам профилей FSlogix на Windows Server RDSH.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *