PowerShell注册表之:几条重要的操作命令
你可以像导航文件系统那样来访问注册表,PowerShell把文件系统和注册表都当作层次信息系统来处理。注册表中的键对应于文件系统的目录,但是键对应的值和文件系统中的文件不是非常类似。相反的,它们显示在属性栏,被以键的属性来管理。
PS C:\> Cd HKCU: PS HKCU:\> dir Hive: HKEY_CURRENT_USER Name Property ---- -------- AppEvents Console ColorTable00 : 0 ColorTable01 : 8388608 ColorTable02 : 32768 ColorTable03 : 8421376 ColorTable04 : 128 ColorTable05 : 8388736 ColorTable06 : 32896 ColorTable07 : 12632256 ColorTable08 : 8421504 ColorTable09 : 16711680 ColorTable10 : 65280 ColorTable11 : 16776960 ColorTable12 : 255 ColorTable13 : 16711935 ColorTable14 : 65535 ColorTable15 : 16777215 CursorSize : 25 EnableColorSelection : 0 ExtendedEditKey : 0 ExtendedEditKeyCustom : 0 FontFamily : 0 FontSize : 0 FontWeight : 0 FullScreen : 0 HistoryBufferSize : 50 HistoryNoDup : 0 InsertMode : 1 LoadConIme : 1 NumberOfHistoryBuffers : 4 PopupColors : 245 QuickEdit : 0 ScreenBufferSize : 19660880 ScreenColors : 7 TrimLeadingZeros : 0 WindowSize : 1638480 WordDelimiters : 0 CurrentPage : 0 Control Panel Environment TEMP : C:\Users\mosser\AppData\Local\Temp TMP : C:\Users\mosser\AppData\Local\Temp EUDC Identities Identity Ordinal : 1 Migrated7 : 1 Last Username : Main Identity Last User ID : {563ED914-095C-4B36-9D01-743D0C2AF679} Identity Login : 622675 Default User ID : {563ED914-095C-4B36-9D01-743D0C2AF679} Keyboard Layout Network Printers Software System Volatile Environment LOGONSERVER : \\DC.PSTips.Net USERDNSDOMAIN : PSTips.Net USERDOMAIN : PSTips.Net USERNAME : mosser USERPROFILE : C:\Users\mosser HOMEPATH : \Users\mosser HOMEDRIVE : C: APPDATA : C:\Users\mosser\AppData\Roaming LOCALAPPDATA : C:\Users\mosser\AppData\Local
下面的表格列出了访问注册表所需的所有命令。
命令 | 描述 |
Dir, Get-ChildItem | 列出键的内容 |
Cd, Set-Location | 更改当前(键)目录 |
HKCU:, HKLM: | 预定义的两个重要注册表根目录虚拟驱动器 |
Get-ItemProperty | 读取键的值 |
Set-ItemProperty | 设置键的值 |
New-ItemProperty | 给键创建一个新值 |
Clear-ItemProperty | 删除键的值内容 |
Remove-ItemProperty | 删除键的值 |
New-Item, md | 创建一个新键 |
Remove-Item, Del | 删除一个键 |
Test-Path | 验证键是否存在 |
注意:注册表几乎存储了Windows的核心配置。所以这也是它为什么成为我们用来读取和更改Windows配置的重要位置。因此乱搞或者误删非常危险,可能造成Windows不能启动。
PowerShell注册表之:"提供程序"文件系统之外的位置
PowerShell拥有一个被叫做“提供程序”的负责特定信息存储的模型化结构。在上一章,你已经使用过了文件系统提供程序,所以如果你想访问注册表,就需要一个替代文件系统的注册表提供者。在其它方面,就和上一章的操作没什么区别了。你可以在注册表中使用你在文件系统中使用过的命令。
支持的提供程序
Get-PSProvider能获取安装的提供程序列表。下面的例子中,可能没有列出你自定义的列表,因为提供程序可以随后添加。比如,PowerShell默认就没有活动目录的提供程序。
PS> Get-PSProvider Name Capabilities Drives ---- ------------ ------ Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess, Credentials {C, D, E} Function ShouldProcess {Function} Registry ShouldProcess, Transactions {HKLM, HKCU} Variable ShouldProcess {Variable} Certificate ShouldProcess {Cert}
这里你感兴趣的可能只是“Drives”列,它就是用来管理各自驱动器的名称。你也看到了,注册表提供程序挂载了驱动器HKLM:(根目录HKEY_LOCAL_MACHINE)和HKCU:(根目录HKEY_CURRENT_USER)。这些驱动器用起来,很像传统的文件系统驱动器,试试吧:
Cd HKCU:
Dir
从这个位置,你可以像你在真正的文件系统中做的那样,通过子目录来导航。相同的特殊字符功能也一样,除了”~”符号在注册表中不能识别,并且会产生错误。
然而其它驱动器,不属于这章的内容,因为我们的重点在注册表,但是作为引用还是在下面的表格中列出了所有的驱动器:
提供者 | 描述 | 示例 |
Alias | 管理别名 | Dir Alias:$alias:Dir |
Environment | 访问环境变量的提供者 | Dir env:$env:windir |
Function | 列出所有定义的函数, | Dir function:$function:tabexpansion |
FileSystem | 访问驱动器,目录和文件 | Dir c:$(c:\autoexec.bat) |
Registry | 访问Windows注册表 | Dir variable:$variable:pshome |
Variable | 管理定义在控制台中的所有变量 | Dir variable:$variable:pshoMe |
Certificate | 访问证书存储区的所有证书 | Dir cert:Dir cert:-recurse |
创建提供程序
注册表提供程序提供访问注册表。你可以通过驱动器来定位它们。如果你想查看那些注册表驱动器已经被注册表提供程序使用了,可以通过Get-PSDrive命令,和参数-PSProvider:
PS> Get-PSDrive -PSProvider Registry Name Used (GB) Free (GB) Provider Root CurrentLocation ---- --------- --------- -------- ---- --------------- HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE
这里稍微注意下,你可能会困惑,注册表包含的根节点远不止两个。
注册表根节点
事实上HKEY_CLASSES_ROOT根节点不是一个独立的根节点,而是指向HKEY_LOCAL_MACHINE\SOFTWARE\Classes。这意味着你可以以这个路径为起点,来创建一个新的驱动器。
New-PSDrive
-name
HKCR
-PSProvider
registry
-root
HKLM:\SOFTWARE\Classes
Dir HKCR:
现在,你可以去访问这个分支了。事实上,你可以访问上面表格中列出的任意根节点。
小技巧:你可以自由地创建任何额外的驱动器,尤其在你有频繁操作某个特定的注册表区域时。
New-PSDrive
job1 registry
"HKLM:\Software\Microsoft\Windows NT\CurrentVersion"
dir job1:
PowerShell注册表之:搜索注册表
使用Dir,你可以像在文件系统中那样来搜索注册表。使用注册表提供程序提供的虚拟驱动器,非常方便。驱动器HKCU:提供了KEY_CURRENT_USER根目录键的。
Cd HKCU: Dir
如果你想像下面那样列出内容,可以使用Format-List:
Dir | Format-List Dir | Format-List Name Dir | Format-List *
递归搜索
注册表提供程序不支持任何过滤器,因此你不能在Dir中使用类似于-filter这样的参数。但是参数-recurse,-include和 -exclude还是支持的。在上一章中,我们使用过它来递归地搜索文件系统。这个活在注册表中也可以这么干。比如,你想知道注册表中的那个位置包含了“PowerShell”,可以这样使用:
Dir HKCU:, HKLM: -recurse -include *PowerShell*
上面的命令会搜索HKEY_CURRENT_USER根节点和HKEY_LOCAL_MACHINE根节点。它会找出所有包括”PowerShell”单词的键。因为可能有很多键包含了单词“PowerShell”,所以使用了通配符。这样的搜索操作可能会产生错误信息,因为搜索的过程,也是读取注册表的每个子键的过程,但是部分键值没有访问权限就会报错。如果想从结果中过滤掉这些错误信息,可以使用参数-ErrorAction,并给它指定值为SilentlyContinue:
Dir HKCU:, HKLM: -recurse -include PowerShell -ErrorAction SilentlyContinue
单个注册表键
Dir获取的每一个注册表键(Microsoft.Win32.Registry 对象)对应下面的属性。
> $key = Dir HKCU: | Select-Object -first 1 > $key.GetType().FullName Microsoft.Win32.RegistryKey > $key | Get-Member -memberType *Property TypeName:Microsoft.Win32.RegistryKey Name MemberType Definition ---- ---------- ---------- Property NoteProperty System.String[] Property=System.String[] PSChildName NoteProperty System.String PSChildName=AppEvents PSDrive NoteProperty System.Management.Automation.PSDriveInfo PSDrive=HKCU PSIsContainer NoteProperty System.Boolean PSIsContainer=True PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\AppEvents PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.Core\Registry Handle Property Microsoft.Win32.SafeHandles.SafeRegistryHandle Handle {get;} Name Property string Name {get;} SubKeyCount Property int SubKeyCount {get;} ValueCount Property int ValueCount {get;} View Property Microsoft.Win32.RegistryView View {get;}
下面的表格列出一个Microsoft.Win32.Registry(注册表键)对象的重要属性:
属性 | 描述 |
Name | 在注册编辑器中显示的键的路径 |
Property | 当前键的名称 |
PSChildName | 存储在键中的值的名称数组 |
PSDrive | 键的注册表根节点 |
PSParentPath | 父键 |
PSPath | 键的PowerShell路径,使用Dir可以查看该路径下键的内容 |
PSProvider | 提供程序的名称:注册表 |
SubKeyCount(SKC) |
子键个数 |
ValueCount (VC) |
键中的值个数 |
PSIsContainer |
总是为True |
PowerShell怎样寻址注册表
我们来仔细看下分配一个注册表键的属性。比如:下面图中通过注册表编辑器打开的HKLM:\Software\Microsoft\PowerShell\1 键,这里存放的是PowerShell的一些内部设置。
注册表编辑器查看PowerShell
在PowerShell中使用Get-Item访问该键:
$key = Get-Item HKLM:\Software\Microsoft\PowerShell\1 $key.Name HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 $key | Format-List ps* PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell PSChildName : 1 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry PSIsContainer : True
果然,Name属性获取的是键的完整名称,更有意思的是这些属性的名