👋 Привет, админы!
Если вы уже мониторите события 4625 (неудачные входы по RDP), следующий шаг — автоматическая блокировка IP-адресов, которые слишком активно пытаются попасть на сервер.
Вот скрипт, который парсит события и блокирует агрессивные IP:
📌 Что делает скрипт:
- Ищет за последние 15 минут события 4625 по RDP
- Вычисляет IP-адреса с 5+ неудачами
- Создаёт firewall-правило на блокировку
💡 Можно запустить по расписанию через
⚠️ Важно: не переусердствуйте — может прилететь блокировка легитимного VPN или админа. Лучше держать whitelist.
💬 А вы используете автоматические блокировки? Или предпочитаете fail2ban на edge-хостах/Linux-бастионках?
👉 @win_sysadmin
Если вы уже мониторите события 4625 (неудачные входы по RDP), следующий шаг — автоматическая блокировка IP-адресов, которые слишком активно пытаются попасть на сервер.
Вот скрипт, который парсит события и блокирует агрессивные IP:
# RDPBlockBadIPs.ps1
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625;
StartTime = (Get-Date).AddMinutes(-15)
} | Where-Object {
$_.Properties[10].Value -eq '10' # Logon Type 10 = RDP
}
$badIPs = $events |
Group-Object { $_.Properties[18].Value } |
Where-Object { $_.Count -ge 5 } | # Порог блокировки
Select-Object -ExpandProperty Name
foreach ($ip in $badIPs) {
if ($ip -and ($ip -match '\d+\.\d+\.\d+\.\d+')) {
Write-Host "Блокирую IP: $ip"
New-NetFirewallRule -DisplayName "Block RDP Brute $ip" `
-Direction Inbound `
-RemoteAddress $ip `
-Action Block `
-Protocol TCP `
-LocalPort 3389 `
-Profile Any
}
}
📌 Что делает скрипт:
- Ищет за последние 15 минут события 4625 по RDP
- Вычисляет IP-адреса с 5+ неудачами
- Создаёт firewall-правило на блокировку
💡 Можно запустить по расписанию через
Scheduled Task, как в предыдущем посте. А если хочется очистку — можно добавить автоудаление блоков по TTL.⚠️ Важно: не переусердствуйте — может прилететь блокировка легитимного VPN или админа. Лучше держать whitelist.
💬 А вы используете автоматические блокировки? Или предпочитаете fail2ban на edge-хостах/Linux-бастионках?
👉 @win_sysadmin
👍5❤2
👋 Привет, админы!
Если у вас больше одного сервера, вручную выискивать RDP-брутфорс или другие попытки взлома — гиблое дело. Нам нужен централизованный сбор логов, особенно событий типа 4625, 4624, 4778 и т.п.
🎯 Есть несколько вариантов. Сегодня покажу один из самых доступных:
Windows Event Forwarding (WEF) + Event Collector.
📌 Как это работает:
- Сервер выступает как Collector (принимает логи)
- Клиенты (другие Windows-машины) — подписчики
- Всё через встроенный WinRM и GPO
🛠️ Настройка WEF в 3 шага
1. Включаем службу на Collector’е:
Это создаст необходимую подписку и включит службу Windows Event Collector.
2. Создаём подписку:
- Тип: Collector initiated
- Event log: Security
- Filter: Id=4625;4624;4778
- Advanced: выбрать нужные
3. Настраиваем GPO на клиентах:
В GPO для машин, откуда хотим собирать логи:
-
- Configure target Subnoscription Manager
Значение:
- Включаем WinRM:
📊 После настройки Collector будет видеть все входы/неудачные попытки и прочие события в одном месте.
Можно дальше интегрировать:
- в SIEM (например, Wazuh, ELK, Sentinel)
- или просто логировать/оповещать через PowerShell скрипты
💬 А вы уже собираете логи централизованно? Или только на проде? Что используете — WEF, Syslog, Agent’ы?
👉 @win_sysadmin
Если у вас больше одного сервера, вручную выискивать RDP-брутфорс или другие попытки взлома — гиблое дело. Нам нужен централизованный сбор логов, особенно событий типа 4625, 4624, 4778 и т.п.
🎯 Есть несколько вариантов. Сегодня покажу один из самых доступных:
Windows Event Forwarding (WEF) + Event Collector.
📌 Как это работает:
- Сервер выступает как Collector (принимает логи)
- Клиенты (другие Windows-машины) — подписчики
- Всё через встроенный WinRM и GPO
🛠️ Настройка WEF в 3 шага
1. Включаем службу на Collector’е:
wecutil qc
Это создаст необходимую подписку и включит службу Windows Event Collector.
2. Создаём подписку:
# Открыть Event Viewer → Subnoscriptions → Create Subnoscription
- Тип: Collector initiated
- Event log: Security
- Filter: Id=4625;4624;4778
- Advanced: выбрать нужные
LogonType, если хотите только RDP3. Настраиваем GPO на клиентах:
В GPO для машин, откуда хотим собирать логи:
-
Computer Configuration → Administrative Templates → Windows Components → Event Forwarding- Configure target Subnoscription Manager
Значение:
Server=http://COLLECTOR:5985/wsman/SubnoscriptionManager/WEC- Включаем WinRM:
Enable-PSRemoting -Force
📊 После настройки Collector будет видеть все входы/неудачные попытки и прочие события в одном месте.
Можно дальше интегрировать:
- в SIEM (например, Wazuh, ELK, Sentinel)
- или просто логировать/оповещать через PowerShell скрипты
💬 А вы уже собираете логи централизованно? Или только на проде? Что используете — WEF, Syslog, Agent’ы?
👉 @win_sysadmin
👍5
👋 Привет, админы!
Если вы уже используете Wazuh (open-source SIEM), то грех не настроить сбор событий безопасности с Windows, особенно для анализа логинов и брутфорса по RDP.
Вот как это делается 👇
🛠️ Установка Wazuh Agent на Windows
1. Скачиваем агент отсюда: https://wazuh.com/
2. Устанавливаем с указанием менеджера (сервер Wazuh):
3. После установки — правим
4. Перезапускаем агент:
📋 Что собирает агент?
По умолчанию:
- События из Security, System, Application
- Входы в систему (
- Изменения в учётках, политиках, реестре
- Информация об установке/удалении софта
🎯 Всё это попадает в дашборд Wazuh и может быть обработано правилами: алерты, уведомления, триггеры.
🔥 Пример алерта в Wazuh при брутфорсе по RDP:
📌 Это можно отправить на почту, в Telegram, или автоматизировать блокировку IP (например, через Active Responses).
💬 А вы уже пробовали Wazuh или у вас другая SIEM-система? Сравнивали с Graylog, Splunk, Sentinel?
👉 @win_sysadmin
Если вы уже используете Wazuh (open-source SIEM), то грех не настроить сбор событий безопасности с Windows, особенно для анализа логинов и брутфорса по RDP.
Вот как это делается 👇
🛠️ Установка Wazuh Agent на Windows
1. Скачиваем агент отсюда: https://wazuh.com/
2. Устанавливаем с указанием менеджера (сервер Wazuh):
msiexec /i "wazuh-agent-4.x.x.msi" /qn WAZUH_MANAGER="10.0.0.1" WAZUH_REGISTRATION_SERVER="10.0.0.1" WAZUH_AGENT_NAME="srv-win01"
3. После установки — правим
C:\Program Files (x86)\ossec-agent\ossec.conf (если надо вручную задать имя, группы и т.п.)4. Перезапускаем агент:
net stop wazuh-agent
net start wazuh-agent
📋 Что собирает агент?
По умолчанию:
- События из Security, System, Application
- Входы в систему (
4624, 4625, 4778, 4779)- Изменения в учётках, политиках, реестре
- Информация об установке/удалении софта
🎯 Всё это попадает в дашборд Wazuh и может быть обработано правилами: алерты, уведомления, триггеры.
🔥 Пример алерта в Wazuh при брутфорсе по RDP:
{
"rule": {
"id": "18107",
"level": 10,
"denoscription": "Windows RDP brute-force attempt detected",
"group": "windows, authentication_failed, brute_force"
},
"srcip": "192.168.1.200",
"user": "admin",
"location": "Security",
"full_log": "Logon failure: Type 10 (RemoteInteractive)"
}
📌 Это можно отправить на почту, в Telegram, или автоматизировать блокировку IP (например, через Active Responses).
💬 А вы уже пробовали Wazuh или у вас другая SIEM-система? Сравнивали с Graylog, Splunk, Sentinel?
👉 @win_sysadmin
👍7
👋 Привет, админы!
Когда ты видишь сотни логов с событиями 4625 и 4624 — хочется увидеть общую картину, а не ковыряться в логах.
🎯 Решение — визуализация в Grafana, подключённой к Elasticsearch, который использует Wazuh.
🛠️ Что тебе нужно:
✅ Рабочая инсталляция Wazuh с Elasticsearch
✅ Установленная Grafana
✅ Wazuh index (обычно
📊 Пример панели: RDP Logon Failures (Event ID 4625)
Создай визуализацию с такими настройками:
- Query:
- Metric: Count
- Group by:
-
-
-
📌 Это даст тебе:
- Топ IP-адресов, которые ломятся по RDP
- Частоту атак по времени
- Учетки, на которые идёт перебор
📈 Дополнительно:
- Успешные входы (4624) — для сравнения
- RDP session start (4778) и end (4779) — активность пользователей
- GeoIP — можно прикрутить GeoIP-плагин в Elasticsearch и рисовать карту атакующих
🔒 Бонус: Threshold + Alerting
Если за последние 10 минут по одному IP > 10 ошибок входа — можно задать алерт в Grafana и слать в Telegram, Discord, email, webhook.
💬 А вы визуализируете логи безопасности или только хардкор логами и текстами? Что используете — Grafana, Kibana, Zabbix?
👉 @win_sysadmin
Когда ты видишь сотни логов с событиями 4625 и 4624 — хочется увидеть общую картину, а не ковыряться в логах.
🎯 Решение — визуализация в Grafana, подключённой к Elasticsearch, который использует Wazuh.
🛠️ Что тебе нужно:
✅ Рабочая инсталляция Wazuh с Elasticsearch
✅ Установленная Grafana
✅ Wazuh index (обычно
wazuh-alerts-*) подключен как источник данных в Grafana 📊 Пример панели: RDP Logon Failures (Event ID 4625)
Создай визуализацию с такими настройками:
- Query:
data.win.system.eventID:4625 AND data.win.event_data.LogonType:"10" - Metric: Count
- Group by:
-
data.win.event_data.IpAddress.keyword — по IP-
data.win.event_data.TargetUserName.keyword — по пользователю-
@timestamp — по времени (в Histogram)📌 Это даст тебе:
- Топ IP-адресов, которые ломятся по RDP
- Частоту атак по времени
- Учетки, на которые идёт перебор
📈 Дополнительно:
- Успешные входы (4624) — для сравнения
- RDP session start (4778) и end (4779) — активность пользователей
- GeoIP — можно прикрутить GeoIP-плагин в Elasticsearch и рисовать карту атакующих
🔒 Бонус: Threshold + Alerting
Если за последние 10 минут по одному IP > 10 ошибок входа — можно задать алерт в Grafana и слать в Telegram, Discord, email, webhook.
💬 А вы визуализируете логи безопасности или только хардкор логами и текстами? Что используете — Grafana, Kibana, Zabbix?
👉 @win_sysadmin
🔥3👍1
👋 Привет, админы!
На днях столкнулся с интересной ситуацией: служба
Оказалось, что виноват битый файл базы данных обновлений. Решение оказалось простым, но мало кто его делает вручную:
🔥 Вот PowerShell-скрипт, который полностью сбрасывает Windows Update, включая очистку базы данных:
После этого сервер спокойно начал тянуть апдейты. Главное — не забудьте перезапустить сервисы, а лучше сразу проверить доступность обновлений:
(если стоит
🧠 Бонус: если хотите автоматизировать это на нескольких машинах — добавьте
💬 А как вы чините неработающий Windows Update? Используете
👉 @win_sysadmin
На днях столкнулся с интересной ситуацией: служба
Windows Update на одном из серверов Windows Server 2019 просто отказалась стартовать. Перезапуск, reset компонентов — ничего не помогло. Оказалось, что виноват битый файл базы данных обновлений. Решение оказалось простым, но мало кто его делает вручную:
🔥 Вот PowerShell-скрипт, который полностью сбрасывает Windows Update, включая очистку базы данных:
Stop-Service -Name wuauserv -Force
Stop-Service -Name bits -Force
Remove-Item -Path "C:\Windows\SoftwareDistribution" -Recurse -Force
Start-Service -Name wuauserv
Start-Service -Name bits
После этого сервер спокойно начал тянуть апдейты. Главное — не забудьте перезапустить сервисы, а лучше сразу проверить доступность обновлений:
Get-WindowsUpdate
(если стоит
PSWindowsUpdate модуль)🧠 Бонус: если хотите автоматизировать это на нескольких машинах — добавьте
Invoke-Command и в путь!💬 А как вы чините неработающий Windows Update? Используете
sfc, DISM, что-то своё? Расскажите в комментариях, будет полезно коллегам!👉 @win_sysadmin
👍8
👋 Привет, админы!
Сегодня делюсь историей, которая напомнила, насколько важно внимательно читать логи (да-да, даже если их много и лень).
🧩 Проблема: Windows Server 2019 перестал обновляться. Центр обновлений выдавал код ошибки
🔍 Разбор:
Этот код часто указывает на битые или несовместимые компоненты в хранилище компонентов Windows (WinSxS). Сам
Вернул: "Повреждение обнаружено". Тогда:
Процесс шёл долго, но в итоге ошибка осталась. Копнул глубже и выяснилось: проблема в том, что удалены нужные языковые пакеты, которые почему-то требуются при установке обновлений.
💡 Решение:
Переустановил нужный языковой пакет (в моем случае —
📌 Вывод: если видите
- целостность хранилища через
- наличие нужных языков (
- и не удалили ли вы что-то "ненужное" раньше для очистки WinSxS.
💬 А у вас были грабли с
👉 @win_sysadmin
Сегодня делюсь историей, которая напомнила, насколько важно внимательно читать логи (да-да, даже если их много и лень).
🧩 Проблема: Windows Server 2019 перестал обновляться. Центр обновлений выдавал код ошибки
0x800f0988. Вроде ничего критичного, но руководство требует, чтобы всё было "зелёным" в отчётах.🔍 Разбор:
Этот код часто указывает на битые или несовместимые компоненты в хранилище компонентов Windows (WinSxS). Сам
sfc /scannow ничего не нашёл. А вот DISM подсказал:
DISM /Online /Cleanup-Image /CheckHealth
Вернул: "Повреждение обнаружено". Тогда:
DISM /Online /Cleanup-Image /RestoreHealth
Процесс шёл долго, но в итоге ошибка осталась. Копнул глубже и выяснилось: проблема в том, что удалены нужные языковые пакеты, которые почему-то требуются при установке обновлений.
💡 Решение:
Переустановил нужный языковой пакет (в моем случае —
en-US), перезапустил RestoreHealth, после чего обновления пошли как по маслу.
Install-Language en-US
📌 Вывод: если видите
0x800f0988, проверьте:- целостность хранилища через
DISM,- наличие нужных языков (
Get-WinUserLanguageList),- и не удалили ли вы что-то "ненужное" раньше для очистки WinSxS.
💬 А у вас были грабли с
DISM и Windows Update? Делитесь в комментах, интересно собрать коллекцию ошибок 😊👉 @win_sysadmin
👍6
👋 Привет, админы!
Недавно прилетел тикет: "Пользователь не может поменять пароль — ошибка 0x80070056". Если кто не в курсе, это значит "The specified network password is not correct", и возникает она... когда всё вроде бы ОК 🤯
🛠️ В моём случае виновником оказался кэш старого пароля в Credential Manager. Пользователь менял пароль, но RDP-сессия, Outlook и прочее продолжали пытаться авторизоваться по старому — получался конфликт.
📌 Решение:
1. Открыл
2. Удалил все записи, связанные с этим аккаунтом.
3. Перезапустил сеанс — пароль сменился без проблем.
💡 Полезная PowerShell-команда, чтобы напомнить пользователям об этом автоматом (например, при смене пароля):
Иногда простые вещи — самые коварные. Не забывайте про этот момент, особенно если юзеры работают через RDP или VPN.
💬 А у вас часто бывает такое? Может, автоматизировали чистку кэша или используете GPO для этого?
👉 @win_sysadmin
Недавно прилетел тикет: "Пользователь не может поменять пароль — ошибка 0x80070056". Если кто не в курсе, это значит "The specified network password is not correct", и возникает она... когда всё вроде бы ОК 🤯
🛠️ В моём случае виновником оказался кэш старого пароля в Credential Manager. Пользователь менял пароль, но RDP-сессия, Outlook и прочее продолжали пытаться авторизоваться по старому — получался конфликт.
📌 Решение:
1. Открыл
Credential Manager (Панель управления → Учетные данные).2. Удалил все записи, связанные с этим аккаунтом.
3. Перезапустил сеанс — пароль сменился без проблем.
💡 Полезная PowerShell-команда, чтобы напомнить пользователям об этом автоматом (например, при смене пароля):
msg * "Если возникли проблемы после смены пароля — проверьте Credential Manager на старые записи!"
Иногда простые вещи — самые коварные. Не забывайте про этот момент, особенно если юзеры работают через RDP или VPN.
💬 А у вас часто бывает такое? Может, автоматизировали чистку кэша или используете GPO для этого?
👉 @win_sysadmin
👍4
👋 Привет, админы!
Был у меня недавно кейс: нужно было срочно проверить, кто и когда перезагружал сервер. Вроде бы задача простая, но в спешке иногда забываешь точные команды. Делюсь, чтобы не искать в следующий раз:
🕵️♂️ Ловим события перезагрузки через журнал:
Этот запрос покажет, кто инициировал перезагрузку, с какой причиной и когда это было. Очень полезно при разборе неожиданных рестартов или плановых работ, которые никто "не помнит".
✅ Дополнительно можно глянуть системные события ID
🔥 Удобно добавлять эти команды в свой набор “быстрых админских команд”.
💬 А вы ведёте собственный набор таких команд? Может, пора сделать свой PowerShell toolbox?
👉 @win_sysadmin
Был у меня недавно кейс: нужно было срочно проверить, кто и когда перезагружал сервер. Вроде бы задача простая, но в спешке иногда забываешь точные команды. Делюсь, чтобы не искать в следующий раз:
🕵️♂️ Ловим события перезагрузки через журнал:
Get-EventLog -LogName System -Source User32 | Where-Object { $_.EventID -eq 1074 } | Select TimeGenerated, Message | Sort-Object TimeGenerated -Descending
Этот запрос покажет, кто инициировал перезагрузку, с какой причиной и когда это было. Очень полезно при разборе неожиданных рестартов или плановых работ, которые никто "не помнит".
✅ Дополнительно можно глянуть системные события ID
6006 (нормальное выключение) и 6005 (загрузка журнала, т.е. запуск системы):
Get-EventLog -LogName System | Where-Object { $_.EventID -eq 6006 -or $_.EventID -eq 6005 } | Select TimeGenerated, EventID | Sort-Object TimeGenerated -Descending
🔥 Удобно добавлять эти команды в свой набор “быстрых админских команд”.
💬 А вы ведёте собственный набор таких команд? Может, пора сделать свой PowerShell toolbox?
👉 @win_sysadmin
👍11🔥1
👋 Привет, админы!
Недавно попался кейс на проде: скрипты, запускаемые через планировщик задач, начали зависать без ошибок. Вручную всё работало идеально. Начал копать — оказалось, дело в окружении задачи, которое отличается от интерактивной сессии.
Чтобы быстрее дебажить такие ситуации, я добавил в скрипт логирование переменных окружения и директории запуска. Вот минимальный шаблон, который теперь всегда кладу в начало таких задач:
🔥 Благодаря этому сразу видно, под кем и откуда запускается задача. Часто проблема оказывается в банальной нехватке прав или в том, что планировщик стартует скрипт из
💬 А у вас были случаи, когда скрипт в Task Scheduler вел себя не так, как вручную? Как отлавливаете такие баги? Делитесь своим опытом!
👉 @win_sysadmin
Недавно попался кейс на проде: скрипты, запускаемые через планировщик задач, начали зависать без ошибок. Вручную всё работало идеально. Начал копать — оказалось, дело в окружении задачи, которое отличается от интерактивной сессии.
Чтобы быстрее дебажить такие ситуации, я добавил в скрипт логирование переменных окружения и директории запуска. Вот минимальный шаблон, который теперь всегда кладу в начало таких задач:
$log = "C:\Logs\startup-debug-$(Get-Date -Format 'yyyyMMdd-HHmmss').log"
@"
Start Time: $(Get-Date)
User: $env:USERNAME
Computer: $env:COMPUTERNAME
WorkingDir: $(Get-Location)
ScriptPath: $PSCommandPath
ENV_VARS:
$(Get-ChildItem env: | Out-String)
"@ | Out-File -FilePath $log -Encoding UTF8
🔥 Благодаря этому сразу видно, под кем и откуда запускается задача. Часто проблема оказывается в банальной нехватке прав или в том, что планировщик стартует скрипт из
C:\Windows\System32, а не откуда мы ожидали. 💬 А у вас были случаи, когда скрипт в Task Scheduler вел себя не так, как вручную? Как отлавливаете такие баги? Делитесь своим опытом!
👉 @win_sysadmin
👍6🔥1
👋 Привет, админы!
Сегодня расскажу про один кейс, который недавно словил на одном из файловых серверов. Пользователи начали жаловаться, что не могут открыть файлы по SMB — «доступ запрещен», хотя права вроде бы на месте.
📌 В Event Viewer (журнал Security) увидел кучу записей с кодом ошибки 0xc000006d (STATUS_LOGON_FAILURE). А рядом — ещё интереснее: Audit Failure, Logon Type 3, учетка
🔥 Оказалось, что проблема была в сбитом времени на сервере — он отставал на 6 минут от контроллера домена. Из-за этого Kerberos-билеты считались просроченными, и аутентификация тупо ломалась.
📎 Решение:
1. Проверил текущую синхронизацию времени:
2. Перезапустил службу времени и указал правильный NTP:
3. Синхронизировал вручную:
✅ После этого всё заработало, ошибки исчезли, пользователи успокоились.
💬 А у вас были проблемы из-за времени? Как организуете NTP в своей инфраструктуре — отдельный сервер, групповые политики или доверяете AD?
👉 @win_sysadmin
Сегодня расскажу про один кейс, который недавно словил на одном из файловых серверов. Пользователи начали жаловаться, что не могут открыть файлы по SMB — «доступ запрещен», хотя права вроде бы на месте.
📌 В Event Viewer (журнал Security) увидел кучу записей с кодом ошибки 0xc000006d (STATUS_LOGON_FAILURE). А рядом — ещё интереснее: Audit Failure, Logon Type 3, учетка
domain\username. 🔥 Оказалось, что проблема была в сбитом времени на сервере — он отставал на 6 минут от контроллера домена. Из-за этого Kerberos-билеты считались просроченными, и аутентификация тупо ломалась.
📎 Решение:
1. Проверил текущую синхронизацию времени:
w32tm /query /status
2. Перезапустил службу времени и указал правильный NTP:
w32tm /config /manualpeerlist:"time.windows.com,0x9" /syncfromflags:manual /reliable:yes /update
Restart-Service w32time
3. Синхронизировал вручную:
w32tm /resync /force
✅ После этого всё заработало, ошибки исчезли, пользователи успокоились.
💬 А у вас были проблемы из-за времени? Как организуете NTP в своей инфраструктуре — отдельный сервер, групповые политики или доверяете AD?
👉 @win_sysadmin
👍8🔥1
Как я автоматизировал очистку Temp на всех ПК в домене
Иногда кажется, что папка
Руками чистить на каждом ПК? Нет уж. Я сделал это через PowerShell и GPO.
Решение:
Скрипт для очистки временных файлов запускается через планировщик задач от имени SYSTEM, раз в неделю. Вот пример скрипта:
Чтобы запускался на всех компах в домене:
1. Создал GPO с task scheduler (
2. Указал
3. В
Важно:
– Скрипт не трогает свежие файлы (новее 7 дней)
– Работает бесшумно, ничего не спрашивает
– Можно дополнительно чистить
Вывод:
Не запускайте такую штуку в logon-скриптах — это затормозит вход в систему. Лучше использовать планировщик задач. И, конечно, тестируйте сначала на паре машин — на всякий случай.
👉 @win_sysadmin
Иногда кажется, что папка
%TEMP% — это черная дыра. Пользователи жалуются на тормоза, места на диске мало, а ты заходишь туда — и видишь архивы обновлений, временные файлы Office, кэш инсталляторов и прочий мусор за последние сто лет.Руками чистить на каждом ПК? Нет уж. Я сделал это через PowerShell и GPO.
Решение:
Скрипт для очистки временных файлов запускается через планировщик задач от имени SYSTEM, раз в неделю. Вот пример скрипта:
$TempPath = "$env:TEMP"
Get-ChildItem -Path $TempPath -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { -not $_.PSIsContainer -and $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
Remove-Item -Force -ErrorAction SilentlyContinue
Чтобы запускался на всех компах в домене:
1. Создал GPO с task scheduler (
Computer Configuration -> Preferences -> Control Panel Settings -> Scheduled Tasks)2. Указал
Action: Create, Run as: SYSTEM, триггер раз в неделю.3. В
Program/noscript указал powershell.exe, а в аргументах: -ExecutionPolicy Bypass -File \\ваш-сервер\netlogon\clean_temp.ps1Важно:
– Скрипт не трогает свежие файлы (новее 7 дней)
– Работает бесшумно, ничего не спрашивает
– Можно дополнительно чистить
C:\Windows\Temp, если увереныВывод:
Не запускайте такую штуку в logon-скриптах — это затормозит вход в систему. Лучше использовать планировщик задач. И, конечно, тестируйте сначала на паре машин — на всякий случай.
👉 @win_sysadmin
🔥11👍2
🧾 Суточный отчёт по пользователям Active Directory
📆 Выполняется автоматически через планировщик задач раз в сутки.
🔍 Скрипт собирает статистику:
- 👥 Общее количество пользователей
- ✅ Сколько активных
- ⚙️ Сколько служебных (без фамилии)
- 🔒 Сколько заблокированных
- 🆕 Сколько новых за последние сутки
📜 Пример кода на PowerShell:
📂 В результате получаем .txt-файл с ежедневной статистикой, сохраняемый в
👉 @win_sysadmin
📆 Выполняется автоматически через планировщик задач раз в сутки.
🔍 Скрипт собирает статистику:
- 👥 Общее количество пользователей
- ✅ Сколько активных
- ⚙️ Сколько служебных (без фамилии)
- 🔒 Сколько заблокированных
- 🆕 Сколько новых за последние сутки
📜 Пример кода на PowerShell:
$Date = Get-Date -Format "dd MMMM yyyy HH:mm"
$AllUsers = (Get-AdUser -Filter * | ?{$_.name -notmatch 'Healthmailbox'}).count
$ActiveUsers = (Get-ADUser -Filter {Enabled -eq $true} | ?{$_.name -notmatch 'Healthmailbox'}).count
$DisabledUsers = (Get-ADUser -Filter {Enabled -eq $false} | ?{$_.name -notmatch 'Healthmailbox'}).count
$StartDate = (Get-Date).AddDays(-1)
$EndDate = (Get-Date).AddDays(+1)
$Zapros = Get-ADUser -Filter * -Properties Created | Where-Object {$_.Created -gt $StartDate -and $_.Created -le $EndDate}
$NewUsers = ($Zapros).count
$WhoUsers = $Zapros | ForEach-Object { $_.Name }
$NotSurname = Get-ADUser -Filter "Enabled -eq '$true' -and Surname -notlike '*' -and Name -ne 'Healthmailbox'"
$NotFIO = ($NotSurname).count
$Message = "На $Date в ActiveDirectory всего пользователей $AllUsers из них: `nАктивных: $ActiveUsers из них служебные: $NotFIO. `nЗаблокированных: $DisabledUsers. `nНовых пользователей: $NewUsers `r`n`r`n$WhoUsers"
$Message | Out-File -FilePath "C:\temp\$(Get-Date -Format 'dd MMMM yyyy')-UsersAD.txt"
📂 В результате получаем .txt-файл с ежедневной статистикой, сохраняемый в
C:\temp.👉 @win_sysadmin
👍3🔥2❤1
👋 Привет, админы!
Сегодня хочу поделиться полезным трюком, как отслеживать подключения к RDP — кто, когда и откуда логинился на сервер. Это особенно актуально, если вы не используете полноценный SIEM, но хотите держать руку на пульсе.
🔍 Используем журнал событий и PowerShell:
📌 Что делает скрипт:
- Ищет события успешного входа (4624),
- Фильтрует по типу логина 10 (удалённый интерактивный — это RDP),
- Показывает дату, пользователя и IP-адрес источника.
Очень удобно запускать на сервере и быстро проверять, кто заходил и когда. Можно адаптировать для логгера или отправки уведомлений.
💬 А вы мониторите RDP-сессии? Используете сторонние утилиты или всё на PowerShell? Делитесь своим опытом в комментах!
👉 @win_sysadmin
Сегодня хочу поделиться полезным трюком, как отслеживать подключения к RDP — кто, когда и откуда логинился на сервер. Это особенно актуально, если вы не используете полноценный SIEM, но хотите держать руку на пульсе.
🔍 Используем журнал событий и PowerShell:
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} |
Where-Object { $_.Properties[8].Value -eq '10' } |
Select-Object TimeCreated,
@{Name='User';Expression={$_.Properties[5].Value}},
@{Name='IP';Expression={$_.Properties[18].Value}} |
Sort-Object TimeCreated -Descending | Out-GridView
📌 Что делает скрипт:
- Ищет события успешного входа (4624),
- Фильтрует по типу логина 10 (удалённый интерактивный — это RDP),
- Показывает дату, пользователя и IP-адрес источника.
Очень удобно запускать на сервере и быстро проверять, кто заходил и когда. Можно адаптировать для логгера или отправки уведомлений.
💬 А вы мониторите RDP-сессии? Используете сторонние утилиты или всё на PowerShell? Делитесь своим опытом в комментах!
👉 @win_sysadmin
👍9
👋 Привет, админы!
Недавно наткнулся на проблему: на одном из серверов резко перестали запускаться определённые задачи в планировщике. Логов — тьма, копаться через GUI — мука. Решил быстро отфильтровать нужные записи через PowerShell.
🔥 Вот универсальный скрипт для выборки событий по Event ID, источнику и ключевому слову:
📌 Что делает этот скрипт:
- Ловит события ID 1074 (завершение работы/перезагрузка).
- Источник —
- За последние 7 дней.
- Фильтрует по слову
- Красиво выводит таблицу.
Так можно подстроить фильтры под любой лог и быстро выцепить нужное. Особенно помогает, когда ищешь нестандартные сбои или автоматические ребуты.
💬 А вы как работаете с журналами? Есть ли свои любимые команды или утилиты? Делитесь в комментариях!
👉 @win_sysadmin
Недавно наткнулся на проблему: на одном из серверов резко перестали запускаться определённые задачи в планировщике. Логов — тьма, копаться через GUI — мука. Решил быстро отфильтровать нужные записи через PowerShell.
🔥 Вот универсальный скрипт для выборки событий по Event ID, источнику и ключевому слову:
Get-WinEvent -LogName "System" -FilterHashtable @{
Id = 1074
ProviderName = "USER32"
StartTime = (Get-Date).AddDays(-7)
} | Where-Object { $_.Message -like "*shutdown*" } | Format-Table TimeCreated, Id, ProviderName, Message -AutoSize
📌 Что делает этот скрипт:
- Ловит события ID 1074 (завершение работы/перезагрузка).
- Источник —
USER32.- За последние 7 дней.
- Фильтрует по слову
shutdown в сообщении.- Красиво выводит таблицу.
Так можно подстроить фильтры под любой лог и быстро выцепить нужное. Особенно помогает, когда ищешь нестандартные сбои или автоматические ребуты.
💬 А вы как работаете с журналами? Есть ли свои любимые команды или утилиты? Делитесь в комментариях!
👉 @win_sysadmin
👍7❤1
👋 Привет, админы!
Недавно столкнулся с ситуацией: на одном из серверов какая-то служба не могла достучаться до SMB-шары. Сначала думал — сетевые проблемы, потом — DNS. Оказалось, у службы просто не было прав на доступ.
🔥 Чтобы быстро проверить, может ли конкретный пользователь (или служба) получить доступ к сетевому ресурсу, использую такую команду:
Эта команда спросит логин/пароль и проверит, может ли указанный пользователь открыть сетевую шару. Удобно, когда нужно протестировать доступ от имени сервиса, скрипта или другого доменного аккаунта.
✅ Работает и для UNC-путей, и для доступа к административным шарам (
💬 А вы как проверяете доступ к шарам от имени других пользователей? Есть свои лайфхаки?
👉 @win_sysadmin
Недавно столкнулся с ситуацией: на одном из серверов какая-то служба не могла достучаться до SMB-шары. Сначала думал — сетевые проблемы, потом — DNS. Оказалось, у службы просто не было прав на доступ.
🔥 Чтобы быстро проверить, может ли конкретный пользователь (или служба) получить доступ к сетевому ресурсу, использую такую команду:
$cred = Get-Credential
Test-Path -Path "\\сервер\шара" -Credential $cred
Эта команда спросит логин/пароль и проверит, может ли указанный пользователь открыть сетевую шару. Удобно, когда нужно протестировать доступ от имени сервиса, скрипта или другого доменного аккаунта.
✅ Работает и для UNC-путей, и для доступа к административным шарам (
\\server\C$). Экономит кучу времени, особенно при разборе проблем с GPO, скриптами входа и бэкапами.💬 А вы как проверяете доступ к шарам от имени других пользователей? Есть свои лайфхаки?
👉 @win_sysadmin
👍7
👋 Привет, админы!
Сегодня хочу поделиться реальным кейсом, который меня недавно выручил. Понадобилось быстро проверить последние обновления Windows на группе серверов — вручную лезть на каждый было бы долго и больно.
🔥 Вот скрипт на PowerShell, который я использовал:
✅ Что делает скрипт:
- Берет список серверов из файла
- Подключается к каждому по WinRM.
- Выводит 5 последних установленных обновлений.
Очень удобно, особенно когда нужно быстро убедиться, что патчи за этот месяц действительно накатились.
💬 А как вы автоматизируете проверку обновлений на парке машин? Используете WSUS, Intune, скрипты или что-то своё? Делитесь опытом!
👉 @win_sysadmin
Сегодня хочу поделиться реальным кейсом, который меня недавно выручил. Понадобилось быстро проверить последние обновления Windows на группе серверов — вручную лезть на каждый было бы долго и больно.
🔥 Вот скрипт на PowerShell, который я использовал:
Invoke-Command -ComputerName (Get-Content C:\servers.txt) -ScriptBlock {
Get-HotFix | Sort-Object -Property InstalledOn -Descending | Select-Object -First 5
} -Credential (Get-Credential)
✅ Что делает скрипт:
- Берет список серверов из файла
servers.txt. - Подключается к каждому по WinRM.
- Выводит 5 последних установленных обновлений.
Очень удобно, особенно когда нужно быстро убедиться, что патчи за этот месяц действительно накатились.
💬 А как вы автоматизируете проверку обновлений на парке машин? Используете WSUS, Intune, скрипты или что-то своё? Делитесь опытом!
👉 @win_sysadmin
👍6
👋 Привет, админы!
Сегодня хочу поделиться реальным кейсом из недавней практики. У нас один Windows Server 2019 внезапно перестал применять групповые политики, причем только для некоторых пользователей. Перезапуск
🔥 Решение оказалось простым, но не сразу очевидным: проблема была в DNS!
Проверил настройки сетевого подключения — и оказалось, что в DNS стояли публичные адреса, а не наши контроллеры домена. Из-за этого сервер не мог найти свой DC.
📋 Быстрое исправление:
1. Настроил правильные DNS сервера на интерфейсе (IP адреса контроллеров домена).
2. Очистил кэш DNS:
3. Перезапустил сетевые службы:
4. И только потом сделал:
После этого политики применились без ошибок!
✅ Вывод: при любых странностях с доменом сначала проверяйте DNS. В 80% случаев проблема именно там.
💬 А у вас были случаи, когда на ровном месте DNS ломал весь домен? Поделитесь историями в комментариях!
👉 @win_sysadmin
Сегодня хочу поделиться реальным кейсом из недавней практики. У нас один Windows Server 2019 внезапно перестал применять групповые политики, причем только для некоторых пользователей. Перезапуск
gpupdate /force ничего не давал, а в логах висела ошибка "The processing of Group Policy failed. Windows attempted to read the file \\domain.local\sysvol\..." с кодом 1355.🔥 Решение оказалось простым, но не сразу очевидным: проблема была в DNS!
Проверил настройки сетевого подключения — и оказалось, что в DNS стояли публичные адреса, а не наши контроллеры домена. Из-за этого сервер не мог найти свой DC.
📋 Быстрое исправление:
1. Настроил правильные DNS сервера на интерфейсе (IP адреса контроллеров домена).
2. Очистил кэш DNS:
ipconfig /flushdns
3. Перезапустил сетевые службы:
Restart-Service -Name "Dnscache","Netlogon","Kdc"
4. И только потом сделал:
gpupdate /force
После этого политики применились без ошибок!
✅ Вывод: при любых странностях с доменом сначала проверяйте DNS. В 80% случаев проблема именно там.
💬 А у вас были случаи, когда на ровном месте DNS ломал весь домен? Поделитесь историями в комментариях!
👉 @win_sysadmin
👍9
👋 Привет, админы!
Сегодня решил немного навести порядок в Active Directory — стал искать пустые группы, которые давно никем не используются. Такие группы только мешают, особенно если их десятки.
🧹 Нашёл удобный способ через PowerShell:
📌 Эта команда:
- перебирает все группы в домене,
- вытаскивает свойство
- фильтрует те, у которых оно пустое.
Результат — чистый список групп без участников. Удобно использовать перед тем, как массово удалять старые объекты или приводить в порядок права.
⚠️ Только осторожно — иногда пустые группы используются в GPO или для делегирования прав. Так что перед удалением лучше проверить связи через
💬 А вы как боретесь с наследием AD? Пишите, делитесь скриптами и опытом!
👉 @win_sysadmin
Сегодня решил немного навести порядок в Active Directory — стал искать пустые группы, которые давно никем не используются. Такие группы только мешают, особенно если их десятки.
🧹 Нашёл удобный способ через PowerShell:
Get-ADGroup -Filter * -Properties Members | Where-Object { -not $_.Members } | Select-Object Name
📌 Эта команда:
- перебирает все группы в домене,
- вытаскивает свойство
Members,- фильтрует те, у которых оно пустое.
Результат — чистый список групп без участников. Удобно использовать перед тем, как массово удалять старые объекты или приводить в порядок права.
⚠️ Только осторожно — иногда пустые группы используются в GPO или для делегирования прав. Так что перед удалением лучше проверить связи через
Get-ADGroupMember и Get-GPOReport.💬 А вы как боретесь с наследием AD? Пишите, делитесь скриптами и опытом!
👉 @win_sysadmin
👍5
👋 Привет, админы!
Сегодня расскажу про один неожиданный баг, с которым столкнулся на Windows Server 2022. После обновлений сервер перестал пускать пользователей по RDP. Ошибка — классическая: "The connection was denied because the user account is not authorized for remote login." Хотя у юзеров были все нужные права. 🤔
🔍 Копнул глубже — выяснилось, что в группе Remote Desktop Users внезапно исчезли все пользователи. Но в GPO права были заданы верно! Оказалось, что одно из обновлений сбросило локальные группы при конфликте с групповыми политиками.
💡 Решение:
1. Проверил GPO через
2. Добавил пользователей обратно в группу через PowerShell:
3. Чтобы автоматизировать проверку и добавление нужных участников — вот мини-скрипт:
🧩 Важно: если на сервере действует GPO, которая перезаписывает локальную группу RDP Users — добавление вручную не поможет, всё снова очистится при следующем применении политики. В таком случае правьте GPO или используйте Restricted Groups/Group Policy Preferences.
❓А у вас были кейсы, когда политики втихаря ломали RDP-доступ? Как отслеживаете такие конфликты?
👉 @win_sysadmin
Сегодня расскажу про один неожиданный баг, с которым столкнулся на Windows Server 2022. После обновлений сервер перестал пускать пользователей по RDP. Ошибка — классическая: "The connection was denied because the user account is not authorized for remote login." Хотя у юзеров были все нужные права. 🤔
🔍 Копнул глубже — выяснилось, что в группе Remote Desktop Users внезапно исчезли все пользователи. Но в GPO права были заданы верно! Оказалось, что одно из обновлений сбросило локальные группы при конфликте с групповыми политиками.
💡 Решение:
1. Проверил GPO через
gpresult /h report.html — нужные настройки есть.2. Добавил пользователей обратно в группу через PowerShell:
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "DOMAIN\username"
3. Чтобы автоматизировать проверку и добавление нужных участников — вот мини-скрипт:
$users = @("DOMAIN\user1", "DOMAIN\user2")
foreach ($u in $users) {
if (-not (Get-LocalGroupMember -Group "Remote Desktop Users" -Member $u -ErrorAction SilentlyContinue)) {
Add-LocalGroupMember -Group "Remote Desktop Users" -Member $u
Write-Host "$u добавлен в Remote Desktop Users"
}
}
🧩 Важно: если на сервере действует GPO, которая перезаписывает локальную группу RDP Users — добавление вручную не поможет, всё снова очистится при следующем применении политики. В таком случае правьте GPO или используйте Restricted Groups/Group Policy Preferences.
❓А у вас были кейсы, когда политики втихаря ломали RDP-доступ? Как отслеживаете такие конфликты?
👉 @win_sysadmin
👍5❤2⚡1🔥1
👋 Привет, админы!
Сегодня расскажу про один недокументированный нюанс с задачами в Планировщике Windows, с которым недавно столкнулся сам. Был у меня скрипт, который по расписанию должен запускаться от имени системной учетной записи (
🔍 После копания выяснилось: если задача запускается от SYSTEM, но в свойствах включена опция "Запускать только при входе пользователя", — она НЕ выполнится, потому что SYSTEM не входит в систему в классическом понимании.
💡 Решение:
1. Зайти в свойства задачи.
2. Переключить опцию на: "Выполнять вне зависимости от входа пользователя".
3. Обязательно включить галку "Не сохранять пароль", если используете обычную учетку (для SYSTEM это не критично).
📌 Ну и по возможности включайте логирование в задаче — пусть пишет вывод скрипта в файл, так проще отлавливать подобные "невидимые" фейлы.
💬 А у вас были странности с Task Scheduler? Может, знаете ещё тонкости, о которых стоит рассказать? Делитесь в комментариях!
👉 @win_sysadmin
Сегодня расскажу про один недокументированный нюанс с задачами в Планировщике Windows, с которым недавно столкнулся сам. Был у меня скрипт, который по расписанию должен запускаться от имени системной учетной записи (
SYSTEM). Всё настроено правильно, вручную запускается — работает. Но вот по расписанию не срабатывает. Без ошибок, без логов, просто тишина. 🤔🔍 После копания выяснилось: если задача запускается от SYSTEM, но в свойствах включена опция "Запускать только при входе пользователя", — она НЕ выполнится, потому что SYSTEM не входит в систему в классическом понимании.
💡 Решение:
1. Зайти в свойства задачи.
2. Переключить опцию на: "Выполнять вне зависимости от входа пользователя".
3. Обязательно включить галку "Не сохранять пароль", если используете обычную учетку (для SYSTEM это не критично).
📌 Ну и по возможности включайте логирование в задаче — пусть пишет вывод скрипта в файл, так проще отлавливать подобные "невидимые" фейлы.
💬 А у вас были странности с Task Scheduler? Может, знаете ещё тонкости, о которых стоит рассказать? Делитесь в комментариях!
👉 @win_sysadmin
👍9🔥1👏1
🛡️ Привет, админы!
Если вы, как и я, не любите вручную лазить по групповой политике в поисках косяков с безопасностью — этот пост для вас. Сегодня покажу, как одной командой получить сводку по ключевым настройкам безопасности с любого Windows-сервера или рабочей станции.
🔥 Встречайте команду:
Что делает скрипт:
*
*
*
📋 Пример вывода:
Это простой и быстрый способ проверить настройки перед аудитом или при подозрении на расслабленные политики.
💬 А вы как мониторите безопасность локально? Используете ли
👉 @win_sysadmin
Если вы, как и я, не любите вручную лазить по групповой политике в поисках косяков с безопасностью — этот пост для вас. Сегодня покажу, как одной командой получить сводку по ключевым настройкам безопасности с любого Windows-сервера или рабочей станции.
🔥 Встречайте команду:
(secedit /export /cfg C:\temp\secpol.cfg) > $null
Get-Content C:\temp\secpol.cfg | Where-Object {$_ -match "Password|Lockout|Audit"}
Что делает скрипт:
*
secedit /export выгружает локальную политику безопасности в текстовый файл.*
Get-Content парсит его.*
Where-Object фильтрует строки по ключевым словам: парольная политика, блокировки, аудит.📋 Пример вывода:
PasswordComplexity = 1
MinimumPasswordLength = 12
AuditLogonEvents = 3
LockoutBadCount = 5
Это простой и быстрый способ проверить настройки перед аудитом или при подозрении на расслабленные политики.
💬 А вы как мониторите безопасность локально? Используете ли
secedit, LGPO.exe, или уже всё через Intune и Defender for Endpoint?👉 @win_sysadmin
👍5❤🔥1👏1🐳1