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