Постоянная установка модуля PowerShell для всех пользователей

Я устанавливаю модуль PowerShell через Octopus Deploy на несколько разных серверов. В целях тестирования я воспользовался рекомендациями документации Microsoft для установка модулей PowerShell.

Это работало нормально, но, как указано в документации, мои изменения будут видны только для текущего сеанса. То есть, если бы я сделал следующее:

$modulePath = [Environment]::GetEnvironmentVariable("PSModulePath", [EnvironmentVariableTarget]::Machine)
# More practically, this would be some logic to install only if not present
$modulePath += ";C:\CustomModules"
[Environment]::SetEnvironmentVariable("PSModulePath", $modulePath, [EnvironmentVariableTarget]::Machine)

При автоматическом запуске этого установщика на серверах щупальца будущие сеансы PowerShell не будут видеть новые установленные модули.

Как установить модуль PowerShell независимо от профиля, чтобы каждый запущенный сеанс PowerShell мог его видеть?


person Mike Bailey    schedule 02.01.2014    source источник


Ответы (3)


PowerShell может «видеть» только модули, установленные в одном из каталогов, перечисленных в $env:PSModulePath. В противном случае вам придется импортировать модуль с полным путем.

Чтобы сделать новый модуль видимым для всех пользователей, у вас есть два варианта:

  1. Установите модуль в общесистемный каталог модулей по умолчанию (C:\Windows\system32\WindowsPowerShell\v1.0\Modules).
  2. Измените системную среду, чтобы переменная PSModulePath уже содержала каталог вашего пользовательского модуля (например, с помощью настройки групповой политики).

Однако последний вступит в силу только для сеансов PowerShell, запущенных после внесения изменений.

person Ansgar Wiechers    schedule 03.01.2014
comment
PowerShell 3.0 и более поздние версии автоматически загружают модули, которые он может найти, с помощью описанного выше метода. Таким образом, нет необходимости импортировать модули вручную или импортировать их в профиль. - person Lars Truijens; 03.01.2014
comment
Вы бы предпочли использовать второй вариант, как msdn .microsoft.com/en-us/library/dd878350(v=vs.85).aspx не рекомендует устанавливать пользовательские модули в C:\Windows\system32\WindowsPowerShell\v1.0\Modules Это место зарезервировано для модулей, поставляемых с Windows. Не устанавливайте модули в это место. - person Luiz; 18.12.2017

Этот профиль применяется ко всем пользователям и ко всем оболочкам.

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
person Knuckle-Dragger    schedule 02.01.2014
comment
профиль в вашей ссылке на статью применяется только «для каждого пользователя», указанный выше — для всей машины. - person Knuckle-Dragger; 02.01.2014
comment
Могу ли я быть уверен, что это будет работать, даже если оболочка открыта с помощью -NoProfile? - person Mike Bailey; 02.01.2014
comment
Боюсь, я не могу этого сделать. Я должен предположить, что модуль будет загружен в среде -NoProfile. - person Mike Bailey; 02.01.2014

Выполнив шаги, которые вы изложили в своем вопросе (что, я думаю, является общим способом), я нашел два способа получить источник нового модуля, распознаваемый Powershell:

  • Перезапустите машину. (Работает каждый раз.)
  • Сбрасывайте PSModulePath в каждом открытом сеансе.

    $env:PSModulePath=[Environment]::GetEnvironmentVariable("PSModulePath", "Machine")
    

    Я обнаружил, что это необходимо для запуска как в обычных, так и в повышенных запросах, чтобы это работало без перезапуска в каждом типе приглашения. (См. также обсуждение @ Тема: PSModulePath. )

person Peter Majeed    schedule 19.03.2017