web-dev-qa-db-de.com

Das PowerShell-Modul wird dauerhaft für alle Benutzer installiert

Ich installiere ein PowerShell-Modul über Octopus Deploy auf verschiedenen Servern. Zu Testzwecken habe ich mich an die Anleitung der Microsoft-Dokumentation zur Installation von PowerShell-Modulen gehalten.

Dies funktionierte gut, aber wie in der Dokumentation angegeben, waren meine Änderungen nur für die aktuelle Sitzung sichtbar. Das heißt, wenn ich Folgendes tun würde:

$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)

Wenn dieses Installationsprogramm automatisch auf Tentakelservern ausgeführt wird, werden die neu installierten Module in zukünftigen PowerShell-Sitzungen nicht angezeigt.

Wie kann ich ein PowerShell-Modul profilunabhängig installieren, damit jede gestartete PowerShell-Sitzung es sehen kann?

9
Mike Bailey

PowerShell kann nur Module "sehen", die in einem der in $env:PSModulePath aufgelisteten Verzeichnisse installiert sind. Ansonsten müssen Sie das Modul mit dem vollständigen Pfad importieren.

Um ein neues Modul für alle Benutzer sichtbar zu machen, haben Sie grundsätzlich zwei Möglichkeiten:

  1. Installieren Sie das Modul im standardmäßigen systemweiten Modulverzeichnis (C:\Windows\system32\WindowsPowerShell\v1.0\Modules).
  2. Ändern Sie die Systemumgebung so, dass die Variable PSModulePath bereits Ihr benutzerdefiniertes Modulverzeichnis enthält (z. B. über eine Gruppenrichtlinieneinstellung ).

Letzteres wird jedoch nur für PowerShell-Sitzungen wirksam, die nach der Änderung gestartet wurden.

10
Ansgar Wiechers

Dieses Profil gilt für alle Benutzer und alle Shells. 

%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
1
Knuckle-Dragger

Nachdem ich die Schritte ausgeführt hatte, die Sie in Ihrer Frage dargelegt haben (was meiner Meinung nach der allgemeine Weg ist), habe ich zwei Wege gefunden, um die neue Modulquelle von Powershell zu erkennen:

  • Starten Sie die Maschine neu. (Funktioniert jedes Mal.)
  • Setzen Sie die Variable PSModulePath in jeder offenen Sitzung zurück.

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

    Ich fand, dass dies sowohl für normale als auch für erhöhte Aufforderungen erforderlich war, damit dies ohne Neustart in jedem Aufforderungstyp funktioniert. (Siehe auch die Konversation @ Topic: PSModulePath .)

0
Peter Majeed