PowerShell Gallery

Haben Sie schon gesehen, wie einfach Sie mit "Install-Module" ein Zusatzmodul für PowerShell installieren können? Wenn der Computer ins Internet kommt, dann haben Sie in wenigen Sekunden eine neue Funktion nachgerüstet.

Module finden

Natürlich müssen Sie den Namen dazu finden. Aber auch hier hilft ihnen "Find-Module" weiter, welches auch Wildcards unterstützt. Wer hier mal Anfang Feb 2019 ein "Find-Module *" gestartet hat, bekam über 3600 Module von über 1000 Autoren. Davon waren 282 Module von Microsoft. Hierbei war nur die PSGallery die Quelle. Es ist durchaus möglich auch andere Quellen mit anzugeben.

Achtung
Die Autoren sind nicht verifiziert und theoretisch kann jede ein Modul bereitstellen, welches Sie dann eventuell als Administrator sogar starten. Das ist ein großer Vertrauensvorschuss, den ich so nicht einfach gewähren würde. Allerdings sind alle Module ja "Sourcecode" und könnten von ihnen überprüft werden. Das werden aber die wenigsten tun. Also Vorsicht beim Einsatz selbst wenn der Code signiert ist.

Genau genommen ist das aber auch nicht viel anders als die verschiedenen Paketmanager unter Unix oder das "Install-Windowsfeature" für Windows. Die Modularisierung nimmt einfach zu und erlaubt auch schnelle Updates.

Parallel dazu gibt es auch noch "Find-Script", um einzelne Skripte zu finden.

PS C:\> get-command *-script

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Find-Script                                        1.0.0.1    PowerShellGet
Function        Install-Script                                     1.0.0.1    PowerShellGet
Function        Publish-Script                                     1.0.0.1    PowerShellGet
Function        Save-Script                                        1.0.0.1    PowerShellGet
Function        Uninstall-Script                                   1.0.0.1    PowerShellGet
Function        Update-Script                                      1.0.0.1    PowerShellGet


PS C:\> get-command *-module

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Find-Module                                        1.0.0.1    PowerShellGet
Function        Install-Module                                     1.0.0.1    PowerShellGet
Function        Publish-Module                                     1.0.0.1    PowerShellGet
Function        Save-Module                                        1.0.0.1    PowerShellGet
Function        Uninstall-Module                                   1.0.0.1    PowerShellGet
Function        Update-Module                                      1.0.0.1    PowerShellGet
Cmdlet          Get-Module                                         3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          Import-Module                                      3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          New-Module                                         3.0.0.0    Microsoft.PowerShell.Core
Cmdlet          Remove-Module                                      3.0.0.0    Microsoft.PowerShell.Core

Skripte und Module sind eine sehr gute Plattform um Code gemeinsam zu nutzen und zu veröffentlichen. Ein Skript ist eigentlich nur eine einzelne Datei während ein Modul mehrere Dateien zusammenfasst.

Installation und Update

Wenn Sie das passende Skript oder Modul gefunden haben, dann müssen Sie es natürlich erst herunterladen und installieren. Das geht sehr einfach mit Install-Module und Install-Script.

Wenn Sie die Installation als Administrator durchführen, dann landen die Dateien in folgenden Ordnern

$env:ProgramFiles\WindowsPowerShell\Modules
$env:ProgramFiles\WindowsPowerShell\Scripts 

Aber auch als Benutzer können Sie sehr einfach Module und Skripte mit dem Parameter "-Scope CurrentUser" in ihre eigene Umgebung importieren und nutzen.

$env:USERPROFILE\Documents\WindowsPowerShell\Modules
$env:USERPROFILE\Documents\WindowsPowerShell\Scripts

In den Verzeichnissen wird sogar eine Versionierung mit geführt, so dass Sie auch eine ältere Version nutzen können. Die PoweShell 5 lädt per Default alle Module automatisch nach, so dass Command-Completion möglich ist.

Das eigene Modul bereitstellen

Wer sagt denn, dass Module nur für Administratoren und Benutzer sind. genau genommen könnten Sie eine komplette Skriptverteilung über Module machen. Sie könnten sogar eine Aufgabe in mehrere Module aufteilen, damit unterschiedliche Teams ihr Modul entwickeln. Allerdings haben wir zwei Hausforderungen:

  • Der Modulname muss eindeutig sein
  • Commandlets sollten eindeutig sein

Das ist natürlich nicht schön, wenn jemand anderes einen eingängigen Modulnamen schon verwendet oder sogar auf die Verwechslung hofft. Noch ungeschickter ist die Benennung von Commandlets, damit es einen Konflikt gibt. Das schafft leider nicht mal Microsoft immer zuverlässig. So sind die Namen der Exchange Online und Exchange On-Premises Commandlets teilweise identisch. In einer Session muss man dann immer den Modulname mit angeben, damit das richtige Commandlet angesprochen wird.

Daher sollten Sie schon überlegen, ihre Commandlets mit eine Präfix zu versehen. Microsoft macht das schon an einigen Stellen

*-AD*          für Active Directory
*-CS*          für Skype for Business 
*-CSOnline*    für Skype for Business Online 
*-CSteams*     für Skype for Business
*-AzureAD *    für Azure AD
*-ADSync*      für AzureAD-Connect
und einige andere

Die größten Ausreißer sind die Exchange-Commandlets, welche gar kein Prefix haben. Dass ein "Get-User" und "Get-Group" zur Exchange PowerShell gehören, ist immer wieder verwirrend.

Vielleicht fangen Sie erst einmal mit einem Skript an und arbeiten sich dann langsam in Module ein. Microsoft hat die entsprechenden Prozesse recht gut dokumentiert und sogar eine Verbindung mit GitHub ist möglich, damit Sie dort per Versionierung den Code weiter entwickeln und dann auf GitHub publizieren.

Weitere Links