Системный Администратор Windows – Telegram
Системный Администратор Windows
3.2K subscribers
14 photos
1 video
22 links
🖥️ Windows для системных администраторов: управление, оптимизация, безопасность. Полезные советы, лайфхаки, PowerShell-скрипты, автоматизация и практические решения для работы с серверами и рабочими станциями.

Авторский канал.
Download Telegram
Дорогие друзья, с Новым Годом 🎊
29🎉12🍾3🆒2
👋 Привет, админы!

Однажды словил интересный баг с 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
👍102👎1
👋 Привет, админы!

Сегодня тема, которая не раз спасала мою нервную систему в пятницу вечером, это мгновенное восстановление объектов в 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🔥42
👋 Привет, админы!

🔥 Делюсь скриптом, который создаёт и настраивает 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 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 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 один из серверов начал блокировать запуск скриптов из-за политики исполнения (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 самых больших файлов на диске:


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👍62
👋 Привет, админы!

Попался мне на днях любопытный случай: один из пользователей жаловался, что после входа в систему медленно прогружается рабочий стол, хотя железо бодрое и диск в порядке.

🔍 Начал копать — и довольно быстро нашёл виновника: в автозагрузке сидела куча мусора, но особенно отличился один 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
👍171
👋 Привет, админы!

Сегодня расскажу про один неприятный и коварный момент, с которым столкнулся буквально на днях - невозможность запустить скрипт 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
👍102🔥1
👋 Привет, админы!

Если в домене внезапно начинают сыпаться жалобы вроде «не могу зайти, пароль верный» - один из первых шагов в расследовании: поиск заблокированных аккаунтов.

🔥 Вот простой 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
👍62