Private/Wissen/B_Basic/B33_Module.ps1

<#
 
# PowerShell Module
 
Die PowerShell mittels Module um weitere Funktionalitäten erweitern.
 
- **Hashtags** Module Import
 
- **Version** 2020.10.27
 
#>


# ! Module erweitern die PowerShell mit Cmdlets, PowerShell-Provider/-Drives, Functions, Variables und ausführbare Skripte. Um ein Modul nutzen zu können müssen zweit Voraussetzungen erfüllt sein:

# ! 1. Ein Module muss einmalig installiert werden.

# ! 2. Vor den Benutzen der zusätzlichen Funktionalität muss das Modul importiert (d.h. geladen) werden.

# ! Ein Modul besteht aus folgenden Elementen:

# - Ein Module-Ordner mit: (OBLIGATORISCH)
# - Einen Unter-Ordner der die Versionsnummer des Module enthält mit: (Optional)
# - Eine .PSD1-Datei die das Manifest mit den Eckdaten des Modules enthält. (OBLIGATORISCH)
# - Eine .PSM1-Datei mit PowerShell-Script-Code der beim importieren des Modules ausgeführt wird. (Optional)
# - Diverse Sub-Sprach-Ordner (z.B. de-DE) mit sprachspezifischen Daten wie z.B. Hilfe-Text. (Optional)
# - Einen Public-Ordner für diverse Dateien die öffentlich sind. (Optional)
# - Einen Private-Ordner für diverse Dateien intern benötigt werden. (Optional)
# - Diverse .PS1XML-Dateien mit Typen-Beschreibungen (Optional)
# - ... (Optional)

# READ Weiterführende und Nachschlage-Informationen:

Get-Help -Name 'about_Modules' -ShowWindow
Get-Command -Noun 'Module' -Module 'Microsoft.PowerShell.Core'
Get-Command -Module 'PowerShellGet'

#region 1. SCHRITT - Ein Module installieren

# ! Der Installationsvorgang ist abgeschlossen wenn das neue Module in einem der folgenden Modul-Basisordner kopiert wurde:

$env:PSModulePath -split ';'

# ! Das Module steht computerweit zur Verfügung, wenn es in dem Default-Ordner liegt:

# Windows PowerShell:
Get-ChildItem -Path 'C:\Program Files\WindowsPowerShell\Modules'
# PowerShell Core:
Get-ChildItem -Path 'C:\Program Files\PowerShell\Modules'
# PowerShell 7:
Get-ChildItem -Path 'C:\Program Files\powershell\7\Modules'

# ! Das Modul steht dem lokalen Benutzer zur Verfügung, wenn es in dem Default-Ordner liegt:

# Windows PowerShell:
Get-ChildItem -Path "$env:USERPROFILE\Documents\WindowsPowerShell\Modules"
# PowerShell 7:
Get-ChildItem -Path "$env:USERPROFILE\Documents\PowerShell\Modules"

# ! Ein Module kann durch das Ausführen einer Installationroutine installiert werden, wie z.B. RSAT (Remote Server Administration Tools) für ADS oder andere Windows Server-Komponenten ... :

Start-Process -FilePath 'https://www.microsoft.com/de-de/download/details.aspx?id=45520'

# ! ... ODER ein Module kann installiert werden durch das manuell Kopieren ... :

Copy-Item -Path '.\AKPT' -Destination "$env:USERPROFILE\Documents\WindowsPowerShell\Modules\AKPT\" -Force -Recurse

# ! ... ODER über die PowerShellGallery (https://www.powershellgallery.com) mittels Cmdlets (Seit PS Version 5.0):

# TIPP evtl. müssen im Vorfeld div. Packete und Module aktualisiert werden:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name 'NuGet' -MinimumVersion 2.8.5.201 -Force
Remove-Module -Name * -Force
Install-Module -Name 'PowerShellGet' -MinimumVersion 2.2.4.1 -Force -AllowClobber
Remove-Module -Name * -Force
Import-Module 'PowerShellGet' -MinimumVersion 2.2.4.1 -Force

# * z.B. das Modul ImportExcel

Start-Process -FilePath 'https://www.powershellgallery.com/packages/ImportExcel'
Find-Module -Name 'ImportExcel'
Find-Command -Name 'Import-Excel'
Install-Module -Name 'ImportExcel' -SkipPublisherCheck -Scope 'CurrentUser' -Force -AllowClobber # ! ACHTUNG - -Scope 'AllUsers' benötigt Admin-Rechte
Get-Command -Module 'ImportExcel' # ? Welche Cmdlets enthält das Modul ImportExcel
Get-Help -Name 'Export-Excel' -ShowWindow # ? Hilfe der Cmdlets anzeigen lassen
Get-Process | Export-Excel -Path 'C:\temp\test.xlsx' -Show # ? Neues Cmdlet benutzen

# TIPP - Siehe auch folgende Modules: AKPT, SqlServer, ImportExcel, Microsoft.PowerShell.ConsoleGuiTools, Microsoft.PowerShell.SecretManagement, Microsoft.PowerShell.SecretStore, PSCX

# ! Eine Übersicht aller INSTALLIERTEN Module, gruppiert nach Module-Basis-Ordner erhalten:

Get-Module -Name '*' -ListAvailable

# ! Ein Module dauerhaft wieder deinstallieren:

Remove-Module -Name 'ImportExcel' -Force
Uninstall-Module -Name 'ImportExcel' -AllVersions -Force
Get-Module -Name 'ImportExcel' -ListAvailable

#endregion

#region 2. SCHRITT - Ein Module IMPORTIEREN und dadurch in der aktuellen Session nutzbar machen

# ! Wird die Session geschlossen werden alle Modules automatisch entladen und bei starten einer neuen Session erneut importiert werden!

# ! Ein Module aus einem Basis-Module-Ordner importieren:

Import-Module -Name 'Bitlocker' -Verbose # => die in $env:PSModulePath
Import-Module -Name 'ImportExcel' -Verbose
Import-Module -Name '../AKPT' -Verbose    # => die einem X-Ort liegen (Pfad)

 # ! Wenn das Module nicht in den Pfaden $env:PSModulePath enthalten ist, kann ein Module auch aus einem beliebigen Ordner importieren:

 # TIPP - Z.B. beim Entwickeln eines Modules
 
Import-Module -Name '../AKPT' -Verbose

# TIPP - sollte eine Module Cmdlets enthalten, können Sie das Module mit einem Prefix importieren um sämtliche Cmdlets zu identischen abgrenzen zu können:

Import-Module -Name '.\AKPT' -Prefix 'AK' -Verbose
# aus:
Get-EuroExchange
# wird:
Get-AKEuroExchange
# oder:
AKPT/Get-EuroExchange

# ! Eine übersicht der aktuell importierten Module erhalten:

Get-Module -Name '*'

# ! Ein Modul manuell entladen (z.B. für das Debugging nötig):

Remove-Module -Name 'AKPT' -Force
Get-Module -Name '*'
Remove-Module -Name '*' -Force

# ! Seit der PowerShell 3.0 wird Import-Module automatisch ausgeführt, ...

# ! ... wenn aus dem noch nicht importiertem Module ein Cmdlet benutzt wird:

Remove-Module -Name 'NetTCPIP' -Force
Get-EuroExchange -Currency 'USD' # ! ACHTUNG - Nur für Module $env:PSModulePath enthalten sind
Test-NetConnection -ComputerName '127.0.0.1'
Get-Module -Name '*'

# ! ... wenn die Hilfe zu einem Cmdlet aufgerufen wird:

Remove-Module -Name 'NetTCPIP' -Force
Get-Help -Name 'Test-NetConnection' -ShowWindow
Get-Module -Name '*'

# ! ... wenn der Inhalt des Moduls angezeigt wird:

Remove-Module -Name 'NetTCPIP' -Force
Get-Command -Module 'NetTCPIP'
Get-Module -Name '*'

# ! ... wenn die Autovervollständigung benutzt wird:

Remove-Module -Name 'NetTCPIP' -Force
Test-NetConnection -
Get-Module -Name '*'

# ? Warum/Wann sollte man Module manuell importieren?

# ! 1. Wenn PowerShell-Provider benutzt werden sollen. Zum Beispiel würde 'Get-ChildItem -Path SqlServer:\' einen Fehler auslösen da das Modul 'SqlServer' nicht geladen wurde!

Get-ChildItem -Path 'SqlServer:'
Import-Module -Name 'SqlServer'
Get-ChildItem -Path 'SqlServer:'

# ! 2. In Script-Dateien im Kopfbereich als Übersicht, welche Module benötigt werden um dieses Skript korrekt ausführen zu können und Dritte kenntlich zu machen, welche Module installiert werden müssen!

using Module SqlServer # identisch mit Import-Module -Name 'SqlServer'

# ! 3. Um bei doppelte Cmdlet-Namen diese mit einem Prefix verwenden zu können!

Remove-Module -Name AKPT
Import-Module -Name '.\AKPT' -Prefix 'AK' -Verbose
Get-Command -Module akpt

#endregion

#region Windows Compatibility Wrapper in PowerShell 7

# ! Windows-PowerShell-Module stehen durch den "Windows Compatibility Wrapper" auch in PowerShell 7 zur Verfügungen. Windows PowerShell 5.1 ist jedoch **zusätzlich nötig**. Wenn das Module-Manifest nicht angibt ob dass Modul mit Core kompatibel ist, wird das Modul in einen Windows PowerShell-Prozess geladen und mittels Remoting in die aktuell PowerShell 7-Sitzung gespiegelt:

# Beschreibt die Windows PowerShell-Kompatibilitätsfunktion für PowerShell 7:
Get-Help -Name "about_Windows_PowerShell_Compatibility" -ShowWindow

Get-Module -ListAvailable -SkipEditionCheck

Import-Module -Name "Microsoft.PowerShell.Archive" -UseWindowsPowerShell

Install-Module -Name "WindowsCompatibility" -Scope "CurrentUser" -AllowClobber -SkipPublisherCheck -Force

Get-Command -Module "WindowsCompatibility"

Get-WinModule -Name "*"

Import-WinModule -Name "Microsoft.PowerShell.LocalAccounts"

Get-LocalUser

#endregion

#region Ein Module von der PowerShell-Gallery downloaden, analysieren und testhalber importieren

# ! 1. Module von https://www.powershellgallery.com downloaden:

Find-Module -Tag 'AttilaKrick'
Find-Module -Name 'AKPT' | Select-Object -Property 'Name', 'Version', 'Description', 'Author', 'PublishedDate', 'AdditionalMetadata', 'ReleaseNotes'
Save-Module -Name 'AKPT' -Path "$env:USERPROFILE\Downloads" -Force -Verbose -AcceptLicense

# ! 2. Das Module vom FileSystem importieren:

Import-Module -Name "$env:USERPROFILE\Downloads\AKPT\*\AKPT.psd1" -Verbose

#endregion

# TODO QUIZ - https://attilakrick.com/schlagwort/powershell-module/

# TODO ÜBUNG A (Modul Installieren)

# ! 1. Von wem stammt das Modul 'ImportExcel', was ist die aktuellste Version und wann wurde diese Veröffentlicht? (Treten Sie den Beweis an, ohne das Module installieren zu müssen (Find-Module)!)
# ! 2. Installieren Sie das Modul 'ImportExcel' über Install-Module (OPTIONAL per Download, Entpacken und Copy-Item).
# ! 3. Exportieren Sie mit Hilfe dieses Modules die laufenden Prozesse (Get-Process) in eine Excel-Datei.

# TODO ÜBUNG B (Modul Installieren)

# ! 1. Installieren Sie das Module 'Microsoft.PowerShell.SecretManagement' für den gesamten Computer (Beachte -AllowPrerelease da SecretManagement noch BETA ist.).
# ! 2. Erstellen Sie anschließend ein funktionsfähiges Beispiel, um die Vorteil dieses Moduls Dritten zu demonstrieren.
# ! 3. Deinstallieren Sie nun das Modul wieder, so das keine Spuren mehr zu finden sind und treten Sie diesen Beweis an.