• 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

这里稍微注意下,你可能会困惑,注册表包含的根节点远不止两个。

wKioL1VK513wstn-AAEzXLnEkjA342.jpg

注册表根节点

 

事实上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的一些内部设置。

wKiom1VK5b6QQE4jAAGCZ2OOoD4572.jpg

注册表编辑器查看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属性获取的是键的完整名称,更有意思的是这些属性的名