⚡ PowerShell📅 31.03.2026⏱️ 22 мин чтения✍️ АйТи Фреш
Один админ на 200 человек: 20 PowerShell-скриптов для страховой компании
Задача клиента: один администратор, 200 сотрудников и рутина
К нам обратилась страховая компания из Екатеринбурга с историей, которую мы слышим примерно раз в месяц: один IT-администратор на всё. 200 сотрудников, 8 серверов, Active Directory, файловые шары, почтовый сервер — и этот один человек каждое утро вручную проверял диски, листал журналы событий, разблокировал учётки и собирал отчёты для руководства. Классическая картина среднего бизнеса.
Мы посчитали: только на рутинные проверки уходило до 3 часов ежедневно. Это 15 часов в неделю — почти два полных рабочих дня, которые человек тратил не на развитие инфраструктуры, а на то, что машина делает лучше и надёжнее. Мы предложили набор из 20 PowerShell-скриптов, покрывающих все ежедневные задачи, с запуском по расписанию и email-уведомлениями.
Каждый скрипт прогнали на инфраструктуре клиента, прокомментировали так, чтобы любой преемник разобрался без нас, и настроили на автономную работу. Совместимость — PowerShell 5.1 под Windows Server 2019, плюс проверили на PowerShell 7.
Подготовка: настройка рабочего окружения
С чего начали? С подготовки среды выполнения на серверах клиента — без этого скрипты просто не запустятся корректно.
Что мы настроили перед внедрением
На основном сервере управления мы выполнили подготовку:
# Проверка версии PowerShell
$PSVersionTable.PSVersion
# Настройка политики выполнения скриптов
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Установка необходимых модулей
Install-Module -Name ActiveDirectory -Force
Install-Module -Name ImportExcel -Force # Для экспорта в Excel без Office
Install-Module -Name PSWriteHTML -Force # Для HTML-отчётов
# Создание структуры каталогов для скриптов
New-Item -ItemType Directory -Path C:\Scripts\Reports -Force
New-Item -ItemType Directory -Path C:\Scripts\Logs -Force
New-Item -ItemType Directory -Path C:\Scripts\Backup -Force
Все скрипты легли в C:\Scripts, запуск — через Task Scheduler. Просто и предсказуемо.
Принципы, которых мы придерживались
За 15 лет работы с продуктивными средами мы выработали несколько жёстких правил для скриптов, которые работают без присмотра. Вот что применяли здесь:
Обработка ошибок: везде используем try/catch и $ErrorActionPreference = 'Stop' — скрипт должен громко падать, а не молча делать что-то не то
Логирование: каждый скрипт пишет действия в лог-файл с датой и временем — когда что-то пошло не так, первый вопрос «а что происходило до этого?»
Параметризация: все переменные — серверы, пути, email — вынесены в начало скрипта, чтобы при переезде на новую инфраструктуру не лазить по всему коду
Идемпотентность: запустил дважды — ничего не сломалось. Планировщик иногда срабатывает повторно, и к этому нужно быть готовым
Комментарии: каждый скрипт содержит описание, автора и дату — администратор клиента должен через год понять, что делает этот файл, не звоня нам
Блок 1: скрипты мониторинга дисков и ресурсов
Мониторинг дискового пространства — первое, что мы автоматизировали. Знаете, сколько раз нехватка места на диске укладывала сервер в самый неподходящий момент? У этой страховой компании — дважды за последний квартал до нашего прихода. Дважды, Карл.
Скрипт 1: Мониторинг свободного места на дисках
Скрипт крутится каждый час, опрашивает все 8 серверов и сразу шлёт алерт, если диск заполняется:
Параллельно настроили запись истории нагрузки серверов. Это не для тушения пожаров — это чтобы видеть тренды и заранее понимать, когда пора думать об апгрейде:
Администратор периодически жаловался на «медленные серверы» — классическая жалоба без конкретики. Написали скрипт для быстрой диагностики утечек памяти, чтобы за 30 секунд получить внятную картину:
Был инцидент: с одного из ПК пошли подозрительные соединения наружу. После этого мы добавили скрипт анализа сетевой активности — лучше видеть такое сразу, а не постфактум:
Active Directory в страховой — это не просто каталог. Это центральный нерв всей инфраструктуры: 200 пользователей, постоянная ротация кадров, плюс регулятор дышит в спину с требованиями по безопасности. На ручной аудит AD уходили часы каждую неделю. Мы это исправили.
Скрипт 5: Отчёт по неактивным пользователям AD
Текучка в страховом бизнесе выше среднего — это факт. Забытые активные учётки уволенных сотрудников были реальной дырой в безопасности. Поставили еженедельную автоматическую проверку:
Открывался новый филиал — нужно 30 учёток за один день. Руками это часа три минимум. Подготовили скрипт массового создания с транслитерацией из CSV, и задача закрылась за 10 минут:
Скрипты 8-9: Поиск заблокированных учёток и контроль паролей
Блокировки учёток здесь были ежедневной рутиной — люди выходят из отпуска и напрочь забывают пароли. Администратор узнавал об этом только когда сотрудник звонил. Автоматизировали поиск блокировок и уведомления, чтобы реагировать проактивно:
Каждое утро администратор тратил около часа на одно и то же: проверить службы, пролистать Event Viewer. Час. Каждый день. Мы убрали эту потерю полностью.
Скрипт мониторинга служб крутится каждые 15 минут. Упала ключевая служба — сам перезапустит и пришлёт уведомление. Администратор узнаёт о проблеме уже после её решения:
# Скрипт 10: Мониторинг и автоперезапуск критичных служб
$criticalServices = @(
@{Name='Spooler'; DisplayName='Служба печати'},
@{Name='MSSQLSERVER'; DisplayName='SQL Server'},
@{Name='W3SVC'; DisplayName='IIS Web Server'},
@{Name='WinRM'; DisplayName='Windows Remote Management'},
@{Name='DNS'; DisplayName='DNS Server'}
)
$logFile = "C:\Scripts\Logs\ServiceRestart_$(Get-Date -Format 'yyyyMMdd').log"
function Write-Log($message) {
$entry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $message"
Add-Content -Path $logFile -Value $entry
Write-Host $entry
}
foreach ($svc in $criticalServices) {
$service = Get-Service -Name $svc.Name -ErrorAction SilentlyContinue
if (-not $service) {
Write-Log "[SKIP] $($svc.DisplayName) — служба не найдена"
continue
}
if ($service.Status -ne 'Running') {
Write-Log "[WARN] $($svc.DisplayName) не запущена (статус: $($service.Status))"
try {
Start-Service -Name $svc.Name -ErrorAction Stop
Start-Sleep -Seconds 5
$service.Refresh()
if ($service.Status -eq 'Running') {
Write-Log "[OK] $($svc.DisplayName) успешно перезапущена"
} else {
Write-Log "[FAIL] $($svc.DisplayName) не удалось запустить"
}
} catch {
Write-Log "[ERROR] $($svc.DisplayName): $_"
}
} else {
Write-Log "[OK] $($svc.DisplayName) работает нормально"
}
}
Скрипт 11: Анализ журналов событий Windows
Event Viewer руками — это боль. Настроили автоматический сбор критичных событий со всех серверов в один отчёт, который приходит утром на почту:
Скрипты 12-13: Аудит запланированных задач и автозагрузки
Был неприятный момент: на одном из ПК обнаружили постороннюю задачу в планировщике. Откуда взялась — непонятно. После этого добавили скрипты аудита Task Scheduler и автозагрузки:
Резервное копирование в страховой — это не «хорошо бы делать», это требование регулятора. Автоматизировали бэкапы файлов, конфигураций сетевого оборудования и очистку устаревших данных.
Скрипт 14: Инкрементальный бэкап с ротацией
Для файлового сервера настроили инкрементальные бэкапы с автоматической ротацией — старые версии удаляются сами, хранилище не пухнет:
Скрипт 15: Бэкап конфигурации сетевого оборудования
В инфраструктуре клиента стояли Cisco-коммутаторы и FortiGate-файрвол. Конфигурации никто не бэкапил — просто потому что руками это неудобно. Настроили автоматический бэкап по SSH:
Скрипт 16: Очистка временных файлов и старых логов
На файловом сервере накопилось 40 ГБ временных файлов — никто не убирал годами. Внедрили автоматическую очистку по расписанию, и больше этот вопрос не возникает:
Страховщики работают с персональными данными — это значит, что мониторинг безопасности здесь не «было бы хорошо сделать», а жёсткое требование регулятора. Мы выстроили автоматический контроль сертификатов и аудит попыток доступа с нуля.
Скрипт 17: Проверка сроков SSL-сертификатов
Однажды истёкший сертификат на клиентском портале положил сервис на 4 часа. После этого инцидента разговоры про «потом настроим» закончились — мы сразу внедрили упреждающий мониторинг:
Скрипт 18: Аудит безопасности — попытки несанкционированного доступа
Регулятор требует фиксировать неудачные попытки входа. Спорить с этим бессмысленно, поэтому настроили ежедневный аудит — автоматически, без участия администратора:
Последний блок скриптов — сетевая диагностика и ежедневный отчёт для руководства. Если честно, именно отчёт произвёл на клиента самое сильное впечатление. Директор по ИТ каждое утро открывает почту и видит красивый HTML-дайджест: что работает, что требует внимания, общее состояние инфраструктуры.
Скрипт 19: Комплексная сетевая диагностика
«Интернет не работает» — самая частая жалоба пользователей. Администратор клиента запускает этот скрипт первым делом: за 30 секунд понятно, где именно проблема — на клиенте, внутри сети или за её пределами:
Этот скрипт — наша отдельная гордость в проекте. Каждое утро в 7:00 директор по ИТ и генеральный директор получают на почту HTML-отчёт о состоянии инфраструктуры. Никаких сырых логов — только то, что нужно руководству:
Две недели работы — и проект автоматизации для страховой компании закрыт. Что по итогу получилось:
20 PowerShell-скриптов внедрены и поставлены на автоматический запуск через Task Scheduler
Экономия 15 часов в неделю — именно столько администратор тратил на рутинные проверки вручную, теперь это время освободилось
Email-уведомления о критичных событиях приходят в течение 5 минут — раньше о проблемах узнавали только на следующий день, когда пользователи начинали звонить
Ежедневный HTML-отчёт для руководства — никакой чёрной дыры: что происходит в IT-инфраструктуре, видно каждое утро
Аудит безопасности AD — нашли 47 неактивных учёток, часть из них с привилегированным доступом. Все деактивированы
Автоматический бэкап файлов и конфигурации сетевого оборудования — с ротацией копий и уведомлениями, если что-то пошло не так
Документация — каждый скрипт прокомментирован так, чтобы администратор клиента мог сам поменять параметры без нашей помощи
Бизнес-результат: уже в первый месяц после внедрения администратор направил высвободившиеся часы на миграцию почтового сервера и внедрение VPN — оба проекта откладывались полгода. Руководство наконец получило реальный инструмент контроля за IT, а компания без проблем прошла аудит безопасности регулятора.
Часто задаваемые вопросы
Мы запускаем скрипты через Task Scheduler. Создаём задачу: программа — powershell.exe, аргументы — -NoProfile -ExecutionPolicy Bypass -File C:\Scripts\YourScript.ps1. Запуск — от имени учётки с нужными правами. Для скриптов, работающих с AD, наши специалисты всегда используют отдельную сервисную учётную запись, а не личный логин администратора. Если нужно создать задачу скриптом — есть командлет Register-ScheduledTask.
Пароли в открытом виде в скриптах — это табу, без исключений. Мы храним учётные данные через Export-Clixml: Get-Credential | Export-Clixml C:\Scripts\cred.xml. Файл шифруется через DPAPI и работает только на том компьютере и под той учёткой, которая его создала — случайно утащить и расшифровать не получится. Для более сложных сценариев рекомендуем Windows Credential Manager или Azure Key Vault.
Для отправки писем используем Send-MailMessage с параметрами SMTP-сервера. HTML-письма — флаг -BodyAsHtml. Если сервер требует аутентификацию, передаём -Credential (Get-Credential). Office 365 подключается через -SmtpServer smtp.office365.com -Port 587 -UseSsl. Оговорюсь честно: в PowerShell 7 командлет Send-MailMessage помечен устаревшим. Если это принципиально — смотрите модуль Mailozaurr или .NET-класс System.Net.Mail.SmtpClient.
Для удалённого выполнения скриптов — PowerShell Remoting через Invoke-Command: Invoke-Command -ComputerName SRV01 -FilePath C:\Scripts\script.ps1. На целевом сервере предварительно выполняем Enable-PSRemoting -Force. Нужна постоянная сессия — используем New-PSSession. Серверы вне домена добавляем в TrustedHosts: Set-Item WSMan:\localhost\Client\TrustedHosts -Value 'SRV01'. Хотите выполнить скрипт сразу на десяти серверах — передайте массив в параметр -ComputerName, Remoting справится.
Для Windows-инфраструктуры мы обычно берём PowerShell 5.1 — он встроен в Windows Server 2016/2019/2022 и отлично работает с Active Directory, Exchange, SCCM и прочими Microsoft-продуктами без лишних плясок с бубном. PowerShell 7 — история для новых проектов, где нужен кроссплатформенный запуск или хочется пользоваться свежими возможностями синтаксиса. Главное, что обе версии спокойно уживаются на одном сервере — ставьте параллельно и не выбирайте.
Столкнулись с похожей задачей? Обращайтесь — решим
Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.
Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.
С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики
Подпишитесь на рассылку ITfresh
Каждую неделю мы выпускаем практические гайды для руководителей IT и системных администраторов. Это не просто теория! Здесь вы найдёте всё: безопасность, 1С, миграции, резервные копии и проверенные лайфхаки из наших реальных проектов.
Реквизиты оператора персональных данных
ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.