Очищаем профили пользователей 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

На хосте 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%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 ). То нужно чтобы к применить настройки из секции пользователей к компьютеру;
admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

2 недели ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

2 недели ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

2 недели ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

2 недели ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

2 недели ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

2 недели ago