Admin Future
242 subscribers
50 photos
1 video
4 files
87 links
Превращаем эникейщиков в System Architects.
🚀 Твой навигатор в мире IT-инфраструктуры:

▪️ Hard Skills: Linux, Windows, Network, Security
▪️ Tools: Лучший софт и скрытые фишки
▪️ Mindset: Как думать, чтобы платили много


Админ - @maksimshap
Download Telegram
🪟 Windows: Одиночество в DMZ. Управляем Server Core без графики и боли

Графический интерфейс на серверах окончательно умер, а RDP закрыт наглухо еще пару лет назад. Но софт на изолированных машинах в DMZ обновлять надо. Тянуть MSI-пакеты руками по сети через скрытые шары? Оставьте этот антиквариат стажерам из прошлого десятилетия.

Под капотом:
Используем нативный пакетный менеджер WinGet в связке с внутренним приватным REST-репозиторием. Современный WinGet умеет работать в контексте системы (SYSTEM), стягивать подписанные манифесты и дистрибутивы прямо из корпоративного хранилища. Никакого монструозного SCCM, только элегантный CLI по жестко зашифрованному TLS 1.3 каналу.

Практика:
Подключаем наш закрытый корпоративный репозиторий и ставим утилиты мониторинга одной командой:


# 1. Удаляем публичные мусорные репозитории Microsoft
winget source remove msstore
winget source remove winget

# 2. Добавляем корпоративный источник с авторизацией по сертификату
winget source add --name CorpRepo --arg https://repo.internal.local/api --type Microsoft.Rest --accept-source-agreements

# 3. Ставим нужный пакет тихо и без лишних вопросов
winget install Corp.ZabbixAgent --source CorpRepo --exact --silent --accept-package-agreements



Зачем это нужно:
Полный контроль над версиями ПО в изолированных сегментах сети. Вы точно знаете, что на сервер попадет только тот бинарник, который прошел проверку безопасников и лежит в вашем репозитории. Автоматизируется через любой CI/CD за пять минут.

#windows #winget #servercore #powershell #admin_future
🔥2
🪟 Windows: Протокол «Чистые руки». Нативный LAPS и смерть локальных паролей

Коллеги, признавайтесь: у кого в блокноте или в закрытом чате до сих пор лежит «тот самый» пароль от локального админа, который подходит к половине серверов в сегменте? В 2026 году это не просто дыра, это широко распахнутые ворота для любого шифровальщика. Если одна машина в DMZ скомпрометирована — считайте, что упал весь домен.

Техническая суть:
Мы используем Windows LAPS (Local Administrator Password Solution), который теперь нативно интегрирован в ОС и Active Directory. Больше никаких сторонних костылей.

Как это работает: Каждая машина в домене генерирует уникальный, сложный пароль для своей учетки локального администратора. Этот пароль шифруется и сохраняется в защищенном атрибуте объекта компьютера в AD. Доступ к чтению этого атрибута жестко ограничен через ACL только для группы «Trusted Admins». Каждые 30 дней (или по вашему триггеру) пароль ротируется автоматически.


Практика:

Получаем актуальный пароль для проблемного сервера через PowerShell (все действия логируются, так что «просто посмотреть» не выйдет):


# 1. Проверяем состояние LAPS на конкретном сервере
Get-LapsDiagnostics -ComputerName "SRV-DB-01"

# 2. Получаем текущий пароль (требуются права доступа к зашифрованному атрибуту)
Get-LapsADPassword -Identity "SRV-DB-01" -AsClearText

# Вывод:
# ComputerName Password Expiration
# ------------ -------- ----------
# SRV-DB-01 $tr0ng_P@ss_2026! 10.04.2026 14:00:00

# 3. Принудительно заставляем сервер сменить пароль прямо сейчас
Set-LapsADPasswordExpiration -Identity "SRV-DB-01" -In 0



Зачем это нужно:
Полное исключение атаки типа Pass-the-Hash. Даже если злоумышленник вытащит хеш с одного сервера, он не сможет зайти под ним на другой. Админ больше не знает паролей — он получает их по требованию под присмотром аудита.

#windows #security #laps #powershell #activedirectory #admin_future
👍3
🪟 Windows: SecretManagement — Смерть паролей в открытом коде

Коллеги, на дворе 2026 год. Если при проверке ваших PowerShell-скриптов безопасник находит переменную `$password = "12345"`, он имеет полное право заблокировать вашу учетку до конца квартала. Скрыть пароль в base64 — это не защита, это костыль из прошлого десятилетия.

Техническая суть:
Используем нативный модуль Microsoft.PowerShell.SecretManagement. Это абстрактный слой, который позволяет скриптам запрашивать секреты, не зная, где они лежат: в локальном зашифрованном Vault, в KeePassXC или в корпоративном HashiCorp Vault.

Под капотом: Модуль отделяет логику скрипта от реализации хранилища. Скрипт просит «дай мне пароль от сервиса X», а SecretManagement сам идет в зарегистрированное расширение (Extension Vault) и достает его. В памяти скрипта секрет живет только в виде объекта `SecureString`.

Практика:

Настраиваем локальное защищенное хранилище и используем его в автоматизации:


# 1. Устанавливаем необходимые модули
Install-Module Microsoft.PowerShell.SecretManagement, Microsoft.PowerShell.SecretStore -Force

# 2. Регистрируем локальный защищенный сейф (требует мастер-пароль или привязку к сессии)
Register-SecretVault -Name LocalSafe -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault

# 3. Сохраняем секрет один раз (интерактивно)
Set-Secret -Name "Service_DB_Prod" -Secret "MySuperSecurePassword2026!"

# 4. В скрипте теперь только чистая логика:
$dbSecret = Get-Secret -Name "Service_DB_Prod" -AsPlainText # Используйте plain text только для передачи в API!
Invoke-Sqlcmd -ServerInstance "DB-SRV-01" -Password $dbSecret -Query "SELECT 1"



Зачем это нужно:
Ваши `.ps1` файлы теперь абсолютно чисты. Их можно спокойно пушить в Git, передавать коллегам и не бояться, что при увольнении придется ротировать сотню паролей, которые вы «где-то там» прописали.


#windows #powershell #security #automation #secretmanagement #admin_future
👍1
🪟 Windows: CLI-первенство. Управляем сервером без «тяжелых» окон

Коллеги, в 2026 году открывать RDP-сессию, чтобы просто проверить свободное место на диске или перезапустить службу — это признак дурного тона и лишняя нагрузка на канал связи. В условиях жестких требований безопасности каждое RDP-подключение — это лишнее окно в твою «цифровую крепость».

Техническая суть:
Используем PowerShell Remoting (WinRM) через CLI. Это позволяет выполнять команды на сотнях серверов одновременно, не видя перед собой ни одного рабочего стола.

Под капотом: WinRM работает через HTTP/HTTPS (порты 5985/5986). В 2026-м мы настраиваем его на работу по TLS 1.3 с авторизацией по сертификатам. Это безопаснее, быстрее и позволяет автоматизировать рутину через обычные текстовые команды.

Практика:

Забудь про «Пуск -> Выполнить». Открывай терминал:


# 1. Подключаемся к удаленному Server Core узлу (интерактивно)
Enter-PSSession -ComputerName "SRV-DB-01"

# 2. Магия: узнаем свободное место на дисках сразу на всей группе серверов
Invoke-Command -ComputerName "SRV-APP-01", "SRV-APP-02", "SRV-APP-03" -ScriptBlock {
Get-Volume | Select-Object DriveLetter, FileSystemLabel,
@{Name="FreeGB";Expression={[Math]::Round($_.SizeRemaining / 1GB, 2)}}
}

# 3. Перезапускаем службу только если она "висит"
Invoke-Command -ComputerName "SRV-PRINT-01" -ScriptBlock {
Restart-Service -Name "Spooler" -Force
}



Зачем это нужно:
Скорость и масштабируемость. Пока твой коллега ждет прогрузки графики в RDP, ты уже собрал отчет по всем серверам в сегменте и ушел пить кофе.


#windows #powershell #winrm #automation #sysadmin #admin_future
🔥3
🪟 Windows: Детектив событий. Фильтруем Event Log без GUI

Коллеги, признавайтесь, кто до сих пор ждет по пять минут, пока «Просмотр событий» (Event Viewer) соизволит отрисовать список ошибок? В 2026 году в условиях Server Core и жесткой изоляции сегментов, GUI — это непозволительная роскошь. Если ты не умеешь вытаскивать причину падения сервиса одной строкой в PowerShell, ты беззащитен перед лицом инцидента.

Техническая суть:
Используем Get-WinEvent с XML-фильтрацией.
Под капотом: Старый Get-EventLog медленный, потому что он выкачивает все события и только потом их фильтрует. Get-WinEvent умеет отправлять запрос (FilterXML или FilterHashtable) прямо в движок журнала. В 2026-м это единственный способ быстро найти событие среди миллионов записей аудита в «цифровой крепости».

Практика:
Перестань страдать в графическом интерфейсе. Стань мастером запросов:

# 1. Найти 5 последних ошибок в системном журнале (мгновенно)
Get-WinEvent -FilterHashtable @{LogName='System'; Level=2} -MaxEvents 5

# 2. Кто заблокировал учетку? Ищем событие 4740 в журнале Security
# Работает в разы быстрее через FilterHashtable
$filter = @{
LogName = 'Security'
Id = 4740
}
Get-WinEvent -FilterHashtable $filter | Select-Object TimeCreated, Message

# 3. Выгрузка ошибок конкретного приложения за последние 2 часа
$startTime = (Get-Date).AddHours(-2)
Get-WinEvent -FilterXPath "*[System[(Level=2 or Level=3) and TimeCreated[@SystemTime >= '$($startTime.ToUniversalTime().ToString('s'))Z')]]" -LogName "Application"

Зачем это нужно:
Оперативность. В 2026 году требования к безопасности (ИБ) обязывают админа реагировать на подозрительные события в течение минут. Прямые запросы к логам позволяют автоматизировать алертинг и не тратить время на ожидание прогрузки тяжелых консолей управления.

#windows #powershell #eventlog #security #troubleshooting #admin_future
🔥2
🪟 Windows: tnc — Твой универсальный сетевой швейцарский нож

В 2026-м пытаться проверить доступность порта через `telnet` — это как пытаться зажечь огонь трением палочек. В PowerShell давно есть нативный инструмент `Test-NetConnection` (сокращенно — `tnc`), который делает всё и сразу.

Зачем это нужно:
1. Проверка порта: Не надо гадать, закрыл ли порт фаервол в «цифровой крепости».
2. Трассировка: Сразу показывает маршрут до цели.
3. Диагностика: Выдает детальную инфу, почему пакет не дошел.


Примеры использования:


# Просто проверить, открыт ли порт веб-сервера
tnc 192.168.1.50 -Port 443

# Сделать проверку и сразу увидеть маршрут (TraceRoute)
tnc google.com -TraceRoute

# Проверить только ICMP (старый добрый пинг, но с нормальным объектом на выходе)
tnc 8.8.8.8 -InformationLevel Detailed


Pro Tip: Результат tnc — это объект. Его можно легко засунуть в условие if внутри твоего скрипта авто-деплоя.

#windows #powershell #networking #troubleshooting #tnc
2
🪟 Windows: Охота на зависшие службы через PowerShell

Классика: служба зависла в состоянии Stopping. Перезапуск не работает, сервер тупит, ждать нельзя.

Решаем жестко через PowerShell:

$ServiceName = "YourServiceName"
$Service = Get-Service $ServiceName

if ($Service.Status -eq "Stopping" -or $Service.Status -eq "Pending") {
$ServicePID = (Get-CimInstance Win32_Service -Filter "Name='$ServiceName'").ProcessId
Stop-Process -Id $ServicePID -Force
Write-Host "Служба $ServiceName прибита. Можно запускать заново." -ForegroundColor Cyan
} else {
Restart-Service $ServiceName -Force
}

Зачем это:
Экономит время на ребутах. Быстро возвращает систему в строй, если служба зависла на ресурсах или сети.

#windows #powershell #troubleshooting #services #admin_future
🔋 Windows: Как не «потухнуть» вместе с ИБП

Коллеги, стабильность питания — штука капризная. Даже в самом крутом ДЦ может случиться скачок, который проверит твой ИБП (UPS) на прочность. Если твой сервер не знает, в каком состоянии его батареи, он просто «умрет» в самый неподходящий момент, оставив тебя наедине с битой файловой системой и гневными письмами от юзеров.

Используй PowerShell для контроля состояния питания. В большинстве случаев достаточно нативного WMI/CIM доступа.


Скрипт для проверки статуса (копируй и запускай):


# Получаем данные о батарее через CIM
$Battery = Get-CimInstance -ClassName Win32_Battery

if ($Battery) {
$Status = switch ($Battery.BatteryStatus) {
1 {"Разряжается"}
2 {"Питание от сети (ОК)"}
3 {"Полностью заряжена"}
default {"Ошибка или Неизвестно"}
}
Write-Output "Статус ИБП: $Status"
Write-Output "Заряд: $($Battery.EstimatedChargeRemaining)%"
} else {
Write-Warning "ИБП не обнаружен в системе. Проверь USB/COM кабель."
}


Зачем это нужно:
Для настройки скриптов автоматического завершения работы. Если заряд падает ниже 10%, сервер должен сам потушить тяжелые базы данных и корректно выключиться, а не просто дождаться обрыва питания.


#windows #powershell #ups #monitoring #hardware #admin_future
🪟 Windows: Быстрый аудит входов через PowerShell

Коллеги, в марте 2026-го безопасность — это не просто слово, а ежедневная рутина. Если тебе нужно быстро узнать, кто заходил на сервер за последние сутки, не нужно ждать вечность, пока прогрузится тяжелый графический Event Viewer. Мы сделаем это прямо в консоли.

Используем Get-WinEvent с фильтром по ID 4624 (успешный вход).


Скрипт для проверки (копируй и запускай):


# Список успешных входов за последние 24 часа
$Time = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624; StartTime=$Time} |
Select-Object TimeCreated, @{Name='User'; Expression={$_.Properties[5].Value}} |
Format-Table -AutoSize


Зачем это нужно:
Для контроля. Ты сразу увидишь, если в систему заходил кто-то лишний или под учеткой, которая должна быть неактивна. В пятницу перед уходом домой — это отличная привычка для проверки безопасности своей цифровой крепости.


#windows #powershell #security #audit #admin_future
🛡️ Защита RDP: Как не дать подобрать ключи от сервера

Привет, коллеги! Оставлять 3389 порт открытым в дикий интернет — это как оставить ключи от квартиры под ковриком, на котором написано здесь лежат деньги. Ботнеты найдут вас через 30 секунд после поднятия интерфейса. Разберем, как превратить обычный RDP в неприступный шлюз, используя блокировки и GeoIP.

Уровень 1: Политика блокировки учетных записей

Если у вас нет блокировки после N неудачных попыток, хакер может брутфорсить ваш пароль годами. Нам нужно, чтобы после 5 попыток дверь закрывалась перед носом атакующего. В Windows это настраивается через групповые политики, но мы сделаем это быстрее через командную строку.


Команда для настройки:


# Устанавливаем порог блокировки в 5 попыток
net accounts /lockoutthreshold:5

# Время блокировки (в минутах)
net accounts /lockoutduration:30

# Окно сброса счетчика попыток
net accounts /lockoutwindow:30


Теперь, если бот попробует подобрать пароль, учетка заблокируется на полчаса. Это резко снижает эффективность любого перебора.

Уровень 2: GeoIP — Фильтруем по прописке

Зачем вашему серверу принимать подключения из других стран, если ваши сотрудники сидят в одном регионе? Использование GeoIP списков для фаервола — это база. Мы можем использовать PowerShell, чтобы разрешить доступ только для определенных диапазонов адресов.


Скрипт для блокировки чужих подсетей (пример логики):


# Импортируем список разрешенных IP-адресов
$AllowedIPs = Get-Content C:\Scripts\allowed_ips.txt

# Создаем правило фаервола, которое разрешает RDP только для этих IP
New-NetFirewallRule -DisplayName Allow RDP Region Only -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3389 -RemoteAddress $AllowedIPs

# Отключаем дефолтное правило, которое разрешает RDP всем
Disable-NetFirewallRule -DisplayName Remote Desktop - User Mode (TCP-In)


Уровень 3: Автоматический бан через Event Log

Самый эффективный способ — динамический бан. Если кто-то стучится и ошибается, его IP должен лететь в черный список фаервола немедленно.



# Порог попыток перед баном
$Threshold = 3
# За какой период смотреть логи (в минутах)
$TimeRange = 10
$StartTime = (Get-Date).AddMinutes(-$TimeRange)

# Собираем события неудачного входа (ID 4625)
$Events = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$StartTime} -ErrorAction SilentlyContinue

if ($Events) {
# Группируем по IP-адресу (свойство 19 обычно содержит IP)
$FailedIPs = $Events | ForEach-Object {
[PSCustomObject]@{
IP = $_.Properties[19].Value
}
} | Group-Object IP | Where-Object { $_.Count -ge $Threshold -and $_.Name -ne "-" -and $_.Name -ne "127.0.0.1" }

foreach ($Item in $FailedIPs) {
$IP = $Item.Name
$RuleName = "AutoBan_$IP"

# Проверяем, нет ли уже такого правила
if (-not (Get-NetFirewallRule -Name $RuleName -ErrorAction SilentlyContinue)) {
Write-Host "Блокируем IP: $IP (Попыток: $($Item.Count))" -ForegroundColor Red
New-NetFirewallRule -DisplayName $RuleName -Name $RuleName -Direction Inbound -Action Block -RemoteAddress $IP
}
}
}


Логика проста:
1. Скрипт мониторит журнал событий на наличие Event ID 4625 (ошибка входа).
2. Если с одного IP пришло несколько ошибок за минуту — этот IP улетает в блок в фаерволе.

Зачем это нужно:
Защита RDP — это многослойный пирог. Одного сложного пароля мало. Блокировка учеток спасает от медленного перебора, GeoIP отсекает лишний мировой шум, а динамический бан добивает самых настырных.


Золотое правило: Лучший RDP — это тот, который доступен только через VPN. Если всё же нужен прямой доступ — используй все три уровня защиты.

#security #rdp #powershell #geoip #bruteforce #admin_future
2👍2
🪟 Windows: Кто съел мою память? (PowerShell)

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

PowerShell позволяет сделать это одной строкой, отсортировав процессы по реальному потреблению (WorkingSet).

Скрипт для поиска виновных:


# Топ-10 процессов по потреблению памяти в Мб
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 Name, @{Name='RAM_MB'; Expression={[math]::round($_.WorkingSet / 1mb, 2)}} | Format-Table -AutoSize


Зачем это нужно:
Для оперативного реагирования. Ты сразу видишь, что это: утечка в браузере, разросшаяся база или «зависшее» приложение. Зная имя процесса, его можно тут же перезапустить или изучить подробнее, не тратя время на графику.

#windows #powershell #performance #monitoring #sysadmin #admin_future
2🔥2
📂 Windows: Ищем «тяжелые» папки через PowerShell

Коллеги, ситуация: на диске C: осталось 500 Мб, сервер задыхается, а стандартный проводник Windows считает размер папок целую вечность. Нам нужно мгновенно найти виновника, который забил место логами или временными файлами.

PowerShell справляется с этим гораздо быстрее, если не просить его пересчитывать каждый мелкий файл по отдельности в визуальном режиме


Скрипт для поиска топ-5 самых тяжелых папок (копируй и запускай):


# Считаем размер папок в корне диска C: и сортируем по убыванию
Get-ChildItem -Path "C:\" -Directory | ForEach-Object {
$Size = (Get-ChildItem -Path $_.FullName -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
[PSCustomObject]@{
FolderName = $_.Name
Size_GB = [math]::round($Size / 1GB, 2)
}
} | Sort-Object Size_GB -Descending | Select-Object -First 5 | Format-Table -AutoSize


Зачем это нужно:
Для оперативной очистки. Обычно виноваты либо логи IIS, либо папки Temp, либо чьи-то забытые бэкапы прямо на системном диске. Пять секунд работы скрипта — и ты знаешь, куда бить.


#windows #powershell #storage #cleanup #sysadmin #admin_future
🧹 Windows: Автоматическая чистка старых файлов через PowerShell

Коллеги, признавайтесь: у кого на сервере есть папка Temp или Backup, которая незаметно разрастается до терабайта, пока однажды диск С: не загорается красным? В 2026-м админ не должен удалять мусор руками. Это работа для простого скрипта, который будет делать уборку за тебя каждую ночь.

Мы напишем скрипт, который находит файлы старше 30 дней в конкретной папке и удаляет их, не трогая всё остальное.


Скрипт для планировщика задач:


# Путь к папке, где нужно прибраться
$Path = "C:\Backups\Daily"
# Срок хранения в днях
$Days = 30
$TargetDate = (Get-Date).AddDays(-$Days)

# Ищем файлы и удаляем их
Get-ChildItem -Path $Path -File -Recurse |
Where-Object { $_.LastWriteTime -lt $TargetDate } |
Remove-Item -Force -Verbose


Зачем это нужно:
Для спокойного сна. Настрой этот скрипт в Task Scheduler (Планировщике задач) на запуск раз в сутки. Больше тебе не придется судорожно удалять старые архивы, когда место на сервере внезапно закончится в разгар рабочего дня.


#windows #powershell #cleanup #automation #sysadmin #admin_future
🔥2
📁 Windows: Проверяем, кто заблокировал файл через PowerShell

Знакомая боль: пытаешься удалить лог или переместить папку, а Windows выдает издевательское «Файл открыт в другой программе». И сидишь гадаешь — то ли это антивирус, то ли забытая сессия коллеги, то ли сам сервер решил придержать файл «на память».

Раньше мы качали Unlocker или Process Explorer, но в 2026-м всё, что нам нужно, уже есть в системе.


Скрипт для поиска «виновника» (запускай от админа):


# Ищем процесс, который держит файл (замените путь на свой)
$LockedFile = "C:\inetpub\logs\LogFiles\u_ex260401.log"

Get-Process | Where-Object {
$_.Modules.FileName -contains $LockedFile -or $_.HandleCount -gt 0
} | Select-Object Name, Id, Description | Format-Table -AutoSize

Примечание: Если файл заблокирован системой, используйте команду `handle.exe` из пакета Sysinternals — это база.

Чтобы не гадать и не ребутать весь сервер ради одного файла. Часто виновником оказывается зависший агент бэкапа или старая сессия PowerShell, которую вы сами же забыли закрыть. Пять секунд — и вы знаете, какой PID нужно «прибить».


Инструменты админа стали точнее. Не нужно сносить дерево, если мешает одна ветка.

#windows #powershell #troubleshooting #sysadmin #files #admin_future
21
🛡️ Windows: Аудит элитного клуба — мониторим Domain Admins через PowerShell

Доверие — это отлично, но контроль — лучше. Особенно если дело касается группы Domain Admins. Представьте: в вашей инфраструктуре есть только два легитимных администратора — условные Bogdan и Roman. А в один прекрасный день скрипт показывает третьего. Это либо взлом, либо кто-то временно выдал права техподдержке и забыл забрать. В 2026 году такие инциденты стоят бизнесу миллионы.

Вместо того чтобы кликать мышкой по оснастке Active Directory, повесьте в планировщик задач простой скрипт, который будет следить за изменениями.


Скрипт мониторинга критичной группы:


$Domain = "domain.local"
$GroupName = "Domain Admins"
$AllowedAdmins = @("adm1", "adm1", "adm3")

# Получаем текущий состав группы
$CurrentMembers = Get-ADGroupMember -Identity $GroupName -Server $Domain | Select-Object -ExpandProperty SamAccountName

# Ищем чужаков
$Unauthorized = $CurrentMembers | Where-Object { $_ -notin $AllowedAdmins }

if ($Unauthorized) {
Write-Warning "⚠️ АЛАРМ! Найдены неавторизованные пользователи в Domain Admins: $($Unauthorized -join ', ')"
# Здесь можно добавить код отправки алерта в Telegram или на почту
} else {
Write-Host " Состав группы Domain Admins в норме." -ForegroundColor Green
}


Группа политик безопасности (GPO) не всегда спасет, если учетка скомпрометирована. Автоматический аудит критически важных групп — это ваш первый рубеж обнаружения внутренних угроз.
Безопасность домена начинается с понимания того, у кого от него ключи.


#windows #powershell #activedirectory #security #audit #admin_future
🪟 Windows: Официальный sudo — конец эпохи лишних окон консоли

Мы только что обсуждали, как Linux избавляется от sudo в пользу run0. Иронично, но в мире Windows происходит ровно обратное. В Windows 11 и Windows Server 2025 утилита sudo стала официальной встроенной частью операционной системы.

Вы открыли обычный PowerShell, пишите скрипт, пытаетесь перезапустить службу, и получаете Access Denied. Приходилось тянуться за мышкой, искать ярлык PowerShell, нажимать «Запуск от имени администратора», копировать туда команду и выполнять.


Microsoft добавила нативный sudo. Прямо в текущем окне с правами обычного пользователя вы пишете:
sudo Restart-Service -Name W3SVC


В настройках системы (Settings — For developers — Enable sudo) админ может выбрать один из трех режимов работы:
1. В новом окне (In a new window) — классическое поведение Windows.
2. С отключенным вводом (With input disabled) — команда выполнится в этом же окне, но не сможет запрашивать у вас дополнительные данные (безопасный режим для скриптов).
3. Встроенный (Inline) — полная аналогия с Linux. Команда выполняется прямо здесь и сейчас, весь вывод идет в текущую консоль.


Для удобства и скорости. Если вы много работаете в терминале Windows Terminal, вам больше не нужно жонглировать вкладками с разными уровнями привилегий.


Границы между администрированием Windows и Linux продолжают стираться. Консоль становится универсальным и удобным местом для работы.

#windows #sudo #cli #powershell #sysadmin #admin_future
🧹 Windows: Уборка в лесу — ищем GPO-призраки через PowerShell

Коллеги, в любом домене со временем накапливается мусор. Мы создаем тестовые политики, применяем их, а потом забываем удалить. Когда приходит время провести масштабную реструктуризацию политик и передать часть функционала коллеге, этот мусор сильно мешает и путает.

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


Код для PowerShell:

$AllGPOs = Get-GPO -All
foreach ($GPO in $AllGPOs) {
$Report = Get-GPOReport -Guid $GPO.Id -ReportType Xml
if ($GPO.GpoStatus -eq 'AllSettingsDisabled' -or $Report -notmatch 'LinksTo') {
Write-Host "Кандидат на удаление: " $GPO.DisplayName}
}


Чистый Active Directory работает быстрее и предсказуемее. Любая реструктуризация GPO должна начинаться с удаления всего, что не работает и просто висит мертвым грузом.


#windows #powershell #activedirectory #gpo #sysadmin #admin_future
🔥1
🪟 Windows: Обновляем весь зоопарк софта одной командой через WinGet

Раньше для централизованного обновления стороннего софта (браузеры, архиваторы, мессенджеры) на парке машин мы использовали тяжеловесные решения вроде SCCM, сторонние патч-менеджеры или писали километровые скрипты-обертки.

Сейчас все стало гораздо элегантнее. Встроенный пакетный менеджер WinGet давно оброс мускулами и отлично справляется с этой задачей через консоль.

Скрипт для PowerShell (запускать от администратора):

winget upgrade --all --silent --accept-package-agreements --accept-source-agreements

Как это работает:
Команда проверяет абсолютно все установленные приложения, сравнивает их версии с официальными репозиториями и в тихом режиме (без окон установки) накатывает свежие патчи, автоматически соглашаясь с лицензионными условиями.


Уязвимости нулевого дня в браузерах и PDF-читалках — это любимый вектор атак шифровальщиков. Повесьте этот скрипт в Планировщик задач на компьютерах пользователей, например, на обеденное время среды. Система сама закроет 90% дыр в стороннем софте без вашего ручного вмешательства.

#windows #powershell #winget #automation #sysadmin #admin_future
2
👻 WINDOWS: ОХОТА ЗА ПРИЗРАКАМИ. УДАЛЯЕМ МЕРТВЫЕ SID ИЗ ПРАВ ДОСТУПА

При реорганизации инфраструктуры и чистке домена от легаси-объектов мы часто удаляем старые учетные записи. Но права доступа на файловых серверах (NTFS ACL) остаются. Вместо имен пользователей там появляются неопознанные SID (начинаются с S-1-5-21...).

Это не просто эстетическая проблема. При миграции серверов или глубоком аудите эти мертвые души сильно тормозят пересчет прав, ломают наследование и создают хаос в политиках безопасности.

PowerShell скрипт для поиска и удаления мертвых SID:


$Path = "C:\Shares\Department"
$ACLs = Get-Acl -Path $Path
$Rules = $ACLs.Access | Where-Object { $_.IdentityReference -match "^S-1-5-21" }

foreach ($Rule in $Rules) {
$ACLs.RemoveAccessRule($Rule) | Out-Null
Write-Host "Удален мертвый SID: " $Rule.IdentityReference
}
Set-Acl -Path $Path -AclObject $ACLs


Зачем это нужно:
Порядок в Active Directory должен отражаться порядком в файловых системах. Идеально подходит для включения в план реструктуризации домена и вывода из эксплуатации старых систем вроде Windows 2012 R2.

#windows #powershell #activedirectory #security #admin_future
3
Итог: ИИ — это очень хороший стажёр с фотографической памятью и нулевым чувством ответственности. Он делает то что просишь, не думает о последствиях и иногда уверенно врёт. Твоя задача — быть опытным тимлидом этого стажёра, а не слепо доверять его выводам.

#skills #AI #автоматизация #sysadmin #карьера #powershell #admin_future
💯2