PSDrive, PSProvider

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.

Meghajtók létrehozása és törlése (New-PSDrive, Remove-PSDrive)

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

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

Állandó PSDrive létrehozása

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. Ehhez a New-PSDrive cmdlettel a ‑Scope paramétert a Global értékkel és a -Scope 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ó:

30 . ábra Állandóra felcsatolt meghajtó



Word To HTML Converter