👋 Привет, админы!
Если не ошибаюсь, осенью 21 года в одном из наших дата-центров после планового обновления клиентских машин начали массово падать сеансы RDP - пользователи жаловались, что после ввода пароля сессия сразу же разрывается. Оказалось, во время апдейта поставился неполностью совместимый патч безопасности, который конфликтовал с включённым на компьютерах аудиторией учетных политик.
🔥 Чтобы быстро отследить все последние установленные обновления на целевой группе машин и при необходимости откатить проблемный патч, я использовал вот такой PowerShell-скрипт:
С помощью этого отчёта мы быстро определили, что именно на всех проблемных ПК установился KB5005565. Чтобы откатить его удалённо, использовал команду:
После перезапуска машин RDP-сессии вернулись в норму. Плюс я добавил правило на WSUS, чтобы этот конкретный патч не раздавался снова до выяснения причины конфликта.
👉 @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, чтобы этот конкретный патч не раздавался снова до выяснения причины конфликта.
👉 @win_sysadmin
❤13👍11
👋 Привет, админы!
Недавно столкнулся с интересным кейсом: один из файловых серверов начал сигнализировать о недостатке свободного пространства. При проверке выяснилось, что причиной стали старые логи IIS и системные файлы, которые копились неделями. Для нас, админов, важно держать «мусор» под контролем, чтобы не проснуться однажды с дискoм, полностью забитым «ненужными» данными.
🔥 В таких случаях мне помогает небольшой PowerShell-скрипт для автоматической очистки логов старше заданного числа дней. Вот что я настроил:
Основные моменты:
1. Гибкая настройка пути: в переменной
2. Параметр возраста: переменная
3. Рекурсивный обход: флаг
4. Безопасность: перед удалением скрипт выводит список удаляемых файлов. Если сомневаетесь — закомментируйте строку
💬 Я запланировал выполнение этого скрипта через Task Scheduler каждую неделю в воскресенье в полночь. В результате освободилось несколько десятков гигабайт и администраторы перестали получать тревожные письма о заполненном разделе C:.
А как вы справляетесь с накоплением логов на серверах? Может, используете какие-то централизованные решения (SIEM, Splunk, ELK) для ретеншена и ротации? Делитесь своими приёмами в комментариях!
👉 @win_sysadmin
Недавно столкнулся с интересным кейсом: один из файловых серверов начал сигнализировать о недостатке свободного пространства. При проверке выяснилось, что причиной стали старые логи IIS и системные файлы, которые копились неделями. Для нас, админов, важно держать «мусор» под контролем, чтобы не проснуться однажды с дискoм, полностью забитым «ненужными» данными.
🔥 В таких случаях мне помогает небольшой PowerShell-скрипт для автоматической очистки логов старше заданного числа дней. Вот что я настроил:
# Путь до папки с логами (пример для IIS)
$LogPath = "C:\inetpub\logs\LogFiles"
# Возраст файлов (в днях), после которого файлы подлежат удалению
$DaysThreshold = 30
# Получаем все файлы в папке и вложенных каталогах старше $DaysThreshold
$OldLogs = Get-ChildItem -Path $LogPath -Recurse -File |
Where-Object { ($_.LastWriteTime -lt (Get-Date).AddDays(-$DaysThreshold)) }
# Если есть файлы для удаления, выводим их и удаляем
if ($OldLogs) {
Write-Host "Найдены логи старше $DaysThreshold дней:`n" -ForegroundColor Yellow
$OldLogs | Select-Object FullName, LastWriteTime | Format-Table -AutoSize
# Удаляем найденные файлы
$OldLogs | Remove-Item -Force -Verbose
Write-Host "`nОчистка завершена." -ForegroundColor Green
} else {
Write-Host "Файлы старше $DaysThreshold дней не найдены." -ForegroundColor Green
}
Основные моменты:
1. Гибкая настройка пути: в переменной
$LogPath можно указать любую директорию – например, логи SQL Server (C:\Program Files\Microsoft SQL Server\MSSQLxx.MSSQLSERVER\MSSQL\Log) или системные временные папки (C:\Windows\Temp).2. Параметр возраста: переменная
$DaysThreshold задаёт, сколько дней «жить» файлам, прежде чем они удалятся. Можно настроить, например, на 7 дней для критических логов или на 90 дней для менее важных.3. Рекурсивный обход: флаг
-Recurse позволяет удалять не только файлы в корне, но и во вложенных папках (удобно, если логи разбиты по датам или подпапкам).4. Безопасность: перед удалением скрипт выводит список удаляемых файлов. Если сомневаетесь — закомментируйте строку
Remove-Item и сначала просто отследите, какие файлы будут выбраны.💬 Я запланировал выполнение этого скрипта через Task Scheduler каждую неделю в воскресенье в полночь. В результате освободилось несколько десятков гигабайт и администраторы перестали получать тревожные письма о заполненном разделе C:.
А как вы справляетесь с накоплением логов на серверах? Может, используете какие-то централизованные решения (SIEM, Splunk, ELK) для ретеншена и ротации? Делитесь своими приёмами в комментариях!
👉 @win_sysadmin
🔥7👍6
👋 Привет, админы!
Вспоминаю случай, когда утром в понедельник один из наших веб-сервисов внезапно перестал отвечать — выяснилось, что сертификат SSL на фронт-енд прокси истёк. Это напомнило, как легко потерять доступ к важным системам из-за банального администрирования сертификатов.
🔥 Чтобы автоматизировать проверку сроков действия сертификатов в Windows, можно использовать PowerShell. Вот базовый скрипт, который ищет в хранилище LocalMachine\My сертификаты, у которых осталось менее 30 дней до истечения, и отправляет уведомление на почту:
Этот хук можно запускать ежедневно по расписанию через Task Scheduler или превратить в задачу Azure Automation / Runbook.
Также рекомендую добавить логирование в файл и интеграцию с вашим мониторингом (Zabbix, PRTG, SCOM), чтобы видеть историю предупреждений.
💬 А вы как контролируете сроки действия сертификатов? Может, используете специальные модули (PSPKI, Posh-ACME) или облачные сервисы? Делитесь идеями и скриптами в комментариях!
👉 @win_sysadmin
Вспоминаю случай, когда утром в понедельник один из наших веб-сервисов внезапно перестал отвечать — выяснилось, что сертификат SSL на фронт-енд прокси истёк. Это напомнило, как легко потерять доступ к важным системам из-за банального администрирования сертификатов.
🔥 Чтобы автоматизировать проверку сроков действия сертификатов в Windows, можно использовать PowerShell. Вот базовый скрипт, который ищет в хранилище LocalMachine\My сертификаты, у которых осталось менее 30 дней до истечения, и отправляет уведомление на почту:
# Порог в днях до истечения
$threshold = 30
# Получаем все сертификаты, у которых осталось <= $threshold дней
$certs = Get-ChildItem Cert:\LocalMachine\My |
Where-Object { ($_.NotAfter - (Get-Date)).Days -le $threshold }
if ($certs) {
# Формируем тело письма
$body = $certs | ForEach-Object {
"Сертификат: $($_.Subject) ― истекает через $((($_.NotAfter) - (Get-Date)).Days) дней, дата истечения: $($_.NotAfter)"
} -join "`n"
# Отправляем письмо
Send-MailMessage `
-From "monitor@domain.local" `
-To "admin@domain.local" `
-Subject "Внимание: сертификаты SSL скоро истекут" `
-Body $body `
-SmtpServer "mail.domain.local"
}
Этот хук можно запускать ежедневно по расписанию через Task Scheduler или превратить в задачу Azure Automation / Runbook.
Также рекомендую добавить логирование в файл и интеграцию с вашим мониторингом (Zabbix, PRTG, SCOM), чтобы видеть историю предупреждений.
💬 А вы как контролируете сроки действия сертификатов? Может, используете специальные модули (PSPKI, Posh-ACME) или облачные сервисы? Делитесь идеями и скриптами в комментариях!
👉 @win_sysadmin
👍11
👋 Привет, админы!
Как быстро проверить, какие пользователи имеют права администратора на сотне удалённых серверов?
Ручной подход, это бессмысленная трата времени и риска забыть какой-то хост, поэтому я собрал небольшой PowerShell-скрипт для автоматического аудита.
🛠 Что делает скрипт:
◾️Берёт список серверов из файла
◾️Через
◾️Обрабатывает ошибки (например, недоступный сервер)
◾️Экспортирует итоговый отчёт в CSV с датой в имени
Этот подход легко расширить — добавить уведомление по почте через
👉 @win_sysadmin
Как быстро проверить, какие пользователи имеют права администратора на сотне удалённых серверов?
Ручной подход, это бессмысленная трата времени и риска забыть какой-то хост, поэтому я собрал небольшой PowerShell-скрипт для автоматического аудита.
# Список серверов в текстовом файле (по одному в строке)
$servers = Get-Content -Path "C:\noscripts\servers.txt"
# Формируем результаты
$report = foreach ($server in $servers) {
Try {
Invoke-Command -ComputerName $server -ScriptBlock {
Get-LocalGroupMember -Group "Administrators" |
Select-Object @{Name='Server';Expression={$env:COMPUTERNAME}},
Name, ObjectClass
} -ErrorAction Stop
}
Catch {
[PSCustomObject]@{
Server = $server
Name = '<не удалось получить данные>'
ObjectClass = 'Error'
}
}
}
# Сохраняем в CSV и открываем
$csvPath = "C:\reports\AdminsAudit_$(Get-Date -Format yyyy-MM-dd).csv"
$report | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
Invoke-Item $csvPath
🛠 Что делает скрипт:
◾️Берёт список серверов из файла
servers.txt◾️Через
Invoke-Command собирает членов локальной группы Administrators на каждом хосте◾️Обрабатывает ошибки (например, недоступный сервер)
◾️Экспортирует итоговый отчёт в CSV с датой в имени
Этот подход легко расширить — добавить уведомление по почте через
Send-MailMessage или интеграцию с Teams/Slack, а также запускать по расписанию в Task Scheduler или Azure Automation.👉 @win_sysadmin
👍15❤1
👋 Привет, админы!
На этой неделе в нашем кластере файловых серверов неожиданно начал быстро расти объём используемого пространства на диске C:, и в итоге свободного места осталось менее 5 %. Из-за этого падали бэкапы и тормозили пользовательские шаринги.
🔥 Чтобы оперативно собрать информацию о свободном месте на всех серверах и получить наглядный отчёт, я использовал такой PowerShell-скрипт:
Этот скрипт помогает мгновенно увидеть, на каких серверах и дисках критически мало места. Я настроил его запуск раз в час через Task Scheduler и добавил оповещение по почте, если Used(%) превышает 90 %.
👉 @win_sysadmin
На этой неделе в нашем кластере файловых серверов неожиданно начал быстро расти объём используемого пространства на диске C:, и в итоге свободного места осталось менее 5 %. Из-за этого падали бэкапы и тормозили пользовательские шаринги.
🔥 Чтобы оперативно собрать информацию о свободном месте на всех серверах и получить наглядный отчёт, я использовал такой PowerShell-скрипт:
# Список серверов можно вынести в текстовый файл или переменную
$servers = @('FS01','FS02','FS03')
# Сбор информации о дисках
$result = foreach ($s in $servers) {
Get-PSDrive -PSProvider FileSystem -ComputerName $s |
Select-Object @{Name='Server';Expression={$s}},
Name,
@{Name='Free(GB)';Expression={[math]::Round($_.Free/1GB,2)}},
@{Name='Used(%)';Expression={[math]::Round((($_.Used)/($_.Free + $_.Used))*100,1)}}
}
# Сохраняем в CSV для дальнейшего анализа
$result | Export-Csv -Path C:\Reports\DiskSpaceReport.csv -NoTypeInformation -Encoding UTF8
# Или выводим сразу в виде таблицы в консоли
$result | Format-Table -AutoSize
Этот скрипт помогает мгновенно увидеть, на каких серверах и дисках критически мало места. Я настроил его запуск раз в час через Task Scheduler и добавил оповещение по почте, если Used(%) превышает 90 %.
👉 @win_sysadmin
👍7❤3
👋 Привет, админы!
Из жизни. На продакшн-сервере упал веб-сервис, выяснилось, что SSL-сертификат истёк в 00:01, а пользователи начали получать ошибки подключения. Пришлось оперативно проверять все сертификаты.
Для быстрой диагностики я написал PowerShell-скрипт, который подключается к списку серверов, собирает все сертификаты и рассчитывает, сколько дней осталось до их истечения:
Этот скрипт выводит таблицу с оставшимися днями жизни (DaysLeft) каждого сертификата, упорядоченную по возрастанию. Те, у которых
👉 @win_sysadmin
Из жизни. На продакшн-сервере упал веб-сервис, выяснилось, что SSL-сертификат истёк в 00:01, а пользователи начали получать ошибки подключения. Пришлось оперативно проверять все сертификаты.
Для быстрой диагностики я написал PowerShell-скрипт, который подключается к списку серверов, собирает все сертификаты и рассчитывает, сколько дней осталось до их истечения:
$servers = @("web01","web02","web03")
$results = foreach($server in $servers) {
Write-Verbose "Проверяю сертификаты на $server"
Get-ChildItem -Path "\\$server\C$\Windows\System32\certsrv\CertEnroll" -Recurse -Include *.cer,*.pfx |
ForEach-Object {
try {
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($_.FullName)
[PSCustomObject]@{
Server = $server
Subject = $cert.Subject
NotAfter = $cert.NotAfter
DaysLeft = ($cert.NotAfter - (Get-Date)).Days
}
} catch {
Write-Warning "Не удалось загрузить сертификат из $($_.FullName) на $server"
}
}
}
$results | Sort-Object DaysLeft | Format-Table -AutoSize
Этот скрипт выводит таблицу с оставшимися днями жизни (DaysLeft) каждого сертификата, упорядоченную по возрастанию. Те, у которых
DaysLeft≈0 или отрицательно, сразу бросаются в глаза. В реальной инфраструктуре я добавил отправку результата по e-mail через Send-MailMessage и запланировал задачу в Task Scheduler с ежедневным запуском.👉 @win_sysadmin
👍12❤1
👋 Привет, админы!
Однажды словил интересный баг с WinRM на новых машинах в домене. После настройки через GPO и попытки подключения по PowerShell Remoting - облом.
Хотя DNS работает, ping проходит, GPO с настройками WinRM прилетела. Где собака зарыта?
Проблема оказалась в отсутствии регистрации SPN для машины в AD. Без него Kerberos просто не может авторизовать подключение. Решается вот так:
Если машин много - автоматизируем через PowerShell:
⚠️Конечно, нужны права на запись SPN (обычно у админа домена). После регистрации SPN, всё взлетело без ошибок.
👉 @win_sysadmin
Однажды словил интересный баг с WinRM на новых машинах в домене. После настройки через GPO и попытки подключения по PowerShell Remoting - облом.
WinRM cannot process the request. The following error occurred while using Kerberos authentication: Cannot find the computer X. Verify that the computer exists on the network and that the name provided is spelled correctly.
Хотя DNS работает, ping проходит, GPO с настройками WinRM прилетела. Где собака зарыта?
Проблема оказалась в отсутствии регистрации SPN для машины в AD. Без него Kerberos просто не может авторизовать подключение. Решается вот так:
setspn -S WSMAN/имя_компьютера имя_компьютера
Если машин много - автоматизируем через PowerShell:
$computers = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
foreach ($comp in $computers) {
setspn -S "WSMAN/$comp" $comp
}
⚠️Конечно, нужны права на запись SPN (обычно у админа домена). После регистрации SPN, всё взлетело без ошибок.
👉 @win_sysadmin
👍10❤2👎1
👋 Привет, админы!
Сегодня тема, которая не раз спасала мою нервную систему в пятницу вечером, это мгновенное восстановление объектов в Active Directory.
Бывало такое: случайно удалили не ту учетку, группу или, не дай бог, целую OU? Лезть в бэкапы (Veeam/WSB) ради одного объекта - это долго, муторно, да и простой для пользователя. Решаем проблему красиво.
Суть:
Многие забывают, что начиная с Server 2008 R2 в AD есть «Корзина» (AD Recycle Bin), но по умолчанию она выключена! Если она не активна, удаленный объект улетает в небытие (Tombstone), теряя атрибуты и членство в группах.
Как проверить и включить:
Запускаем PowerShell от админа. Проверяем статус:
Если в
Как восстановить удаленное:
Допустим, снесли пользователя
💡 Совет:
В новых версиях Windows Server (2012+) есть GUI для этого в Active Directory Administrative Center, но консоль грузится вечность. PowerShell отрабатывает за секунды. Проверьте прямо сейчас, включена ли у вас корзина, чтобы потом не кусать локти.
🛠️ #activedirectory #powershell #recovery #лайфхак
👉 @win_sysadmin
Сегодня тема, которая не раз спасала мою нервную систему в пятницу вечером, это мгновенное восстановление объектов в Active Directory.
Бывало такое: случайно удалили не ту учетку, группу или, не дай бог, целую OU? Лезть в бэкапы (Veeam/WSB) ради одного объекта - это долго, муторно, да и простой для пользователя. Решаем проблему красиво.
Суть:
Многие забывают, что начиная с Server 2008 R2 в AD есть «Корзина» (AD Recycle Bin), но по умолчанию она выключена! Если она не активна, удаленный объект улетает в небытие (Tombstone), теряя атрибуты и членство в группах.
Как проверить и включить:
Запускаем PowerShell от админа. Проверяем статус:
Get-ADOptionalFeature -Filter {Name -like "Recycle Bin Feature"} | Select-Object Name, EnabledScopes
Если в
EnabledScopes пусто, значит, корзина выключена. Включаем (учтите, действие необратимое, отключить потом нельзя, но оно и не нужно):
Enable-ADOptionalFeature 'Recycle Bin Feature' -Scope ForestOrConfigurationSet -Target 'yourdomain.com'
Как восстановить удаленное:
Допустим, снесли пользователя
ivanov. Не нужно никаких сторонних утилит, одна строка вернет его со всеми группами и правами:
Get-ADObject -Filter 'Name -like "*ivanov*"' -IncludeDeletedObjects | Restore-ADObject
💡 Совет:
В новых версиях Windows Server (2012+) есть GUI для этого в Active Directory Administrative Center, но консоль грузится вечность. PowerShell отрабатывает за секунды. Проверьте прямо сейчас, включена ли у вас корзина, чтобы потом не кусать локти.
🛠️ #activedirectory #powershell #recovery #лайфхак
👉 @win_sysadmin
👍14🔥4❤2
👋 Привет, админы!
🔥 Делюсь скриптом, который создаёт и настраивает GPO, а потом линкует её к OU. Всё через PowerShell:
Под капотом это обычная настройка через
👉 @win_sysadmin
🔥 Делюсь скриптом, который создаёт и настраивает GPO, а потом линкует её к OU. Всё через PowerShell:
# Имя новой политики и OU
$gpoName = "WinRM Config"
$ou = "OU=Servers,DC=domain,DC=local"
# Создаём политику, если её ещё нет
if (-not (Get-GPO -Name $gpoName -ErrorAction SilentlyContinue)) {
New-GPO -Name $gpoName
}
# Настраиваем WinRM в этой политике
$gpo = Get-GPO -Name $gpoName
Set-GPRegistryValue -Name $gpo.DisplayName -Key "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" `
-ValueName "AllowAutoConfig" -Type DWord -Value 1
Set-GPRegistryValue -Name $gpo.DisplayName -Key "HKLM\SOFTWARE\Policies\Microsoft\Windows\WinRM\Service" `
-ValueName "AllowUnencryptedTraffic" -Type DWord -Value 0
# Линкуем GPO к нужному OU
New-GPLink -Name $gpoName -Target $ou -Enforced $false
Под капотом это обычная настройка через
Set-GPRegistryValue, но ты можешь добавлять туда любые параметры: фаервол, автологон, аудит и т.д.👉 @win_sysadmin
❤6👍6🔥3
👋 Привет, админы!
Продолжая тему SPN, сегодня расскажу, как отслеживать изменения SPN в AD. Был у меня кейс: один коллега удалил SPN у критического сервера (по ошибке, конечно 😅), и всё, WinRM лег, приложения не коннектятся. Алертов не было. Делать так - нельзя.
🔥 Вот скрипт, который можно повесить на задачу по расписанию. Он проверяет наличие SPN
Можно доработать писать в лог, интегрировать с SIEM, триггерить webhook в Zabbix и т.д. Главное, не терять SPN из виду. Один сбой может стоить кучи нервов.
👉 @win_sysadmin
Продолжая тему SPN, сегодня расскажу, как отслеживать изменения SPN в AD. Был у меня кейс: один коллега удалил SPN у критического сервера (по ошибке, конечно 😅), и всё, WinRM лег, приложения не коннектятся. Алертов не было. Делать так - нельзя.
🔥 Вот скрипт, который можно повесить на задачу по расписанию. Он проверяет наличие SPN
WSMAN/имя_компьютера и шлёт алерт, если он исчез:
$computers = Get-ADComputer -Filter * -Properties ServicePrincipalName
$missingSpn = @()
foreach ($comp in $computers) {
$expectedSpn = "WSMAN/$($comp.Name)"
if (-not ($comp.ServicePrincipalName -contains $expectedSpn)) {
$missingSpn += $comp.Name
}
}
if ($missingSpn.Count -gt 0) {
$body = "На следующих машинах отсутствует SPN WSMAN:`n" + ($missingSpn -join "`n")
Send-MailMessage -To "admin@domain.local" -From "spn-monitor@domain.local" `
-Subject "❗ Отсутствует SPN WSMAN" -Body $body -SmtpServer "smtp.domain.local"
}
Можно доработать писать в лог, интегрировать с SIEM, триггерить webhook в Zabbix и т.д. Главное, не терять SPN из виду. Один сбой может стоить кучи нервов.
👉 @win_sysadmin
👍6
👋 Привет, админы!
Помнишь, мы говорили про мониторинг SPN? Так вот — одно дело заметить пропажу, а другое — сразу восстановить, пока не прилетели тикеты от пользователей и не начался хаос.
🔥 Вот PowerShell-скрипт, который проверяет наличие SPN
📌 Советую запускать это от имени учётки с правами на изменение SPN в AD. Можно повесить на планировщик или встроить в CI/CD пайплайн, если сервера поднимаются автоматически.
💡 Плюс: можно логировать в файл или отправлять уведомление при каждом восстановлении — для прозрачности.
💬 А у тебя бывали случаи, когда SPN пропадал и ломал всё? Как автоматизируешь восстановление? Делись кейсами в комментах 👇
👉 @win_sysadmin
Помнишь, мы говорили про мониторинг SPN? Так вот — одно дело заметить пропажу, а другое — сразу восстановить, пока не прилетели тикеты от пользователей и не начался хаос.
🔥 Вот PowerShell-скрипт, который проверяет наличие SPN
WSMAN/имя_компьютера и добавляет его обратно, если нужно:
Import-Module ActiveDirectory
$computers = Get-ADComputer -Filter * -Properties ServicePrincipalName
foreach ($comp in $computers) {
$spn = "WSMAN/$($comp.Name)"
if (-not ($comp.ServicePrincipalName -contains $spn)) {
try {
Write-Host "Восстанавливаю SPN для $($comp.Name)..." -ForegroundColor Yellow
setspn -S $spn $comp.Name
}
catch {
Write-Host "❌ Ошибка для $($comp.Name): $_" -ForegroundColor Red
}
}
}
📌 Советую запускать это от имени учётки с правами на изменение SPN в AD. Можно повесить на планировщик или встроить в CI/CD пайплайн, если сервера поднимаются автоматически.
💡 Плюс: можно логировать в файл или отправлять уведомление при каждом восстановлении — для прозрачности.
💬 А у тебя бывали случаи, когда SPN пропадал и ломал всё? Как автоматизируешь восстановление? Делись кейсами в комментах 👇
👉 @win_sysadmin
👎2👍1
👋 Привет, админы!
Неприятая ситуацию - на проде перестали запускаться скрипты PowerShell через Task Scheduler. Причём руками всё работает, а в планировщике - ноль реакции. Думаю, многим знакома такая картина.
🔍 В чём была проблема:
Оказалось, после обновления безопасности Windows один из серверов начал блокировать запуск скриптов из-за политики исполнения (
🛠️ Решение простое, всегда явно указывай политику исполнения при запуске из планировщика:
И не забудь, что путь к скрипту должен быть абсолютным, иначе Task Scheduler не найдёт файл, особенно если он запускается от
📌 если нужно логирование, добавь вывод в файл:
👉 @win_sysadmin
Неприятая ситуацию - на проде перестали запускаться скрипты PowerShell через Task Scheduler. Причём руками всё работает, а в планировщике - ноль реакции. Думаю, многим знакома такая картина.
🔍 В чём была проблема:
Оказалось, после обновления безопасности Windows один из серверов начал блокировать запуск скриптов из-за политики исполнения (
ExecutionPolicy). А в задаче стояло просто powershell.exe -File ..., без указания параметров.🛠️ Решение простое, всегда явно указывай политику исполнения при запуске из планировщика:
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\Backup.ps1"
И не забудь, что путь к скрипту должен быть абсолютным, иначе Task Scheduler не найдёт файл, особенно если он запускается от
SYSTEM или другого сервиса без профиля.📌 если нужно логирование, добавь вывод в файл:
powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\Backup.ps1" >> C:\Logs\backup.log 2>&1
👉 @win_sysadmin
👍10😁4
👋 Привет, админы!
Недавно один из серверов начал ругаться на нехватку места на диске. Визуально всё в порядке, но свободного осталось меньше 1 ГБ. Надо было срочно найти, кто пожрал диск. Делюсь простым, но мощным PowerShell-способом найти самые тяжёлые файлы:
📦 Поиск топ-10 самых больших файлов на диске:
Что делает скрипт:
* Рекурсивно обходит все файлы (
* Отбрасывает каталоги (
* Сортирует по размеру
* Показывает путь и размер в МБ
📍 Хочешь ограничить область поиска? Просто меняй
⚡ Очень выручает, когда надо быстро понять, где «накапало» мусора, особенно в
А у тебя есть свой любимый способ находить крупные файлы в Windows? Используешь PowerShell, WinDirStat или что-то кастомное?
👉 @win_sysadmin
Недавно один из серверов начал ругаться на нехватку места на диске. Визуально всё в порядке, но свободного осталось меньше 1 ГБ. Надо было срочно найти, кто пожрал диск. Делюсь простым, но мощным PowerShell-способом найти самые тяжёлые файлы:
📦 Поиск топ-10 самых больших файлов на диске:
Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue |
Where-Object { -not $_.PSIsContainer } |
Sort-Object Length -Descending |
Select-Object FullName, @{Name="SizeMB";Expression={"{0:N2}" -f ($_.Length / 1MB)}} -First 10
Что делает скрипт:
* Рекурсивно обходит все файлы (
-Recurse)* Отбрасывает каталоги (
Where-Object { -not $_.PSIsContainer })* Сортирует по размеру
* Показывает путь и размер в МБ
📍 Хочешь ограничить область поиска? Просто меняй
-Path, например:
-Path "C:\Users", "D:\Temp"
⚡ Очень выручает, когда надо быстро понять, где «накапало» мусора, особенно в
TEMP, профилях пользователей или логах каких-нибудь нестабильных приложений.А у тебя есть свой любимый способ находить крупные файлы в Windows? Используешь PowerShell, WinDirStat или что-то кастомное?
👉 @win_sysadmin
🔥8👍6❤2
👋 Привет, админы!
Попался мне на днях любопытный случай: один из пользователей жаловался, что после входа в систему медленно прогружается рабочий стол, хотя железо бодрое и диск в порядке.
🔍 Начал копать — и довольно быстро нашёл виновника: в автозагрузке сидела куча мусора, но особенно отличился один Group Policy скрипт, который пытался смонтировать сетевой ресурс, которого уже не существует.
📌 Чтобы быстро проверить, какие групповые политики срабатывают при входе, и сколько времени они занимают, запустил на клиенте:
🕵️ ID 4016 — начало применения политики,
🕵️ ID 5312 — завершение.
Так можно выловить тормоза и даже понять, какой GPO затягивает загрузку. В моем случае один скрипт отрабатывал почти 90 секунд — удалил его, и всё полетело.
💬 А вы анализируете Group Policy лог? Или предпочитаете сторонние утилиты типа PolicyReporter, AGPM и т.п.? Делитесь своим опытом!
👉 @win_sysadmin
Попался мне на днях любопытный случай: один из пользователей жаловался, что после входа в систему медленно прогружается рабочий стол, хотя железо бодрое и диск в порядке.
🔍 Начал копать — и довольно быстро нашёл виновника: в автозагрузке сидела куча мусора, но особенно отличился один Group Policy скрипт, который пытался смонтировать сетевой ресурс, которого уже не существует.
📌 Чтобы быстро проверить, какие групповые политики срабатывают при входе, и сколько времени они занимают, запустил на клиенте:
Get-WinEvent -LogName Microsoft-Windows-GroupPolicy/Operational |
Where-Object { $_.Id -eq 4016 -or $_.Id -eq 5312 } |
Select-Object TimeCreated, Id, Message | Sort-Object TimeCreated -Descending
🕵️ ID 4016 — начало применения политики,
🕵️ ID 5312 — завершение.
Так можно выловить тормоза и даже понять, какой GPO затягивает загрузку. В моем случае один скрипт отрабатывал почти 90 секунд — удалил его, и всё полетело.
💬 А вы анализируете Group Policy лог? Или предпочитаете сторонние утилиты типа PolicyReporter, AGPM и т.п.? Делитесь своим опытом!
👉 @win_sysadmin
👍17⚡1
👋 Привет, админы!
Сегодня расскажу про один неприятный и коварный момент, с которым столкнулся буквально на днях - невозможность запустить скрипт PowerShell из планировщика задач, хотя руками он работает идеально.
🧩 Суть:
Есть скрипт
🔍 Что помогло выяснить причину:
1. В Action указывал не сам скрипт, а запуск
2. Обязательно указал "Start in" (рабочую папку), иначе относительные пути внутри скрипта не работали.
3. Заменил
4. В General поставил галочку "Run with highest privileges" - без этого не было доступа к сетевым путям и не выполнялись некоторые команды.
💡В итоге: Task Scheduler штука капризная, особенно с PowerShell. Поэтому всегда логируйте выход скрипта в файл, добавляйте
📌 Полный пример команды в задаче:
💬 А у вас бывали такие странности с планировщиком задач? Как отлаживаете такие случаи?
👉 @win_sysadmin
Сегодня расскажу про один неприятный и коварный момент, с которым столкнулся буквально на днях - невозможность запустить скрипт PowerShell из планировщика задач, хотя руками он работает идеально.
🧩 Суть:
Есть скрипт
.ps1, который делает бэкап и отправляет отчёт по почте. Запускаешь вручную — всё отлично. Но через Task Scheduler - тишина, никакой ошибки, ничего не происходит.🔍 Что помогло выяснить причину:
1. В Action указывал не сам скрипт, а запуск
powershell.exe с аргументами:
-ExecutionPolicy Bypass -File "C:\Scripts\Backup.ps1"
2. Обязательно указал "Start in" (рабочую папку), иначе относительные пути внутри скрипта не работали.
3. Заменил
powershell.exe на powershell.exe -NoProfile, чтобы избежать подвисаний из-за пользовательского профиля.4. В General поставил галочку "Run with highest privileges" - без этого не было доступа к сетевым путям и не выполнялись некоторые команды.
💡В итоге: Task Scheduler штука капризная, особенно с PowerShell. Поэтому всегда логируйте выход скрипта в файл, добавляйте
Start-Trannoscript и Stop-Trannoscript, и не забывайте про -NoProfile.📌 Полный пример команды в задаче:
Program/noscript: powershell.exe
Add arguments: -NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Backup.ps1"
Start in: C:\Scripts
💬 А у вас бывали такие странности с планировщиком задач? Как отлаживаете такие случаи?
👉 @win_sysadmin
👍10❤2🔥1
👋 Привет, админы!
Если в домене внезапно начинают сыпаться жалобы вроде «не могу зайти, пароль верный» - один из первых шагов в расследовании: поиск заблокированных аккаунтов.
🔥 Вот простой PowerShell one-liner, который покажет всех заблокированных пользователей в Active Directory:
Эта команда выведет список пользователей, у которых стоит флаг
📌 А если хочешь сразу разблокировать всех (например, в тестовой среде):
⚠️ Но аккуратнее с этим, лучше сначала выяснить почему аккаунты блокируются. Часто причина это забытые пароли в автозапусках, мобильные устройства или сохранённые учётки на старых ПК.
💬 А как вы отслеживаете такие инциденты? Есть любимый способ логирования или используете сторонние решения типа ADAudit Plus?
👉 @win_sysadmin
Если в домене внезапно начинают сыпаться жалобы вроде «не могу зайти, пароль верный» - один из первых шагов в расследовании: поиск заблокированных аккаунтов.
🔥 Вот простой PowerShell one-liner, который покажет всех заблокированных пользователей в Active Directory:
Search-ADAccount -LockedOut | Select-Object Name, SamAccountName, LockedOut, LastLogonDate
Эта команда выведет список пользователей, у которых стоит флаг
LockedOut. Особенно удобно, если нужно быстро понять масштаб проблемы или найти конкретного "жертву GPO".📌 А если хочешь сразу разблокировать всех (например, в тестовой среде):
Search-ADAccount -LockedOut | Unlock-ADAccount
⚠️ Но аккуратнее с этим, лучше сначала выяснить почему аккаунты блокируются. Часто причина это забытые пароли в автозапусках, мобильные устройства или сохранённые учётки на старых ПК.
💬 А как вы отслеживаете такие инциденты? Есть любимый способ логирования или используете сторонние решения типа ADAudit Plus?
👉 @win_sysadmin
👍5❤2