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