PowerShell 23 марта 2026 10 мин чтения

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

PowerShell управление модулями Windows

Модули PowerShell — это готовые наборы командлетов, функций и скриптов, которые расширяют возможности оболочки далеко за пределы стандартного набора. Хотите управлять Active Directory из консоли? Нужен модуль. Хотите автоматизировать обновления Windows, мониторить SQL Server или работать с VMware из скрипта? Снова модуль. Понимание того, как правильно устанавливать, обновлять и удалять модули, экономит сисадмину часы работы каждую неделю.

В этой статье разберём полный цикл: от настройки репозиториев до офлайн-установки в изолированных средах. Все примеры проверены на 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

Модули PowerShell — это не просто удобство, это фундамент автоматизации. Правильно выстроенный процесс управления модулями (репозитории, версионирование, офлайн-доставка) экономит время при каждом новом проекте и делает инфраструктуру предсказуемой. Потратьте час на настройку корпоративного репозитория — и в следующий раз установка любого модуля займёт одну команду.

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

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

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

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