10 PowerShell-скриптов, которые экономят сисадмину несколько часов в неделю
Я занимаюсь IT-аутсорсингом для небольших компаний уже двенадцать лет, и каждый раз, когда захожу в новый офис, вижу одно и то же: сисадмин тратит половину дня на вещи, которые давно должен делать скрипт. Ходит по рабочим местам с флешкой, вручную ищет установленное ПО, забывает заблокировать уволенного до следующего утра. PowerShell при этом есть на каждой машине — и никто им толком не пользуется. Я собрал десять скриптов, которые реально работают у наших клиентов и суммарно экономят от двух до пяти часов в неделю.
Почему PowerShell, а не специализированные утилиты
Первый вопрос, который мне задают на встречах: а зачем писать скрипты, если есть готовые инструменты? Отвечу цифрами. Нормальная система инвентаризации уровня SCCM — это от 30 000 рублей за серверную лицензию плюс клиентские CAL. LANScope, SolarWinds, даже упрощённые отечественные аналоги — от 60 000 до 150 000 рублей в год. Для юридической фирмы на 18 рабочих мест или медклиники на 25 компьютеров это просто не окупается. Совсем.
PowerShell встроен в Windows, начиная с Server 2008. Он уже есть. Он не требует установки. У него нет лицензии. И для задач малого офиса он закрывает примерно 80% того, что умеют платные инструменты. Я не говорю, что SCCM не нужен — нужен, но когда у вас 500 машин и выше. При 30–50 рабочих местах платить шестизначную сумму за то, что делается скриптом за вечер, по меньшей мере странно.
Ещё один аргумент — прозрачность. Вы точно знаете, что скрипт делает, потому что сами его читали. Никакого агента на каждой машине, никаких облачных сервисов, которые собирают данные непонятно куда. Для клиентов с персональными данными — медицина, юристы, бухгалтерия — это принципиально. Я несколько раз отказывался от внедрения стороннего мониторинга именно по этой причине: регулятор спросит, куда уходят данные о конфигурации машин, а ответить будет нечем.
Скрипты 1 и 2: инвентаризация железа и программного обеспечения
Первый скрипт — самый часто используемый. Обходит все компьютеры в домене через WMI и собирает в одну таблицу: имя машины, процессор, объём оперативной памяти, серийный номер материнской платы, объём дисков, версию операционной системы и дату последней загрузки. Результат — CSV-файл, который открывается в Excel без танцев с форматом. В основе — Get-ADComputer для получения списка машин, дальше Get-CimInstance с классами Win32_ComputerSystem, Win32_Processor, Win32_PhysicalMemory. Работает удалённо, машины не нужно трогать руками.
Конкретный случай из практики. Один наш клиент — строительная компания на 35 рабочих мест — в прошлом году готовился к переходу с Windows 10, срок поддержки которой заканчивается. Нужно было понять, какие машины вытянут Windows 11 по железу, а какие пора менять. Запустил скрипт — через двадцать минут получил полный список с процессорами, памятью и статусом TPM. Без скрипта сисадмин потратил бы день, обходя каждый стол. Буквально день. Восемь часов рабочего времени, которые стоят денег.
Второй скрипт — реестр установленного ПО. Читает ветку HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall и аналогичную ветку для 32-битных программ с каждой машины в домене. Результат — опять CSV. Что в нём можно увидеть: сколько копий 1С Бухгалтерия 3.0 реально установлено и сравнить с количеством лицензий, стоит ли где-нибудь Adobe Acrobat Pro без лицензии, не занесли ли пользователи торренты или игры. У одного клиента — бухгалтерская фирма, 18 машин — обнаружили, что 1С стоит на 11 компьютерах при восьми купленных лицензиях. Разобрались до проверки. Хорошо, что до.
Скрипты 3 и 4: блокировка уволенного сотрудника за тридцать секунд
Это, пожалуй, самый важный скрипт в списке. Когда сотрудник увольняется — особенно в конфликтной ситуации — у вас есть буквально минуты, чтобы закрыть доступ. Стандартный ручной процесс: зайти в Active Directory Users and Computers, найти учётку, отключить, убрать из всех групп, сменить пароль, записать в журнал. При аккуратной работе — минут десять. Если сисадмин занят или не сразу узнал — полчаса, час. За это время человек успевает скачать что угодно.
Скрипт делает всё одной командой: Disable-ADAccount, Move-ADObject в OU «Уволенные», Remove-ADGroupMember в цикле по всем группам из Get-ADPrincipalGroupMembership, Set-ADAccountPassword с рандомным паролем, Set-ADUser с обновлением поля Description — туда пишется дата и имя того, кто запустил скрипт. Тридцать секунд. Можно повесить на кнопку — буквально ярлык на рабочем столе у HR, который вызывает скрипт с одним параметром: логин учётной записи. Нажал, ввёл имя, всё. Дальше AD применит политики, RDP отвалится, доступ к файловым шарам закроется автоматически.
Четвёртый скрипт — для тех, у кого Exchange или Microsoft 365. После блокировки AD нужно ещё отключить почтовый ящик и поставить автоответ «этот сотрудник больше не работает в компании, обращайтесь по адресу...». Без этого клиенты продолжают писать на старый адрес, письма теряются или, что хуже, кто-то продолжает читать почту с телефона ещё несколько дней. Скрипт использует Set-Mailbox -HiddenFromAddressListsEnabled и Set-MailboxAutoReplyConfiguration. Для Exchange On-Premises работает напрямую, для Microsoft 365 нужен модуль ExchangeOnlineManagement — ставится один раз командой Install-Module.
Был у нас случай: менеджер по продажам уволилась не по-хорошему, унесла базу клиентов. Доступ заблокировали только утром следующего дня — HR не сразу сообщил в IT. Теперь у этого клиента стоит правило: как только приказ подписан, HR нажимает кнопку. Не на следующее утро, не «как дойдут руки». Сразу. Скрипт не даёт забыть и не требует помнить последовательность из шести шагов.
Скрипты 5 и 6: очистка профилей и временных файлов
Пятый скрипт решает хроническую проблему RDS-серверов и просто рабочих станций — разросшиеся профили пользователей. На сервере терминалов, где работают 25–30 человек, через три года накапливаются профили давно уволенных сотрудников, разбросанные кеши, папки AppData на десятки гигабайт. Скрипт находит профили, которые не использовались больше 90 дней — берёт LastLogonDate из AD, — проверяет, что учётка реально отключена или удалена, и только тогда удаляет профиль. Параметр -WhatIf показывает, что будет удалено, не трогая ничего реально. Я всегда делаю первый прогон в режиме симуляции. Без исключений.
Шестой скрипт проще, но даёт мгновенный результат. Чистит временные папки: %TEMP% каждого пользователя, C:\Windows\Temp, папку загрузок Windows Update из SoftwareDistribution\Download, кеш браузеров при необходимости. Запускается удалённо на всех машинах через Invoke-Command. На одном RDS-сервере у клиента из юридической фирмы в первый раз освободили 47 гигабайт. Сервер работал три года без чистки. Диск был занят на 91 процент. После скрипта — 68. Это был наглядный ответ на вопрос руководства «почему сервер тормозит».
Важный момент: оба скрипта пишут лог. Что удалено, сколько освобождено места, на каком компьютере, в какое время. Если кто-то скажет «вы удалили мои файлы» — есть история с доказательствами того, что удалялось только из системных временных папок, а не из папки Documents пользователя. В нашей практике такие споры бывали. Один раз лог закрыл вопрос за минуту.
Скрипты 7 и 8: мониторинг дискового пространства и уведомления об истечении паролей
Седьмой скрипт проверяет свободное место на всех дисках всех серверов из заранее заданного списка. Логика простая: свободно меньше 15% — письмо на почту с предупреждением, меньше 5% — письмо с темой «КРИТИЧНО: диск заканчивается». Использует Send-MailMessage или Net.Mail.SmtpClient для TLS — никаких внешних модулей. Ставится в Планировщик заданий, запускается каждые четыре часа. Настройка занимает полчаса, включая тесты.
Этот скрипт спас бы ситуацию у одного нашего клиента — юридическая компания, файловый сервер на Windows Server 2019. В воскресенье вечером партнёр залил на сервер 22 гигабайта архивов с документами — подготовка к большому процессу. Диск забился под 100 процентов. В понедельник утром 1С отказалась запускаться — не смогла создать временные файлы. Потеряли два часа на диагностику и освобождение места. Теперь скрипт предупреждал бы ещё в пятницу, когда диск перевалил за 80, — было бы время отреагировать спокойно, а не в панике в понедельник в девять утра.
Восьмой скрипт — уведомления об истечении паролей. Search-ADAccount -PasswordExpiring с параметром -TimeSpan (New-TimeSpan -Days 14) находит всех пользователей, у которых пароль истекает в ближайшие 14 дней. Каждому отправляется персональное письмо: «Ваш пароль в домене истекает через столько-то дней, поменяйте его нажав Ctrl+Alt+Del». Звучит банально, но в малом офисе без этого по понедельникам обрывают телефон: «я не могу зайти». Особенно актуально для пользователей, работающих удалённо через VPN или RDP, — они не видят стандартного предупреждения Windows. Скрипт запускается ежедневно в 8 утра.
Скрипты 9 и 10: аудит групповых политик и история входов пользователей
Девятый скрипт экспортирует настройки всех групповых политик в читаемый HTML-отчёт командой Get-GPOReport -All -ReportType HTML. Когда что-то перестаёт работать — не применяется политика, не устанавливается принтер, блокируется USB — первое, что нужно сделать, это понять, какие политики вообще применяются и к чему. Ручное хождение по Group Policy Management Console занимает час. Скрипт генерирует отчёт за минуту. Плюс если запускать его раз в месяц и сохранять в папку с датой в имени файла, потом можно сравнить: что изменилось в политиках между январём и мартом. Очень помогает, когда что-то «само сломалось» — а на самом деле кто-то поменял GPO без записи в журнале изменений.
Десятый скрипт — история входов и выходов конкретного пользователя. Парсит журнал безопасности Windows: событие 4624 — успешный вход, 4634 — выход. Get-WinEvent с фильтром @{LogName='Security'; Id=4624,4634} плюс фильтр по имени пользователя и временному диапазону. Результат — таблица: когда зашёл, с какого компьютера, через какой метод — интерактивно, RDP или по сети. Руководители иногда спрашивают: «Иванов говорит, что работал в пятницу, а отчёт не сдал — он вообще заходил в систему?» Теперь есть ответ за тридцать секунд, и никакого неудобного разговора вслепую.
Один нюанс, который важно учесть: журнал безопасности на контроллере домена по умолчанию хранит только 20 МБ событий. При активном домене это несколько дней, не месяц. Скрипт адаптируется для работы с архивными логами, если вы заранее настроили их архивацию. Мы обычно через GPO устанавливаем размер журнала Security на всех DC на 1 ГБ — этого хватает на несколько месяцев истории при нагрузке среднего офиса.
Как всё это запустить: политики выполнения, права и планировщик
Первый барьер, который встречает каждый, кто начинает работать с PowerShell в корпоративной среде — Execution Policy. По умолчанию Windows не запускает неподписанные скрипты. Самое простое решение: Set-ExecutionPolicy RemoteSigned -Scope LocalMachine на каждом сервере. Или правильнее — через GPO: Конфигурация компьютера — Административные шаблоны — Компоненты Windows — Windows PowerShell — «Включить выполнение скриптов» — «Разрешить локальные и удалённые подписанные скрипты». Второй вариант применяется автоматически на всех машинах домена без ручного обхода.
Второй момент — права доступа. Большинству скриптов для чтения из AD и WMI достаточно аккаунта с правами Domain Users плюс членство в группе Remote Management Users на целевых серверах. Для скриптов, которые что-то меняют — блокировка учёток, очистка профилей — нужны права Domain Admins или делегированные права на конкретные OU. Я рекомендую создать отдельную учётную запись svc_powershell с минимально необходимыми правами и запускать все скрипты от неё. Не от своей учётки, не от встроенного Administrator. Это и безопасность, и аудит — в логах событий будет чётко видно, что изменения вносил именно сервисный аккаунт, а не живой человек.
Третье — Планировщик заданий. Все регулярные скрипты настраиваются через Task Scheduler: мониторинг дисков каждые четыре часа, уведомления о паролях ежедневно в 8:00, инвентаризация раз в неделю в пятницу ночью. Сделать это можно через GUI или через Register-ScheduledTask прямо из PowerShell. Результаты пишутся в лог-файлы с датой в имени — diskcheck_20260628.log, inventory_20260628.csv — в сетевую папку, доступную сисадмину с любого компьютера. Через месяц работы накапливается история, по которой видны тенденции: например, диск на файловом сервере прибавляет по 3 ГБ в неделю, значит через два месяца закончится. Это уже не просто автоматизация — это аналитика, которая позволяет планировать закупки и работы заблаговременно, а не в аварийном режиме.
Частые вопросы
Нужно ли покупать дополнительные модули или лицензии для этих скриптов?
Нет. Все скрипты используют только то, что входит в стандартный комплект Windows Server и RSAT — Remote Server Administration Tools. Модуль ActiveDirectory доступен бесплатно как часть RSAT, устанавливается через «Компоненты Windows» в пару кликов. Единственное исключение — если нужно управлять Microsoft 365, понадобится модуль ExchangeOnlineManagement. Он тоже бесплатный, устанавливается командой Install-Module из PowerShell Gallery.
Скрипты работают только с Active Directory или можно использовать в рабочей группе без домена?
Большинство скриптов написаны под доменную среду — там проще работать с учётными записями и удалённым управлением через WMI. Но скрипты очистки временных файлов и мониторинга дисков работают и без домена: вместо Get-ADComputer просто указываете список машин вручную. Инвентаризация тоже адаптируется — вместо запроса из AD используется заранее заданный массив имён компьютеров или IP-адресов.
Что если скрипт случайно удалит что-то важное?
Все скрипты, которые что-то удаляют или меняют, поддерживают параметр -WhatIf — стандартный механизм PowerShell, который показывает, что будет сделано, без реального выполнения. Первый запуск всегда делайте с этим параметром. Плюс для удаления профилей и файлов обязательно настройте резервное копирование — мы используем либо встроенный Windows Server Backup, либо Veeam, в зависимости от бюджета клиента. Скрипт — не замена бэкапу.
Нужен ли продвинутый уровень PowerShell, чтобы адаптировать скрипты под свой офис?
Нет. Большинство параметров, которые придётся менять — имена OU в Active Directory, адрес SMTP-сервера, список серверов для мониторинга, пороговые значения в процентах — вынесены в переменные в начале каждого скрипта с пояснениями. Базового понимания синтаксиса PowerShell — переменные, циклы foreach, условия if — достаточно, чтобы адаптировать любой из этих скриптов под свои нужды за полчаса.
Свяжитесь с нами — настроим скрипты под вашу инфраструктуру, покажем как они работают и обучим вашего сисадмина за одну сессию.
Бесплатная консультация →
Подпишитесь на рассылку ITfresh
Раз в неделю — практические гайды для руководителя и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.
