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

Очищаем профили пользователей 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 логофф скрипт);
  • Всю информацию об удаленных файлах будет сохраняться в текстовый лог файл (можно отключить после отладки скрипта на тестовых пользователях);
  • Дополнительно очищаем кэш 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
другие папки, которые вам нужно очищать в профиле пользователя.

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

  1. Создайте новую GPO и назначьте ее на OU, в котором находятся ваши RDS хосты;
  2. В настройках политики включите Режим замыкания групповой политики (Loopback Processing mode). То нужно чтобы к применить настройки из секции пользователей к компьютеру; включить режим замыкания gpo
  3. Скопируйте файл PowerShell скрипта на контроллер домена в каталог Netlogon (
    winitpro.runetlogonCleanupUserProfile.ps1
    ) ;
  4. Перейдите в раздел GPO User Configuration -> Policies -> Windows Settings -> Scripts -> Logoff. Перейдите на вкладку PowerShell Scripts и добавьте путь к PS1 файлу в Netlogon; запуск логоф скрипта PowerShell через групповые политики
  5. Чтобы применить новые настройки GPO, выполните выход пользователя из Windows;
  6. Теперь при завершении сеанса пользователя на RDS сервере указанные каталоги будут автоматически очищаться. Вы можете проверить список удаленных файлов и каталогов в текстовом лог файле в профиле пользователя.

текстовый лог файл с историей очистки профиля пользователя

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

Рассмотренные здесь методы очистки пользовательских папок можно использовать как для локально хранящихся профилей пользователей, так и контейнеров User Profile Disks или FSlogix профилей на Windows Server RDSH. Также эффективно будет просто исключить временные папки из перемещаемых профилей.

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