Установка PowerShell модулей без Интернета (офлайн)

По умолчанию в Windows PowerShell модули устанавливаются в онлайн режиме из официального репозитория PowerShell Gallery (PSGallery) с помощью команды Install-Module . Однако, вы не сможете установить нужный модуль PowerShell, если ваш компьютер находится в изолированной от интернета сети или доступ к PSRepository ограничен. Или в сценарии с установкой модуля на on-prem серверах, на которых как правило заблокирован прямой доступ в интернет. В этой статье рассмотрим способы офлайн установки модулей PowerShell, а также возможности импорта установленного модуля с удаленного компьютера.

Обычная установка PowerShell модулей в Windows

Если на компьютере есть доступ в интернет, установка PowerShell модуля сводится к запуску команды InstallModule с указанием имени нужного модуля. Например, для установки PowerShell модуля для взаимодействия с MS SQL Server, выполните:

Install-Module SqlServer

Команда выполнит поиск указанного модуля в подключенных репозиториях. По умолчанию в Windows подключен только один онлайн репозиторий — PSGallery (https://www.powershellgallery.com/):

Get-PSRepository

Если PowerShell модуль найден, через провайдера NuGet из репозитория будет скачан установочный NuGet пакет с указанным модулем и будет выполнена его установка в системе.

Если компьютер находится в изолированной сети, при попутке установки модуля появится ошибка:

WARNING: Network connectivity may not be available, unable to reach remote sources. WARNING: Unable to bootstrap the required package provider due to problems with network connectivity. Please fix your network connection.

PowerShell модули в галерее PSGallery хранятся в формате NuGet (расширение .nupkg ). Скачать вручную модуль можно только в таком упакованном формате .nupkg (вкладка Manual Download). По умолчанию Windows не умеет устанавливать PowerShell модули из nupkg файлов (можно распаковать этот файл и скопировать его содержимое в каталог моделей вручную, но это будет не совсем полноценная установка модуля — основная проблема, в том что при такой установке не будут установлены зависимости).

Офлайн установка PowerShell модулей из Nupkg пакетов

Рассмотрим, как корректно вручную установить PowerShell модуль из nupkg файла (формат NuGet). Идея этого метода в том, что вы можете зарегистрировать в системе локальный репозиторий NuGet в локальной папке, скопировать в него нужные nupkg пакеты с PowerShell модулями и выполнить установку пакета из локального репозитория с помощью стандартной команды Install-Module .

Создайте локальный каталог, который будет использоваться в качестве репозитория:

New-Item -Type Directory c:LocalNugetRepo

Скачайте и скопируйте нужный пакет nupkg в эту директорию (в нашем примере это sqlserver.22.4.5.1.nupkg)

Регистрируем в Windows новый PowerShell репозиторий:

Register-PSRepository -Name myLocalPackages -SourceLocation C:LocalNugetRepo -InstallationPolicy Trusted

В доменной среде можно разместить репозиторий в общей сетевой папке, чтобы все сервера/рабочие станции Windows могли загружать из него пакеты. В этом случае путь к репозиотрию нужно указать в формате UNC: -SourceLocation \srv1psrepo  )

Вывести список доступных репозиториев:

Get-PSRepository

Установить модуль PowerShell из указанного локального репозитория:

Install-Module sqlserver -Repository myLocalPackages

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

Get-InstalledModule

Копируем офлайн PowerShell модуль с другого компьютера

Другой способ установки PowerShell модуля на автономный компьютер (без доступа Интернет) заключается в установки и копировании его с другого компьютера-источника, на котором доступ в интернет не ограничен.

На компьютере должна быть установлена версия PowerShell не ниже 5.1:

$PSVersionTable.PSVersion

На компьютере с доступом к PSGallery проверьте, что модуль присутствует в репозитории:<
Find-Module –Name *SqlServer*| Select Name, Version, Repository

Скачайте нужный вам модуль на ваш компьютер в указанный каталог:

Save-Module –Name SqlServer –Path C:ps

Теперь папку с модулем нужно скопировать на автономный компьютер, на котором вы хотите установит модуль. Куда нужно скопировать катало с модулем?

Модули PowerShell могут хранится в нескольких каталогах. Их список можно вывести с помощью команды:

$env:PSModulePath -split ";"

Как вы видите, PowerShell модули могут хранится по одному из следующих путей:

  • C:UsersrootDocumentsWindowsPowerShellModules ( $HomeDocumentsPowerShellModules ) – модули в этом каталоге в доступны только данному пользователю (CurrentUser)
  • C:Program FilesWindowsPowerShellModules ( $Env:ProgramFilesWindowsPowerShellModules ) — каталог по-умолчанию при установке модуля для всех пользователей компьютера (-Scope AllUsers)
  • C:Windowssystem32WindowsPowerShellv1.0Modules (каталог для встроенных модулей; не рекомендуется использовать для установки сторонних модулей)

Скопируйте модуль в каталог C:Program FilesWindowsPowerShellModules .

В зависимости от настроек политики выполнения скриптов PowerShell, для использования командлетов из сторонних модулей может понадобится разрешить запуск локальных PS1/PSM1 скриптов:

Set-ExecutionPolicy RemoteSigned

Если используется политика Restricted , при запуске любого командлета из модуля появится ошибка Не удалось загрузить PowerShell модуль.

Проверьте, что модуль SQLServer теперь доступен:

Get-Module -Name SQLServer -ListAvailable

Каталог установки модуля можно получить так:

(Get-Module -ListAvailable SQLServer).path

Выведите список доступных команд в модуле:

Get-Command -Module SQLServer

Аналогичным образом вы можете установить любой модуль. Я чаще всего использую этот способ для установки PowerShell модуля SQLServer, PSWindowsUpdate и PowerCLI для VMware.

Установка PowerShell модулей AzureAD и Exchange Online в офлайн системах по понятным причинам не имеет смысла.

Импорт PowerShell модуля по сети с другого компьютера

Если вы не хотите устанавливать PowerShell модуль на всех компьютерах, вы можете импортировать любой модуль с другого компьютера по сети с помощью PSRemoting:

$session = New-PSSession -ComputerName msk-sql01

Вывести список установленных модулей на удаленном компьютере:

Get-Module -PSSession $session –ListAvailable

Импортировать указанный модуль на ваш компьютер:

Import-Module -PSsession $session -Name SqlServer

Не забудьте закрыть сессию после окончания:

Remove-PSSession $session

Еще более интересный способ локально использовать PowerShell модуль, установленный на удаленном компьютере через неявное удаленное управление (Implicit remoting).

Подключитесь к удалённому компьютеру через Invoke-Command и импортируйте нужный вам модуль PowerShell:
$session = New-PSSession -ComputerName msk-sql01
Invoke-Command {Import-Module SqlServer} -Session $session

Экспортируйте командлеты модуля из удаленной сессии в локальный модуль

Export-PSSession -Session $s -CommandName *-Sql* -OutputModule RemSQLServer -AllowClobber

Данная команда создаст на вашем компьютер новый PowerShell модуль RemSQLServer (в каталоге C:Program FilesWindowsPowerShellModules ). Сами командлеты при этом не копируются.

Закройте сессию:

Remove-PSSession $session

Теперь чтобы использовать командлеты PowerShell из этого модуля достаточно импортировать его в сессию:

Import-Module RemSQLServer

Все командлеты модуля SQL теперь доступны без установки явного подключения к удаленному компьютеру. Все команды доступны пока вы не закроете консоль PowerShell или не удалите модуль.

Для удаления PowerShell модуля с компьютера используется командлет Uninstall-Module .


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *