Elsőként nézzük meg, hogy hogyan lehet olvasni a registryből. Például listázzuk ki a registry alapján a számítógépre telepített alkalmazások nevét!
Miután a registryt is egy PSDrive-on keresztül érhetjük el, érdemes lehet akár új, a minket érdeklő információkat tartalmazó ágra új „shortcut” PSDrive-ot definiálni, hogy később már rövidebb elérési úttal is hivatkozhatók legyenek az egyes elemek:
[1] PS I:\>New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFT
WARE\Microsoft\Windows\CurrentVersion\Uninstall
Name Provider Root CurrentLocatio
n
---- -------- ---- --------------
Uninstall Registry HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
A mostani feladatunkban például az Uninstall registry kulcsot egy új, „Uninstall” nevű meghajtón keresztül lehet elérni. Erre már nagyon egyszerűen végezhetünk szokásos fájlműveleteket, például kilistázhatjuk az itt található kulcsokat a Get-ChildItem cmdlet segítségével, például csak a számmal kezdődőket:
PS C:\> Get-ChildItem uninstall:\[0-9]*
Hive: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninsta
ll
Name Property
---- --------
092555911492C6959D2596D612F52D UninstallString : C:\PROGRA~1\DIFX\D29FE547208F
CA71881CA2 E130\DPInst_x64.exe /u C:\WINDO
WS\System32\DriverStore\FileR
epository\android_winusb.inf_am
d64_bd75d06c56998078\android_
winusb.inf
DisplayName : Windows Driver Package - Goog
le, Inc. (WinUSB) AndroidUsbDev
iceClass (08/28/2014 11.0.00
00.00000)
DisplayIcon : C:\PROGRA~1\DIFX\D29FE547208F
E130\DPInst_x64.exe,0
DisplayVersion : 08/28/2014 11.0.0000.00000
Publisher : Google, Inc.
49CF605F02C7954F4E139D18828DE2 UninstallString : rundll32.exe C:\PROGRA~1\DIFX
98CD59217C \048B92BA3327CEF8\DIFxAppA.dll,
DIFxARPUninstallDriverPackag
e C:\WINDOWS\System32\DriverSto
re\FileRepository\grmnusb.inf
_amd64_3e4b654f12f06d57\grmnusb
.inf
DisplayName : Windows Driver Package - Garm
in (grmnusb) GARMIN Devices (0
6/03/2009 2.3.0.0)
DisplayIcon : C:\PROGRA~1\DIFX\048B92BA3327
CEF8\DIFxAppA.dll,0
DisplayVersion : 06/03/2009 2.3.0.0
Publisher : Garmin
7-Zip DisplayName : 7-Zip 15.14 (x64)
DisplayVersion : 15.14
DisplayIcon : C:\Program Files\7-Zip\7zFM.e
xe
InstallLocation : C:\Program Files\7-Zip\
UninstallString : C:\Program Files\7-Zip\Uninst
all.exe
NoModify : 1
NoRepair : 1
EstimatedSize : 4843
VersionMajor : 15
VersionMinor : 14
Publisher : Igor Pavlov
sEstimatedSize2 : 4843
Nézzük meg ugyanezt a regedittel:
119 . ábra Uninstall registry-ág
Látható, hogy amit mi a Regeditben látunk „fájlként”, azaz a 7-Zip-nél például a DisplayName, az a PowerShell-ben nem „fájl”, hanem az a mappának, ami a „7-Zip”-nek felel meg, a tulajdonsága (property). Ez egy kicsit zavarónak tűnhet, hiszen így a „7-Zip”-nek mint mappának változtathatók a tulajdonságai. De hogyan jutunk hozzá ezekhez a tulajdonságokhoz egyszerűen? Erre is van cmdlet, a Get-ItemProperty :
PS C:\> cd uninstall:
PS Uninstall:\> Get-ItemProperty 7-Zip
DisplayName : 7-Zip 15.14 (x64)
DisplayVersion : 15.14
DisplayIcon : C:\Program Files\7-Zip\7zFM.exe
InstallLocation : C:\Program Files\7-Zip\
UninstallString : C:\Program Files\7-Zip\Uninstall.exe
NoModify : 1
NoRepair : 1
EstimatedSize : 4843
VersionMajor : 15
VersionMinor : 14
Publisher : Igor Pavlov
sEstimatedSize2 : 4843
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTW
ARE\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTW
ARE\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : 7-Zip
PSDrive : Uninstall
PSProvider : Microsoft.PowerShell.Core\Registry
Egy kicsit többet is visszaad nekem a PowerShell, mint ami ténylegesen a registryben található: PSPath, PSPartentPath, stb. Ezek természetesen nincsenek benne a registryben, ezeket a PowerShell típusadaptációs rétege teszi hozzá. Sajnos ezeket a plusz adatokat akkor is hozzábiggyeszti, ha csak mondjuk a DisplayName paramétert akarjuk kiolvasni:
PS Uninstall:\> Get-ItemProperty 7-Zip -Name DisplayName
DisplayName : 7-Zip 15.14 (x64)
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
\Microsoft\Windows\CurrentVersion\Uninstall\7-Zip
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
\Microsoft\Windows\CurrentVersion\Uninstall
PSChildName : 7-Zip
PSDrive : Uninstall
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShell 5.0 előtt trükközni kell, ha tényleg csak az adott kulcs értékét akarom megtekinteni:
PS Uninstall:\> (Get-ItemProperty 7-Zip).DisplayName
7-Zip 15.14 (x64)
Azaz külön hivatkozni kell az adott kulcs nevére, nem igazán jó a –name paraméter használata. Szerencsére PowerShell 5.0-től új lehetőségünk van a registry érékek közvetlen kiolvasására, a Get‑ItemPropertyValue :
PS Uninstall:\> Get-ItemPropertyValue -Path .\7-Zip -Name DisplayName
7-Zip 15.14 (x64)
Még két lehetőségre hívnám fel a figyelmet a registry kulcsok olvasásával kapcsolatban. Az egyik GetValueNames() metódus, amellyel az adott kulcs tényleges értékeinek neveit lehet kiolvasni. A nevek birtokában aztán például valamelyik ciklussal lehet műveleteket végezni az értékekkel. Erre példaként nézzünk egy szkriptet, amely összeszámolja, hogy gépünkre hány font van telepítve, és abból mennyi a TrueType típusú:
[15] PS C:\> $ttf=0; (get-item "hklm:\\Software\Microsoft\Windows NT\Current
Version\Fonts").GetValueNames() | Where-Object {$_.contains("TrueType")} | F
orEach-Object {$ttf++}; $ttf
277
Ugyanezt a funkciót valósítottam meg következő szkriptben is, csak itt nem a GetValueNames() metódust alkalmaztam, hanem a PowerShell Select-Object cmdletjét, az ExtendProperty paraméterrel, mellyel egy adott objektum egy adott, tömböt tartalmazó tulajdonságának értékeit lehet kifejteni:
[22] PS C:\> $ttf=0; Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVe
rsion\Fonts" | Select-Object -ExpandProperty Property | where-object {$_.con
tains("TrueType")} | ForEach-Object {$ttf++}; $ttf
277