Модули PowerShell — это готовые наборы командлетов, функций и скриптов, которые расширяют возможности оболочки далеко за пределы стандартного набора. Хотите управлять Active Directory из консоли? Нужен модуль. Хотите автоматизировать обновления Windows, мониторить SQL Server или работать с VMware из скрипта? Снова модуль. Понимание того, как правильно устанавливать, обновлять и удалять модули, экономит сисадмину часы работы каждую неделю.
В этой статье разберём полный цикл: от настройки репозиториев до офлайн-установки в изолированных средах. Все примеры проверены на Windows Server 2019/2022 и Windows 10/11.
Модуль 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 знает об одном репозитории — 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
Install-Module без доступа к gallery.technet.microsoft.com зависнет или выдаст ошибку тайм-аута.Прежде чем устанавливать — найдите нужный пакет. Команда 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
Import-Module нужен для ускорения первого запуска или при конфликтах версий.В большинстве продакшн-сред серверы не имеют прямого доступа в интернет. Вот проверенный алгоритм офлайн-установки:
# Скачать модуль как файл без установки
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
Скопируйте скачанные папки модулей (каждая папка — один модуль) в директорию, входящую в $env:PSModulePath:
# Например, скопировать в общую папку модулей
Copy-Item -Path 'C:\Temp\PSModules\PSWindowsUpdate' `
-Destination 'C:\Program Files\WindowsPowerShell\Modules\' `
-Recurse -Force
# Снять MOTW (Mark of the Web) с файлов модуля
Get-ChildItem 'C:\Program Files\WindowsPowerShell\Modules\PSWindowsUpdate' `
-Recurse | Unblock-File
Get-Module -ListAvailable -Name PSWindowsUpdate
Import-Module PSWindowsUpdate
Get-Command -Module PSWindowsUpdate
dbatools) весят несколько сотен мегабайт из-за встроенных сборок .NET. Убедитесь, что у вас достаточно места в папке модулей и что версия .NET на целевой машине соответствует требованиям модуля.Устаревшие модули — это не только пропущенные функции, но и потенциальные уязвимости. Регулярное обновление — гигиена любого сервера.
# Обновить конкретный модуль до последней версии
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
Удаление тоже бывает нужным: конфликтующие версии, модули от уволившихся сотрудников, тестовые пакеты в продакшн-среде.
# Удалить модуль из системы
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
Вот проверенный список модулей, которые стоит иметь на каждом рабочем сервере сисадмина:
Add-WindowsFeature RSAT-AD-PowerShell на серверах или через Apps & Features на десктопе.При настройке нового сервера удобно иметь один скрипт, который устанавливает все нужные модули:
# 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
Если модуль не загружается или командлеты не работают, проверьте эти точки:
# 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 на базе МТС.