Private/Wissen/B_Basic/B9_Modules.ps1

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


# ! 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 Module importiert (d.h. geladen) werden.

# ! Ein Module besteht aus folgenden Elementen:

# - Ein Module-Ordner mit:
# - Optional einen Unter-Ordner der die Versionsnummer des Module enthält.
# - Eine .PSD-Datei die das Manifest mit den Eckdaten des Modules enthält.
# - 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'
Find-Know -Keyword 'User Module'

#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 mittels Cmdlets (Seit PS Version 5.0):

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

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

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

Get-Module -Name '*' -ListAvailable

# ! Ein Module dauerhaft wieder deinstallieren:

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 '.\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:
Find-Know
# wird:
Find-AKKnow
# oder:
AKPT/Find-Know

# ! 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

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

Import-Module -Name '.\AKPT' -Prefix 'AK' -Verbose

#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://forms.office.com/Pages/ResponsePage.aspx?id=DQSIkWdsW0yxEjajBLZtrQAAAAAAAAAAAAa__Yp1xwFUNjBTUVZUR0FMV1EwVlREU0xIWjZTQTdMRC4u

<# TODO ÜBUNG
 
# Übung A
 
1. Installieren Sie das Module 'Microsoft.PowerShell.SecretManagement' für den gesamten Computer.
 
2. Erstellen Sie ein funktionsfähiges Beispiel mit diesem Module um Dritten den Nutzen zu zeigen.
 
3. Deinstallieren Sie das Module so das keine Spuren mehr zu finden sind und treten den Beweis an.
 
# Übung B
 
1. Von wem stammt das Module ''ImportExcel', was ist die aktuellste Version und wann wurde diese Veröffentlicht? (Treten Sie den Beweis an, ohne das Module installieren zu müssen!)
 
2. Downloaden Sie das Module und installieren Sie anschließend mittels Copy-Item Cmdlet.
 
3. Exportieren Sie mit Hilfe dieses Modules die laufenden Prozesse (Get-Process) in eine Excel-Datei.
 
#>