Довольно частая проблема, с которой сталкиваются администраторы терминальных (RDS) ферм Windows Server – нехватка места на системном диске, вызванная большим размером пользовательских данных. В этой статье мы покажем, как настроить автоматическую очистку корзины, папки Загрузки (Downloads), временных папок Temp и папок кэша пользователей в Windows с помощью PowerShell скриптов и групповых политик.
В Windows Server 2019/2022 и Windows 10/11 вы можете использовать встроенную функцию Storage Sense (Контроль памяти) для автоматически удаления старых и временных файлов. Для нее есть отдельные параметры GPO, которые позволяют включить очистку папок Temp и Downloads.
На хосте 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
$Shell = New-Object -ComObject Shell.Application
$RecycleBin = $Shell.Namespace(0xA)
$RecycleBin.Items() | %{Remove-Item $_.Path -Recurse -Confirm:$false}
Рассмотрим небольшой PowerShell скрипт для очистки содержимого папок Temp, Downloads и некоторых других временных папок в профиле пользователя на RDS или обычном компьютере Windows.
Комментарии к скрипту:
# Скрипт можно использовать для очистки папок в профиле пользователя (кэш, 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.
Как менялся логотип Apple на протяжении многих лет. Логотип Apple — это не просто символ,…
Security Boot Fail при загрузке Acer — решение проблемы При загрузке ноутбука Acer с флешки,…
Ноутбук не включается — варианты решения Если при попытке включить ноутбук вы обнаруживаете, что он…
The AC power adapter wattage and type cannot be determined — причины и решение При…
Свистит или звенит блок питания компьютера — причины и решения Некоторые владельцы ПК могут обратить…
Мигает Caps Lock на ноутбуке HP — почему и что делать? При включении ноутбука HP…