Mivel a PowerShellnek kiterjedt saját parancskészlete van ezért logikus az elképzelés, hogy egy-egy parancs hasonló objektumokon is ugyanabban a formában futtatható lehessen. Például a fájlrendszer és a registry is hasonló mappastruktúra-szerűen épül fel. Ebből jöhetett a PowerShell alkotóinak az az ötlete, hogy kiterjesztették a meghajtó fogalmát, PSmeghajtó lett így a fájlrendszeren kívül a registry, a tanúsítványtár, de a függvényeinket és a környezeti és saját változóinkat is ilyen PSDrive -okon keresztül is megnézhetjük.
Ezekhez a különböző PSDrive-okhoz tartozik egy-egy provider (ami egy .NET alapú program), ami biztosítja az egységes felületet, amelyhez a PowerShell cmdletjei csatlakozhatnak. A meghajtók (illetve a mögöttük álló providerek) teszik lehetővé, hogy a Set-Location, a Get-ChildItem, stb. parancsok a fájlrendszerben, a registryben, a tanúsítványtárban és még számos más helyen is teljesen azonos módon működhessenek. A provider által támogatott cmdletek mindegyike használható a providerre alapuló meghajtókon, illetve vannak speciálisan egy meghatározott providerhez készült cmdletek is. Az egyes providerek úgynevezett dinamikus paramétereket is adhatnak a cmdletekhez, amelyek csak akkor használhatók, ha a cmdletet az adott provider segítségével létrehozott adatforráson használjuk. A PowerShell rendszerrel kapott providerek készlete tovább bővíthető, így újabb adatforrások (például az Active Directory!) is elérhetővé tehetők a szokásos cmdletek számára (lásd később).
A PowerShell meghajtók tehát olyan logikai adattárak, amelyek a megfelelő provider közreműködésével a fizikai meghajtókhoz hasonló módon érhetők el. A PowerShell meghajtók semmilyen módon nem használhatók a shell környezeten kívülről, de természetesen a fizikai és hálózati meghajtók csatlakoztatását, illetve eltávolítását a shell is érzékeli.
A PSmeghajtók kilistázásához használhatjuk a Get-PSDrive cmdletet, egy ilyen drive-on belül érvényes például a get-childitem parancs, azaz alias dir:
[1] PS C:\> Get-PSDrive
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
A FileSystem A:\
Alias Alias
C 8,64 71,26 FileSystem C:\
cert Certificate \
D FileSystem D:\
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
WSMan WSMan
[2] PS C:\> dir hkcu:
Hive: HKEY_CURRENT_USER
SKC VC Name Property
--- -- ---- --------
2 0 AppEvents {}
0 36 Console {ColorTable00, ColorTable01, Co...
11 0 Control Panel {}
0 2 Environment {TEMP, TMP}
3 0 Keyboard Layout {}
0 0 Network {}
3 0 Printers {}
5 0 Software {}
1 0 System {}
1 9 Volatile Environment {LOGONSERVER, USERDNSDOMAIN, US...
[3] PS C:\> dir cert:\CurrentUser
Name : SmartCardRoot
Name : UserDS
Name : AuthRoot
Name : CA
Name : Trust
Name : Disallowed
Name : My
Name : Root
Name : TrustedPeople
Name : ACRS
Name : TrustedPublisher
A PSProvider eket is kilistázhatjuk a get-psprovider cmdlet segítségével:
[12] PS C:\> Get-PSProvider
Name Capabilities Drives
---- ------------ ------
WSMan Credentials {WSMan}
Alias ShouldProcess {Alias}
Environment ShouldProcess {Env}
FileSystem Filter, ShouldProcess {C, A, D}
Function ShouldProcess {Function}
Registry ShouldProcess, Transact... {HKLM, HKCU}
Variable ShouldProcess {Variable}
Certificate ShouldProcess {cert}
Ebben a listában láthatjuk, hogy az egyes providerek milyen képességek kel bírnak. Az összes lehetséges képességet le is kérdezhetjük (ettől a kifejezéstől most ne ijedjen meg senki, később világossá válik a jelentése):
[13] PS C:\> [enum]::getValues(“System.Management.Automation.Provider.ProviderC
apabilities")
None
Include
Exclude
Filter
ExpandWildcards
ShouldProcess
Credentials
Transactions
None: az adott provider semmilyen újabb képességgel nem rendelkezik az alap PowerShell provider képességekhez képest.
Include, Exclude: elemekre történő hivatkozás lehetősége dzsóker karakterekkel (*, ?, stb.) . Az Include jelzi, hogy milyen elemekre szeretnénk kiterjeszteni a parancsunk hatását, az Exclude, hogy milyenekre nem. Természetesen a PowerShell akkor is támogathatja a dzsókerkarakterek használatát, ha maga a provider nem. Ilyenkor „saját hatáskörben” végzi el a szükséges műveleteket. Ha a provider támogatja ezeket a képességeket, akkor teljesítményben kapunk előnyt, azaz gyorsabban hajtódnak végre a műveletek, vagy akár kisebb hálózati forgalmat generál a művelet végrehajtása.
Filter: támogatja a provider-specifikus szűrő kifejezéseket. Igazán „profi” filterekkel majd az Active Directory részben fogunk találkozni.
ExpandWildCards: ez megint csak egy olyan képesség, ami teljesítménynövelő lehet, de azt a funkcionalitást alapban is nyújtja a PowerShell, így jelenleg még egyetlen provider sem rendelkezik ezzel.
ShouldProcess: Ennek birtokában a provider meghívja a ShouldProcess metódust, mielőtt módosításokat végezne az adatokon. Így lehetővé válik a –WhatIf és a –Confirm paraméterek használatával óvatosan megnézni, hogy mi történne, ha végrehajtanánk a változtatásokat, illetve szabályozhatjuk, hogy megerősítést kérjen-e minden változtatásnál.
Credentials: Lehetőséget ad, hogy a műveleteket ne a saját nevünkben, hanem valamilyen más felhasználói fiók nevében végezzük el.
Tranzactions: Engedi a tranzakcionált, azaz mindent vagy semmit elv alapján történő végrehajtást. Jelenleg ezt csak a Registry provider tudja, de várható, hogy majd a fájlrendszer is tudni fogja.
PSDrive létrehozásával a gyakran használt helyek elérését jelentősen megkönnyíthetjük. Ha például szeretnénk készíteni egy MSReg nevű PS meghajtót, amely a registry HKEY_CURRENT_USER\Software\Microsoft helyére mutat, akkor a New-PSDrive paramétereként az új meghajtó nevét, a használandó providert és a gyökér elérési útját kell megadnunk az alábbiak szerint, és máris használhatjuk a frissen létrehozott meghajtót:
[13] PS C:\> New-PSDrive -Name MSReg -PSProvider Registry -Root HKEY_CURRE
NT_USER\Software\Microsoft
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
MSReg Registry HKEY_CURRENT_USER...
[14] PS C:\> dir msreg:
Hive: HKEY_CURRENT_USER\Software\Microsoft
SKC VC Name Property
--- -- ---- --------
1 0 Active Setup {}
1 0 ADs {}
4 0 Advanced INF Setup {}
1 0 Assistance {}
0 4 Command Processor {CompletionChar, DefaultColor, ...
…
A létrehozott meghajtó csak az adott PowerShell munkamenetben használható, kilépéskor egyszerűen elvész. A rendszeresen használt meghajtókat mégsem kell minden egyes alkalommal újra létrehoznunk, a megfelelő parancsok beilleszthetők a PowerShell indításakor automatikusan lefutó profil-szkriptbe is (lásd később). Ha a munkameneten belül törölni szeretnénk a létrehozott meghajtót, ezt nagyon egyszerűen megtehetjük, csupán a nevét kell paraméterként megadnunk a Remove-PSDrive cmdletnek:
PS C:\> Remove-PSDrive MSReg
Korábban említettük, hogy a PSmeghajtók csak a PowerShellből érhetők el, a Windows, és más alkalmazások nem ismerik fel az ilyen módon létrehozott útvonalakat. Ha azonban egy külső programot a shellből indítunk el, akkor mégis van mód a korlátozás megkerülésére. Hozzuk létre a „C:\munka” mappát és készítsünk benne egy szöveg.txt nevű szöveges fájlt tetszőleges tartalommal, majd rendeljük a mappához a scripts nevű PowerShell-meghajtót!
[15] PS C:\> New-PSDrive -name munka -PSProvider FileSystem -Root 'C:\munka'
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
munka 71,26 FileSystem C:\munka
Próbáljuk Notepad segítségével megnyitni a szöveg.txt fájlt!
PS C:\> notepad munka:\szöveg.txt
34 . ábra Hibajelzés a Notepadban
Elég rosszul néz ki, igaz? Az a baj, hogy ilyen esetben a beírt útvonalat nem a PowerShell, hanem az elindított alkalmazás értelmezi (illetve esetünkben nem értelmezi). Az eredmény csakis egy szép hibaüzenet lehet, amit nem a PowerShell, hanem a notepad jelenít meg. Azt kéne megoldanunk, hogy a PowerShell (aki persze tudja az igazságot), ne a beírt karakterláncot, hanem az annak alapján megfejtett igazi útvonalat adja oda szegény, buta Notepadnak, hiszen az még soha nem is hallhatott a „munka:” meghajtó létezéséről. A PowerShell belső használatú útvonalainak megfejtésére, feloldására a Resolve-Path cmdlet szolgál, ami az alábbi módon használható:
[16] PS C:\> (Resolve-Path munka:\szöveg.txt).ProviderPath
C:\munka\szöveg.txt
Az így átalakított útvonalat már bármely külső alkalmazásnak, így a Notepadnak is odaadhatjuk.
[17] PS C:\> notepad (Resolve-Path munka:\szöveg.txt).ProviderPath
PowerShell 3.0-tól kezdődően a PSDrive-ok nem csak egy adott PowerShell processzben létezhetnek, hanem egy „igazi” meghajtó felcsatolásként, akár PowerShellen kívülről is elérhetők. Ehhez a New-PSDrive cmdlettel a ‑Scope paramétert a Global értékkel és a -Persist kapcsolót kell használjuk:
PS C:\> New-PSDrive -Name P -PSProvider FileSystem -Scope Global -Root \\dc2016
\PowerShell -Persist
Name Used (GB) Free (GB) Provider Root
---- --------- --------- -------- ----
P 10,82 92,08 FileSystem \\dc2016\PowerShell
Ilyenkor van jónéhány megszorításunk:
A meghajtó neve csak egybetűs lehet, ami nem ütközhet már meglevő meghajtó betűjelével
A -Root csak hálózati megosztás lehet
Csak a Global PSDrive-ok lesznek ténylegesen állandóra létrehozva
A felcsatolt meghajtó csak azt létrehozó felhasználó számára lesz látható
Ha ezek teljesülnek, akkor a fájlböngésző ablakban is látszódni fog a meghajtó:
35 . ábra Állandóra felcsatolt meghajtó