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. |