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

Довольно частая проблема, с которой сталкиваются администраторы терминальных (RDS) ферм Windows Server – нехватка места на системном диске, вызванная большим размером пользовательских данных. В этой статье мы покажем, как настроить автоматическую очистку корзины, папки Загрузки (Downloads), временных папок Temp и папок кэша пользователей в Windows с помощью PowerShell скриптов и групповых политик.

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

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

очистка диска в Windows с помощью Storage Sense

Очистка корзины пользователей Windows

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

корзина $Recycle.Bin на диске в Windows

По умолчанию размер корзины в Windows составляет около 5% от размера диска. Вы можете изменить максимальный размер корзины на каждом диске в ее свойствах. Здесь же можно полностью отключить корзину с помощью опции Don’t move files to the Recycle Bin .

Однако это изменит настройки корзины только для текущего пользователя.

настройки размера корзины Windows на дисках

Вы можете задать максимальный размер корзины для пользователей через параметр групповой политики Maximum recycle bin size allowed в разделе User Configuration -> Administrative Templates -> Windows Components -> File Explorer. Максимальный размер корзины задается в процентах от размер диска. Если задать здесь 0, корзина будет отключена для всех дисков.

Изменить настройки корзины через GPO

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

Clear-RecycleBin -Force

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

%windir%System32WindowsPowerShellv1.0powershell.exe -NoProfile -Command Clear-RecycleBin -Confirm:$false

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

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

PowerShell скрипт для очистки папок Temp, Downloads, кэша в профиле пользователя

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

Комментарии к скрипту:

  • В этом примере мы будем удалять файлы старше 14 дней в папке Downloads (вы можете изменить эту настройку). Остальные папки с кэшем и временными файлами очищаются полностью;
  • Скрипт предназначен для запуска от имени текущего пользователя (скрипт удаляет старые файлы при выходе пользователя из Windows и запускается как GPO логофф скрипт );
    При использовании на RDS сервере нужно убедиться, что пользователи пользуются кнопкой Sign-out/Logoff для завершения сеанса. Дополнительно рекомендуем настроить таймауты для RDS сессий для автоматического завершения сеансов при длительной неактивности.
  • Всю информацию об удаленных файлах будет сохраняться в текстовый лог файл (можно отключить после отладки скрипта на тестовых пользователях);
  • Дополнительно очищаем кэш RDP ;
  • Выполняется очистка каталога с ошибками Windows Error Reporting (WER) в профиле пользователя;
  • В скрипте закомментированы строки очистки кэша Google Chrome. Если пользователи используют его и кэш Chrome занимает много места, раскоментируйте строки с путями;
  • Вы можете добавить в скрипт дополнителен операцию проверки текущего размера папки с профилем пользователя до очистки и после (позволяет получить более точную информацию, но выполняется медленно). Либо можно просто проверить свободное место на диске до и после (выполняется мгновенно).

# Скрипт можно использовать для очистки папок в профиле пользователя (кэш, temp, downloads,кэш google chrome)
# PowerShell скрипт запускается из-под пользователя (права администратора) не требуются. Очищаются только временные файлы и кэш текущего пользователя.
# Оптимально для запуска через логофф скрипт GPO или через планировщик Task Scheduler
# Можно использовать на RDS хостах, VDI или рабочих станциях для очистки профилей пользователей
# Рекомендуем сначала протестировать работу скрипта в вашем окружении, и после этого удалить опцию WhatIf для физического удаления файлов
$Logfile = "$env:USERPROFILEcleanup_profile_script.log"
$OldFilesData = (get-date).adddays(-14)
# Полная очистка каталогов с кэшем
[array] $clear_paths = (
'AppDataLocalTemp',
'AppDataLocalMicrosoftTerminal Server ClientCache',
'AppDataLocalMicrosoftWindowsWER',
'AppDataLocalMicrosoftWindowsAppCache',
'AppDataLocalCrashDumps'
#'AppDataLocalGoogleChromeUser DataDefaultCache',
#'AppDataLocalGoogleChromeUser DataDefaultCache2entries',
#'AppDataLocalGoogleChromeUser DataDefaultCookies',
#'AppDataLocalGoogleChromeUser DataDefaultMedia Cache',
#'AppDataLocalGoogleChromeUser DataDefaultCookies-Journal'
)
# Каталоги, в которых удаляются только старые файлы
[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"
# если вы хотите очистить каталог с кэшем Google Chrome, нужно  остановить процесс chrome.exe
$currentuser=$env:UserDomain + ""+ $env:UserName
WriteLog  ""Stopping Chrome.exe Process for $currentuser""
Get-Process -name chrome -ErrorAction SilentlyContinue| ? {$_.SI -eq (Get-Process -PID $PID).SessionId} | Stop-Process
Start-Sleep -Seconds 5
# очистка каталогов с кэшем
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
}
}
# удаление старых файлов
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/winadm/posh/blob/master/Desktop/CleanupUserProfile.ps1

Данный PowerShell скрипт можно выполнять при завершении сессии пользователя на RDS сервере. Проще всего назначить скрипт через logoff политику GPO.

  1. Создайте новую GPO и назначьте ее на OU в котором находятся ваши RDS хосты;
  2. В настройках политики включите Режим замыкания групповой политики ( Loopback Processing mode ). То нужно чтобы к применить настройки из секции пользователей к компьютеру; Очищаем профили пользователей Windows (RDS) от временных файлов и кэша с помощью PowerShell и GPO
EnglishRussianUkrainian