Private/Wissen/B_Basic/B32_PSProvider.ps1

<#
 
# PSProvider & PSDrive
 
Über PowerShell Provider (PSProvider) und PowerShell Drives (PSDrive) kann mit Default-Cmdlets auf diverse Technologien dynamisch zugegriffen werden.
 
- **Hashtags** PSProvider PSDrive Provider Drive Location Path
 
- **Version** 2020.10.27
 
#>


# ! Typische PowerShell Provider sind:

# * FileSystem => Dateisystem
# * Registry => Registrierungsdatenbank
# * Environment => Windows Umgebungsvariablen
# * Certificate => X.509-Zertifikatsspeicher
# * Alias => PowerShell Aliase
# * Function => PowerShell-Funktionen
# * Variable => PowerShell-Variablen
# * ActiveDirectory => [OPTIONAL] ActiveDirectory
# * Exchange => [OPTIONAL] Exchange-Postfächer/-Ordner
# * SqlServer => [OPTIONAL] Microsoft SQL-Server
# * ... => u.v.m.

# READ Weiterführende und Nachschlage-Informationen:

Get-Help -Name 'about_Providers'   -ShowWindow
Get-Help -Name 'about_Path_Syntax' -ShowWindow
Get-Help -Name 'about_Locations'   -ShowWindow

# ! Durch das importieren eines Modules können weitere PowerShell-Provider aktiviert werden:

Get-PSProvider # vorher
Import-Module -Name 'SqlServer'
Get-PSProvider # nachher

# ! Für die Interaktion mit den PowerShell-Providern gibt es Laufwerke (PowerShell-Drive) um auf die Inhalte per Pfad-Angabe zugreifen zu können:

Get-PSDrive
New-PSDrive -PSProvider 'FileSystem' -Name 'DL'   -Root "$env:USERPROFILE\OneDrive\Downloads"
New-PSDrive -PSProvider 'FileSystem' -Name 'GFU'  -Root '\\srv00\disk\Raum11'
New-PSDrive -PSProvider 'Registry'   -Name 'HKCC' -Root 'HKEY_CURRENT_CONFIG'

# ! PowerShell 7 - Ein neues PS-Laufwerk um benutzerbezogene temporäre Dateien abzulegen:
Get-PSDrive -Name 'Temp'
Get-ChildItem -Path 'Temp:\'

# ! Für die Adressierung gibt es **absolute** Pfad-Angaben:

Get-ChildItem -Path 'C:\' # oder 'DL:\', 'GFU:\'
Get-ChildItem -Path 'variable:\'
Get-ChildItem -Path 'Cert:\CurrentUser\My' -CodeSigningCert
Get-ChildItem -Path 'env:\'
Get-ChildItem -Path 'HKCU:\Software'
Get-ChildItem -Path 'SqlServer:\'

# ! Für die Adressierung gibt es **relative** Pfad-Angaben:

Get-ChildItem -Path '.'  # . => Arbeitsverzeichnis
Get-ChildItem -Path '..' # .. => Übergeordneter
Get-ChildItem -Path '/'  # \ oder / => Stammordner
Get-ChildItem -Path '~'  # ~ => Home-Verzeichnis

# ! Arbeitsverzeichnis wechseln:

Set-Location -Path 'HKCU:\SOFTWARE'
Set-Location -Path 'C:\Windows\System32'

# ! Pfad auflösen:

Resolve-Path -Path '.\MsInfo32.exe'

# ! Pfad testen:

Test-Path -Path 'C:\Windows\System32\MsInfo32.exe'
Test-Path -Path 'Variable:\PSUICulture'
Test-Path -Path 'C:\Window:\System32\MsBlub32.exe' -IsValid # ! Syntax-Prüfung (Naja, kommt auch auf den PSProvider an)
# TIPP BTW - Warum Doppelpunkt in NTFS Pfaden erlaubt sind (Alternate Data Streams)[http://www.winfaq.de/faq_html/Content/tip1500/onlinefaq.php?h=tip1915.htm]

# ! Pfad zerlegen:

Split-Path -Path 'C:\Windows\System32\MsInfo32.exe' -Parent
Split-Path -Path 'C:\Windows\System32\MsInfo32.exe' -Leaf

# ! Pfad zusammenbauen:

Join-Path -Path $env:WinDir -ChildPath 'System32'

# ! Die PowerShell-Provider-Default-Cmdlets können in allen PowerShell-Drives benutzt werden und benutzen sich identisch.

# ! Übersicht aller Default-Cmdlets:

Get-Command -Noun 'ChildItem', 'Item', 'ItemProperty', 'ItemPropertyValue', 'Location', 'Path' -Module 'Microsoft.PowerShell.*'

# ? Beispiele anhand von New-Item:

New-Item -Path 'C:\Temp' -Name 'NeueDatei1.txt' -ItemType 'file'
New-Item -Path 'C:\Temp' -Name 'NeueDatei2.txt' -ItemType 'directory'

New-Item -Path 'HKCU:\Software' -Name '_Neuer_Schlüssel' -ItemType 'Key'

New-Item -Path 'variable:\' -Name 'NeueVariable' -Value 'Hallo Köln!' -ItemType 'Variable' ; $NeueVariable # TIPP Natürlich einfacher so: $NeueVariable = 'Hallo Köln!'

New-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' -Name 'Zeitstempel' -Value (Get-Date) -PropertyType 'String'
$timestamp = Get-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' | Select-Object -ExpandProperty 'Zeitstempel'
$datum = $timestamp.ToDateTime([CultureInfo]'en-US') # ISO sprache-LAND, de-DE, de-AT, en-GB, jp-JP
$datum = [DateTime]::ParseExact($timestamp, 'MM/dd/yyyy HH:mm:ss', $null) # yyyyMMdd
$datum.AddDays(197)

# TIPP - Freie Kapazitäten von Festplatten ermitteln:
Get-PSDrive -PSProvider 'FileSystem'

# TODO QUIZ - https://attilakrick.com/schlagwort/powershell-provider-und-drives/

<# TODO ÜBUNG
 
# ! 1. Legen Sie unter HKEY_CURRENT_USER\Software einen Key ABC, mit einer Property HexWert und den hexadezimalen Value 0x8BAA an.
 
# ! 2. Legen Sie unter HKEY_CURRENT_USER\Software\ABC eine Property ErstelltAm mit dem Value des aktuellen Datums wie folgt (Get-Date -Format 'dd.MM.yyyy') an.
 
# ! 3. Lesen Sie das nun Datum aus der Property ErstelltAm wieder in eine Variable ein und addieren 10 Monate zu diesem Datum dazu, um es anschließend erneut der Eigenschaft ErstelltAm zuzuweisen.
 
# ! 4. Setzen Sie den Standard-Wert des ABC-Key auf den Value **Hallo Köln!**:
 
# ! 5. Löschen Sie den **ABC**-Key wieder und prüfen / stellen Sie sich das dieser Key wirklich nicht mehr existiert:
 
# ! 6. KNIFFLIG: Finden Sie alle Keys unter **HKEY_CURRENT_USER\Software\Microsoft\Windows** und **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows** die mit **Run** beginnen. ??? | Where-Object -Property ???? -ILike -Value 'Run*'
#>