PowerShell 23 марта 2026 10 мин чтения ...
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT

Управление модулями PowerShell: установка, обновление и удаление для сисадмина

powershell-module-management

Модуль PowerShell — это готовый набор командлетов, функций и скриптов, который превращает голую оболочку в полноценный инструмент администратора. Управлять Active Directory из консоли? Нужен модуль. Автоматизировать обновления Windows, мониторить SQL Server или гонять задачи по VMware из скрипта? Снова модуль. За 15 лет работы с Windows-инфраструктурами я убедился: тот, кто умеет грамотно работать с модулями, экономит от двух до пяти часов в неделю — просто за счёт автоматизации рутины.

В этой статье пройдём полный цикл: от настройки репозиториев до офлайн-установки в изолированных средах. Все примеры проверены вживую на Windows Server 2019/2022 и Windows 10/11.

Что такое модуль PowerShell и где он живёт

Модуль PowerShell — это, по сути, папка с файлами .psm1, .psd1 и командлетами, упакованная для переиспользования. Windows «из коробки» тащит с собой десятки таких модулей: NetTCPIP, Storage, ScheduledTasks и ещё много чего. Всё остальное ставится из репозиториев или вручную — об этом и поговорим.

Посмотреть все доступные в системе модули:

# Все модули, которые PowerShell видит в текущем PSModulePath
Get-Module -ListAvailable

# Только загруженные в текущую сессию
Get-Module

# Быстрый поиск: есть ли нужный модуль?
Get-Module -ListAvailable -Name ActiveDirectory

Модули хранятся в путях, которые перечислены в переменной $env:PSModulePath. Выведите её — и сразу поймёте, куда именно PowerShell смотрит при импорте:

$env:PSModulePath -split ';'

Типичный вывод на сервере с доменом:

C:\Users\admin\Documents\WindowsPowerShell\Modules
C:\Program Files\WindowsPowerShell\Modules
C:\Windows\system32\WindowsPowerShell\v1.0\Modules
Совет: Модули, установленные через Install-Module без флага -Scope CurrentUser, попадают в C:\Program Files\WindowsPowerShell\Modules и доступны всем пользователям системы. С флагом -Scope CurrentUser — только текущему пользователю, в его домашнем профиле.

Настройка репозиториев PowerShell

По умолчанию PowerShell знает об одном репозитории — PSGallery (gallery.technet.microsoft.com / powershellgallery.com). Публичный магазин от Microsoft и сообщества, там сейчас больше 10 000 пакетов. На практике хватает почти для всего.

# Посмотреть список подключённых репозиториев
Get-PSRepository

Пример вывода:

Name      InstallationPolicy  SourceLocation
----      ------------------  --------------
PSGallery Untrusted           https://www.powershellgallery.com/api/v2

Обратите внимание: PSGallery по умолчанию помечен как Untrusted. При каждой установке PowerShell будет переспрашивать — это быстро надоедает. На своих серверах я первым делом убираю этот вопрос:

Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

Подключение корпоративного репозитория

В изолированных или корпоративных средах мы обычно поднимаем локальный репозиторий — сетевая папка или внутренний NuGet-сервер. Регистрируется одной командой, никаких лишних телодвижений:

# Зарегистрировать SMB-папку как репозиторий
Register-PSRepository `
    -Name CorpModules `
    -SourceLocation '\\msk-srv01\PSRepo' `
    -InstallationPolicy Trusted

# Проверить
Get-PSRepository

Удалить репозиторий, если он больше не нужен:

Unregister-PSRepository -Name CorpModules
Внимание: На серверах без прямого интернета нужно либо настроить прокси для PSGallery, либо использовать локальный репозиторий. Просто вызов Install-Module без доступа к gallery.technet.microsoft.com зависнет или выдаст ошибку тайм-аута.

Поиск и установка модулей из PSGallery

Поиск модуля

Прежде чем ставить — найдите нужный пакет. Find-Module поддерживает маски и теги, что сильно ускоряет поиск:

# Найти все модули, связанные с SQL
Find-Module -Name *SQL*

# Найти модули с тегом "ActiveDirectory"
Find-Module -Tag ActiveDirectory

# Посмотреть детальную информацию перед установкой
Find-Module -Name PSWindowsUpdate | Select-Object Name, Version, Author, Description

Установка модуля

Установка — одна команда. PowerShell сам разберётся с зависимостями и скачает всё необходимое:

# Установить последнюю версию для всех пользователей (требует прав администратора)
Install-Module -Name PSWindowsUpdate

# Установить только для текущего пользователя (без прав администратора)
Install-Module -Name PSWindowsUpdate -Scope CurrentUser

# Установить конкретную версию
Install-Module -Name SqlServer -RequiredVersion 21.1.18256

# Установить несколько модулей сразу
'PSWindowsUpdate','ImportExcel','Posh-SSH' | ForEach-Object {
    Install-Module -Name $_ -Force -Confirm:$false
}
Совет: Флаг -AllowClobber пригодится, когда новый модуль содержит командлеты с именами, уже существующими в системе. Без него установка завершится ошибкой конфликта имён.

Политика выполнения скриптов

Если при первом запуске командлетов из нового модуля падает ошибка "cannot be loaded because running scripts is disabled" — это политика выполнения. Лечится так:

# Проверить текущую политику
Get-ExecutionPolicy

# Разрешить локальные скрипты и скрипты с подписью из сети
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine

# Для одного пользователя
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Просмотр установленных модулей и их командлетов

После установки стоит убедиться, что всё прошло нормально, и посмотреть, какие именно командлеты появились в системе:

# Список всех установленных через Install-Module пакетов
Get-InstalledModule

# Вся информация о конкретном модуле
Get-InstalledModule -Name PSWindowsUpdate | Format-List *

# Импортировать модуль в текущую сессию (обычно происходит автоматически)
Import-Module -Name PSWindowsUpdate

# Посмотреть все командлеты модуля
Get-Command -Module PSWindowsUpdate

# Быстрый онлайн-просмотр без импорта
(Find-Module -Name ImportExcel).AdditionalMetadata
Совет: В PowerShell 3+ работает автозагрузка модулей: если вы вводите командлет из установленного модуля, PowerShell импортирует его автоматически. Явный Import-Module нужен для ускорения первого запуска или при конфликтах версий.

Офлайн-установка модулей (для изолированных серверов)

В большинстве продакшн-сред серверы в интернет не смотрят. Мы в таких случаях используем проверенный алгоритм офлайн-установки:

Шаг 1: Скачайте модуль на машине с интернетом

# Скачать модуль как файл без установки
Save-Module -Name PSWindowsUpdate -Path 'C:\Temp\PSModules'
Save-Module -Name ImportExcel -Path 'C:\Temp\PSModules'

# Или сразу с зависимостями
Save-Module -Name dbatools -Path 'C:\Temp\PSModules' -IncludeDependencies

Шаг 2: Перенесите папки на изолированный сервер

Скопируйте скачанные папки модулей — каждая папка это один модуль — в директорию, которая входит в $env:PSModulePath:

# Например, скопировать в общую папку модулей
Copy-Item -Path 'C:\Temp\PSModules\PSWindowsUpdate' `
          -Destination 'C:\Program Files\WindowsPowerShell\Modules\' `
          -Recurse -Force

Шаг 3: Разблокируйте файлы (если они пришли с другой машины)

# Снять MOTW (Mark of the Web) с файлов модуля
Get-ChildItem 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate' `
    -Recurse | Unblock-File

Шаг 4: Проверьте установку

Get-Module -ListAvailable -Name PSWindowsUpdate
Import-Module PSWindowsUpdate
Get-Command -Module PSWindowsUpdate
Внимание: Некоторые модули (например, dbatools) весят несколько сотен мегабайт из-за встроенных сборок .NET. Убедитесь, что у вас достаточно места в папке модулей и что версия .NET на целевой машине соответствует требованиям модуля.

Обновление модулей PowerShell

Устаревшие модули — это не просто пропущенные функции. Это дыры в безопасности. Обновляться регулярно — такая же гигиена, как патчить саму ОС.

# Обновить конкретный модуль до последней версии
Update-Module -Name SqlServer

# Обновить все установленные модули сразу
Update-Module

# Обновить с принудительной перезаписью (игнорировать предупреждения)
Update-Module -Force

# Посмотреть, какие модули устарели (сравнить с PSGallery)
Get-InstalledModule | ForEach-Object {
    $latest = Find-Module -Name $_.Name -ErrorAction SilentlyContinue
    if ($latest -and [version]$latest.Version -gt [version]$_.Version) {
        [PSCustomObject]@{
            Name        = $_.Name
            Installed   = $_.Version
            Available   = $latest.Version
        }
    }
}

После обновления модуль нужно перезагрузить в текущей сессии:

Import-Module -Name PSWindowsUpdate -Force
Совет: Поставьте этот скрипт сравнения версий в планировщик задач — раз в неделю он будет генерировать отчёт об устаревших модулях и отправлять его на почту. Так вы всегда будете знать, что нужно обновить.

Удаление модулей PowerShell

Удаление тоже случается регулярно: конфликтующие версии, модули от уволившихся коллег, тестовые пакеты, которые кто-то случайно затащил в продакшн.

# Удалить модуль из системы
Uninstall-Module -Name PSWindowsUpdate

# Удалить конкретную версию (если установлено несколько)
Uninstall-Module -Name SqlServer -RequiredVersion 21.1.18230

# Удалить все версии модуля сразу
Get-InstalledModule -Name SqlServer -AllVersions | Uninstall-Module -Force

# Выгрузить модуль из текущей сессии (не удаляет с диска)
Remove-Module -Name PSWindowsUpdate
Внимание: Uninstall-Module работает только с модулями, установленными через Install-Module. Встроенные модули Windows (из C:\Windows\system32\WindowsPowerShell\) таким способом не удаляются — их нужно удалять через роли и компоненты Windows.

Работа с несколькими версиями одного модуля

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

# Установить несколько версий рядом
Install-Module -Name SqlServer -RequiredVersion 21.1.18230 -AllowClobber
Install-Module -Name SqlServer -RequiredVersion 22.0.59 -AllowClobber

# Посмотреть все установленные версии
Get-InstalledModule -Name SqlServer -AllVersions

# Импортировать конкретную версию
Import-Module -Name SqlServer -RequiredVersion 21.1.18230

Топ модулей PowerShell для системных администраторов

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

Автоматизация установки модулей через скрипт развёртывания

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

# deploy-ps-modules.ps1
# Запускать от имени администратора

$modules = @(
    'PSWindowsUpdate',
    'ImportExcel',
    'Posh-SSH',
    'dbatools',
    'SqlServer'
)

# Убедиться, что PSGallery доверенный
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

foreach ($mod in $modules) {
    if (-not (Get-InstalledModule -Name $mod -ErrorAction SilentlyContinue)) {
        Write-Host "Устанавливаю $mod..." -ForegroundColor Cyan
        Install-Module -Name $mod -Scope AllUsers -Force -AllowClobber
        Write-Host "OK: $mod установлен" -ForegroundColor Green
    } else {
        $ver = (Get-InstalledModule -Name $mod).Version
        Write-Host "Пропускаю $mod (уже установлен, версия $ver)" -ForegroundColor Yellow
    }
}

Write-Host "`nУстановлено модулей: $($modules.Count)" -ForegroundColor Green
Совет: Добавьте этот скрипт в Desired State Configuration (DSC) или в ваш Ansible/Puppet-плейбук — тогда нужный набор модулей будет автоматически появляться на каждом новом сервере при его вводе в эксплуатацию.

Диагностика проблем с модулями

Модуль не подгружается, командлеты молчат. Знакомая ситуация. Вот где копать в первую очередь:

# 1. Проверить, что модуль вообще виден
Get-Module -ListAvailable -Name ModuleName

# 2. Проверить политику выполнения
Get-ExecutionPolicy -List

# 3. Попробовать явный импорт с подробным выводом
Import-Module ModuleName -Verbose

# 4. Проверить зависимости модуля
(Get-Module -ListAvailable -Name ModuleName).RequiredModules

# 5. Проверить, не заблокированы ли файлы (MOTW)
Get-ChildItem "$env:ProgramFiles\WindowsPowerShell\Modules\ModuleName" -Recurse |
    Where-Object { (Get-Item $_.FullName -Stream Zone.Identifier -ErrorAction SilentlyContinue) } |
    Select-Object FullName

За 15 лет работы с Windows-инфраструктурами я убедился: модули PowerShell — это не надстройка над системой, а её несущий каркас. Один раз грамотно выстроить процесс — репозитории, версионирование, офлайн-доставка на изолированные сегменты сети — и каждый следующий проект запускается в разы быстрее. Корпоративный репозиторий настраивается примерно за час. После этого любой модуль в инфраструктуре встаёт одной командой. Один час против бесконечных «а какая версия у тебя стоит?».

Официальная документация: Microsoft Learn — PowerShell, Microsoft Learn — Windows Server

Часто задаваемые вопросы

Что такое Управление модулями PowerShell: установка, обновление и удаление для сисадмина?

Управление модулями PowerShell: установка, обновление и удаление для сисадмина — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.

Как правильно настроить Управление модулями PowerShell: установка, обновление и удаление для сисадмина?

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

Какие типичные ошибки возникают при работе с Управление модулями PowerShell: установка, обновление и удаление для сисадмина?

Наиболее частые ошибки при работе с Управление модулями PowerShell: установка, обновление и удаление для сисадмина: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.

Нужна помощь специалистов?

ООО «АйТи Фреш» возьмёт это на себя

Не хватает времени или своих специалистов — мы настроим, оптимизируем и возьмём вашу IT-инфраструктуру на постоянное сопровождение. Работаем с юридическими лицами в Москве и регионах. Собственный дата-центр, команда из 8 серверов Dell Xeon Platinum 8280 на базе МТС.

15+лет опыта
25+клиентов
40Gсвоя сеть
24/7поддержка

Комментарии