👋 Привет, админы!
Недавно столкнулся с ситуацией: на одном из серверов системный диск практически «забился» под завязку, а штатные чистилки мусора не помогали - свободного места оставалось критически мало. Оказалось, что куча старых файлов обновлений, временных логов и упаковок пакетов Windows Update съели не меньше 20 ГБ!
🔥 Чтобы оперативно и централизованно освободить место на C:, я использовал PowerShell-скрипт для сброса компонентов Windows Update и удаления временных файлов.
🔍 Что делает скрипт:
1. Останавливает службы wuauserv, bits и cryptsvc, чтобы освободить доступ к файлам обновлений.
2. Переименовывает папки
3. Перезапускает службы, чтобы система могла продолжить получать обновления.
4. Удаляет старые временные файлы из
5. (Опционально) Очищает папку
6. Запускает командлет
💡 Лайфхак:
- Если вы работаете со множеством серверов, оберните этот скрипт в экспорт модуля или сохраните в виде
- Можно добавить проверку свободного места перед выполнением очистки, чтобы скрипт запускался, только когда доступно меньше, скажем, 10 ГБ:
Не забывайте тестировать на тестовых окружениях перед тем, как развертывать на продакшне.
📲 Мы в MAX
👉 @win_sysadmin
Недавно столкнулся с ситуацией: на одном из серверов системный диск практически «забился» под завязку, а штатные чистилки мусора не помогали - свободного места оставалось критически мало. Оказалось, что куча старых файлов обновлений, временных логов и упаковок пакетов Windows Update съели не меньше 20 ГБ!
🔥 Чтобы оперативно и централизованно освободить место на C:, я использовал PowerShell-скрипт для сброса компонентов Windows Update и удаления временных файлов.
# 1. Остановим службы обновлений
Write-Host "Останавливаю службы Windows Update..." -ForegroundColor Cyan
Stop-Service -Name wuauserv -Force
Stop-Service -Name bits -Force
Stop-Service -Name cryptsvc -Force
# 2. Переименуем папки SoftwareDistribution и Catroot2 (чтобы сбросить кеш)
$sd = "C:\Windows\SoftwareDistribution"
$cr2 = "C:\Windows\System32\catroot2"
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
Write-Host "Переименовываю SoftwareDistribution и Catroot2..." -ForegroundColor Cyan
Rename-Item -Path $sd -NewName "SoftwareDistribution_$timestamp" -Force
Rename-Item -Path $cr2 -NewName "catroot2_$timestamp" -Force
# 3. Запустим службы обратно
Write-Host "Запускаю службы Windows Update..." -ForegroundColor Cyan
Start-Service -Name wuauserv
Start-Service -Name bits
Start-Service -Name cryptsvc
# 4. Удаляем временные файлы пользователя и систему temp
Write-Host "Удаляю временные файлы..." -ForegroundColor Cyan
Get-ChildItem "C:\Windows\Temp" -Recurse -Force | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
Get-ChildItem "$env:TEMP" -Recurse -Force | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
# 5. Очищаем папку Prefetch (если нужно)
Write-Host "Очищаю Prefetch (опционально)..." -ForegroundColor Cyan
Get-ChildItem "C:\Windows\Prefetch" -Recurse -Force | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
# 6. Запускаем анализ и дефрагментацию (для HDD/SDD команда отличается)
Write-Host "Запускаю оптимизацию диска (для HDD)..." -ForegroundColor Cyan
Optimize-Volume -DriveLetter C -ReTrim -Verbose
Write-Host "Готово! Освобождено место и сброшен кеш Windows Update." -ForegroundColor Green
🔍 Что делает скрипт:
1. Останавливает службы wuauserv, bits и cryptsvc, чтобы освободить доступ к файлам обновлений.
2. Переименовывает папки
SoftwareDistribution и catroot2 - таким образом Windows создаёт новые «чистые» папки при следующем запуске службы обновлений.3. Перезапускает службы, чтобы система могла продолжить получать обновления.
4. Удаляет старые временные файлы из
C:\Windows\Temp и из переменной %TEMP% текущего пользователя.5. (Опционально) Очищает папку
Prefetch - пригодится, если вы хотите сбросить предзагрузку приложений (иногда помогает ускорить старт служб).6. Запускает командлет
Optimize-Volume с параметром –ReTrim (важно для SSD, если нужно, или дефрагментацию для HDD), что в итоге дополнительно освобождает свободное пространство и приводит метаданные диска в порядок.💡 Лайфхак:
- Если вы работаете со множеством серверов, оберните этот скрипт в экспорт модуля или сохраните в виде
.ps1, а затем запускайте его через Scheduled Task по расписанию раз в неделю/месяц.- Можно добавить проверку свободного места перед выполнением очистки, чтобы скрипт запускался, только когда доступно меньше, скажем, 10 ГБ:
$freeGB = [math]::Round((Get-PSDrive -Name C).Free / 1GB, 2)
if ($freeGB -lt 10) {
# выполняем очистку
} else {
Write-Host "Достаточно места — пропускаю действия."
}
Не забывайте тестировать на тестовых окружениях перед тем, как развертывать на продакшне.
📲 Мы в MAX
👉 @win_sysadmin
👍9🤮3❤1🔥1
👋 Привет, админы!
Недавно был случай, один из файловых серверов неожиданно перестал принимать события - логи просто «забились» до предела, из-за чего служба безопасности не могла записывать критичные события входа. Оказалось, что журналы событий выросли до 10 ГБ и система больше не записывала новые записи.
🔥 Чтобы предотвратить подобные ситуации, я собрал небольшой скрипт для автоматического архивации и очистки журналов событий, когда их размер превышает заданный порог. Вот пример, который запустил на сервере:
Этот скрипт проверяет размер каждого указанного журнала, экспортирует его в папку архива, если размер больше 1 ГБ, и очищает файл. Я поставил его в Task Scheduler с частотой 1 раз в сутки, чтобы не «догонять» проблему вручную.
📲 Мы в MAX
👉 @win_sysadmin
Недавно был случай, один из файловых серверов неожиданно перестал принимать события - логи просто «забились» до предела, из-за чего служба безопасности не могла записывать критичные события входа. Оказалось, что журналы событий выросли до 10 ГБ и система больше не записывала новые записи.
🔥 Чтобы предотвратить подобные ситуации, я собрал небольшой скрипт для автоматического архивации и очистки журналов событий, когда их размер превышает заданный порог. Вот пример, который запустил на сервере:
# Порог в мегабайтах
$logSizeThresholdMB = 1024
# Папка для архивации
$archivePath = "D:\EventLogArchives"
if (-not (Test-Path $archivePath)) {
New-Item -Path $archivePath -ItemType Directory | Out-Null
}
# Функция для проверки и архивации логов
function Archive-And-Clear-EventLog {
param (
[string]$LogName
)
# Определяем текущий размер лога
$logInfo = wevtutil gl $LogName
$fileSizeLine = ($logInfo | Where-Object { $_ -match "fileSize" })
$sizeBytes = [int64]($fileSizeLine -replace "[^0-9]", "")
$sizeMB = [math]::Round($sizeBytes / 1MB, 2)
if ($sizeMB -ge $logSizeThresholdMB) {
$timestamp = (Get-Date).ToString("yyyyMMdd_HHmmss")
$archiveFile = Join-Path $archivePath "$LogName`_$timestamp.evtx"
# Экспортируем текущий журнал
wevtutil epl $LogName $archiveFile
Write-Host "Архивировал лог $LogName (размер $sizeMB MB) в $archiveFile"
# Очищаем журнал
wevtutil cl $LogName
Write-Host "Очищен лог $LogName"
} else {
Write-Host "Лог $LogName в пределах нормы: $sizeMB MB"
}
}
# Получаем все журналы, которые хотим контролировать (пример: System и Security)
$logsToCheck = @("System", "Security")
foreach ($log in $logsToCheck) {
Archive-And-Clear-EventLog -LogName $log
}
Этот скрипт проверяет размер каждого указанного журнала, экспортирует его в папку архива, если размер больше 1 ГБ, и очищает файл. Я поставил его в Task Scheduler с частотой 1 раз в сутки, чтобы не «догонять» проблему вручную.
📲 Мы в MAX
👉 @win_sysadmin
👍9❤1
👋 Привет, админы!
Если не ошибаюсь, осенью 21 года в одном из наших дата-центров после планового обновления клиентских машин начали массово падать сеансы RDP - пользователи жаловались, что после ввода пароля сессия сразу же разрывается. Оказалось, во время апдейта поставился неполностью совместимый патч безопасности, который конфликтовал с включённым на компьютерах аудиторией учетных политик.
🔥 Чтобы быстро отследить все последние установленные обновления на целевой группе машин и при необходимости откатить проблемный патч, я использовал вот такой PowerShell-скрипт:
С помощью этого отчёта мы быстро определили, что именно на всех проблемных ПК установился KB5005565. Чтобы откатить его удалённо, использовал команду:
После перезапуска машин RDP-сессии вернулись в норму. Плюс я добавил правило на WSUS, чтобы этот конкретный патч не раздавался снова до выяснения причины конфликта.
📲 Мы в MAX
👉 @win_sysadmin
Если не ошибаюсь, осенью 21 года в одном из наших дата-центров после планового обновления клиентских машин начали массово падать сеансы RDP - пользователи жаловались, что после ввода пароля сессия сразу же разрывается. Оказалось, во время апдейта поставился неполностью совместимый патч безопасности, который конфликтовал с включённым на компьютерах аудиторией учетных политик.
🔥 Чтобы быстро отследить все последние установленные обновления на целевой группе машин и при необходимости откатить проблемный патч, я использовал вот такой PowerShell-скрипт:
# Получаем список компьютеров из текстового файла
$computers = Get-Content -Path "C:\Scripts\computers.txt"
# Словарь для хранения списка установленных обновлений
$updateReport = @()
foreach ($computer in $computers) {
try {
# Получаем установленные обновления за последние 7 дней
$recentUpdates = Get-HotFix -ComputerName $computer |
Where-Object { $_.InstalledOn -ge (Get-Date).AddDays(-7) }
foreach ($upd in $recentUpdates) {
$updateReport += [PSCustomObject]@{
Computer = $computer
KBArticle = $upd.HotFixID
InstalledOn = $upd.InstalledOn
}
}
}
catch {
Write-Warning "Не удалось получить обновления с сервера $computer: $_"
}
}
# Сохраняем отчёт в CSV
$csvPath = "C:\Scripts\RecentUpdatesReport.csv"
$updateReport | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
Write-Host "Отчет сохранен в $csvPath"
С помощью этого отчёта мы быстро определили, что именно на всех проблемных ПК установился KB5005565. Чтобы откатить его удалённо, использовал команду:
Invoke-Command -ComputerName (Get-Content "C:\Scripts\computers.txt") -ScriptBlock {
wusa /uninstall /kb:5005565 /quiet /norestart
}
После перезапуска машин RDP-сессии вернулись в норму. Плюс я добавил правило на WSUS, чтобы этот конкретный патч не раздавался снова до выяснения причины конфликта.
📲 Мы в MAX
👉 @win_sysadmin
👍8