Довольно частая проблема, с которой сталкиваются администраторы терминальных (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
На хосте Windows по умолчанию включена корзина для удаленных файлов (
$Recycle.Bin
). На RDS хосте в этом каталоге будет находится индивидуальная папка корзины для каждого пользователя (с SID пользователя в качестве имени). Со временем вы заметите, что суммарный размер файлов в корзине всех пользователей станет занимать значительную часть места диска RDS сервера.
По умолчанию размер корзины в Windows составляет около 5% от размера диска. Вы можете изменить максимальный размер корзины на каждом диске в ее свойствах. Здесь же можно полностью отключить корзину с помощью опции Don’t move files to the Recycle Bin.
Однако это изменит настройки корзины только для текущего пользователя.
Вы можете задать максимальный размер корзины для пользователей через параметр групповой политики Maximum recycle bin size allowed в разделе User Configuration -> Administrative Templates -> Windows Components -> File Explorer. Максимальный размер корзины задается в процентах от размер диска. Если задать здесь 0, корзина будет отключена для всех дисков.
Для очистки корзины в Windows можно использовать командлет Clear-RecycleBin (доступен начиная с версии PowerShell 5.1 в Win 10). Для очистки корзины без запроса, выполните команду:
Clear-RecycleBin -Force
При запуске этой команды на RDS сервере от имени простого пользователя, будет очищена только корзина текущего пользователя. Можно добавить эту команду в логоф скрипт GPO, чтобы корзина очищалась при выходе пользователя:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -Command Clear-RecycleBin -Confirm:$false
$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:USERPROFILE\cleanup_profile_script.log"
$OldFilesData = (get-date).adddays(-14)
# Полная очистка каталогов с кэшем
[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'
)
# Каталоги, в которых удаляются только старые файлы
[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.
- Создайте новую GPO и назначьте ее на OU, в котором находятся ваши RDS хосты;
- В настройках политики включите Режим замыкания групповой политики (Loopback Processing mode). То нужно чтобы к применить настройки из секции пользователей к компьютеру; Подробнее описано в статье “Почему не применяется групповая политика к компьютеру/пользователю”.
- Скопируйте файл PowerShell скрипта на контроллер домена в каталог Netlogon (
\\winitpro.ru\netlogon\CleanupUserProfile.ps1
) ; - Для дополнительной защиты кода PowerShell скрипта от изменений вы можете подписать его с помощью сертификата.
- Перейдите в раздел GPO User Configuration -> Policies -> Windows Settings -> Scripts -> Logoff. Перейдите на вкладку PowerShell Scripts и добавьте путь к PS1 файлу в Netlogon;
- Чтобы применить новые настройки GPO, выполните выход пользователя из Windows;
- Теперь при завершении сеанса пользователя на RDS сервере указанные каталоги будут автоматически очищаться. Вы можете проверить список удаленных файлов и каталогов в текстовом лог файле в профиле пользователя.
Рассмотренные здесь методы очистки пользовательских папок можно использовать как для локально хранящихся профилей пользователей, так и контейнеров User Profile Disks или FSlogix профилей на Windows Server RDSH. Также эффективно будет просто исключить временные папки из перемещаемых профилей.