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** 2021.9.02
 
#>


# ! 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\Downloads"
New-PSDrive -PSProvider 'FileSystem' -Name 'GFU'  -Root '\\srv00\disk\Raum11'
New-PSDrive -PSProvider 'Registry'   -Name 'HKCC' -Root 'HKEY_CURRENT_CONFIG' -Persist

# ! 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' # HKCC:\
Get-ChildItem -Path 'SqlServer:\'

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

Get-Item -Path '.'  # . => Arbeitsverzeichnis
Get-Item -Path '..' # .. => Übergeordneter
Get-Item -Path '/'  # \ oder / => Stammordner
Get-Item -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'  # TIPP - Nur so kann ermittelt werden ob eine Variable existiert!
Test-Path -Path 'C:\Window:\System32\MsBlub32.exe' -IsValid
# 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:

$PfadA = 'C:\WINDOWS\' # $env:windir
$PfadB = '\System32'

Set-Location -Path ($pfadA + $pfadB) # C:\WINDOWS\System32
Set-Location -Path ($pfadA + $pfadB) # C:\WINDOWS\\System32
Set-Location -Path ($pfadA + $pfadB) # C:\WINDOWSSystem32

# ! LÖSUNG:
Set-Location -Path (Join-Path -Path $pfadA -ChildPath $pfadB)

# ! 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.Management'

# ? 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' -Force

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 'City' -Value 'Berlin' -PropertyType 'String'

New-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' -Name 'Zeitstempel' -Value (Get-Date) -PropertyType 'String' # ! ACHTUNG evtl. nicht immer en-US jeh nach OS-Version
$timestamp = Get-ItemPropertyValue -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' -Name 'Zeitstempel' # Neu seit PS Version 5
$timestamp = Get-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' | Select-Object -ExpandProperty 'Zeitstempel' # i.d.R. besser so
$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

# Besser so:
New-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' -Name 'Zeitstempel' -Value (Get-Date -Format 'yyyy-MM-dd') -PropertyType 'String' -Force
$timestamp = Get-ItemProperty -Path 'HKCU:\SOFTWARE\_Neuer_Schlüssel' | Select-Object -ExpandProperty 'Zeitstempel'
[datetime]$timestamp

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

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

# TODO ÜBUNG A

# 1. Erstellen Sie einen Schlüssel unter 'HKey_Current_User/Software' namens '_Wichtig'

# 2. Fügen Sie zum Schlüssel '_Wichtig' einen neuen Zahlenwert '7' unter dem Eigenschaftsnamen 'AnzahlTage' hinzu.

# 3. Lesen Sie die Zahl von AnzahlTage in eine Variable wieder ein ($meineVariable = ...) und addieren diesen Variable-Wert zum heutigen Datum dazu ((Get-Date).AddDays(...)), um das neue Datum auszugeben.