注册表编辑器查看PowerShell

PowerShell注册表(三)搜索注册表 2


PowerShell管理注册表之系列文章:

  1. 操作注册表的几条重要命令
  2. “提供程序”文件系统以外的位置
  3. 搜索注册表
  4. 创建和删除键值
  5. 注册表权限

使用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

在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属性获取的是键的完整名称,更有意思的是这些属性的名称,前面加了‘PS’,它们将注册表键分成多个片段。

键对应的值

在上图中打开的注册表编辑器中,右边的属性列有三个值,汇报给PowerShell的只有两个值:

$key.ValueCount
2

貌似一个值丢了。仔细查看属性“Property”可以发现PowerShell记录了哪些值:

$key.Property
 Install
 PID

这些属性名对应上图中的属性名,唯独(Default)没有出现。也对,在上图中默认值为空。注册表编辑器识别为:“数值未设置”。
如果你要获取这些值的内容,可以将注册表的PS路径传递给Get-ItemProperty:

> Get-ItemProperty $key.PSPath

Install      : 1
PID          : 89383-100-0001260-04309
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
PSProvider   : Microsoft.PowerShell.Core\Registry

这种方式会把该键对应的所有值自动获取并输出。另外,除了一些常规属性,这些值还包括了PowerShell添加的其他属性。如果你只想获取特定的值:

# 获取注册表键的所有值
$values = Get-ItemProperty $key.PSPath
# 获取Install的值:
$values.Install
1
# 获取PID的值:
$values.PID
89383-100-0001260-04309

如果你想获取键的所有值,但是不想包含PowerShell自动添加的属性。可以这样做:

$key = Get-Item HKLM:\Software\Microsoft\PowerShell\1
$values = Get-ItemProperty $key.PSPath
foreach ($value in $key.Property) 
{ 
  $value + "=" + $values.$value
}
#输出
Install=1
PID=89383-100-0001260-04309

小技巧:如果你已经将路径定位到该注册表路径下,还可以使用另外一种方法获取所有值:

Cd HKLM:\Software\Microsoft\PowerShell\1
(Get-ItemProperty .).PID
89383-100-0001260-04309

这里将”.”传递给Get-ItemProperty。当然前提条件是先得CD到目标键的路径下。

如果你想输出多个键的多个值,应当使用Dir。Dir的结果可以通过管道传递给ForEach-Object。这样,你就可以一次性获取某个键的所有子键,并且分别访问它们的属性值。下面的脚本会列出Uninstall的子键,和它们的属性DisplayName与MoreInfoURL.。这也为你提供了一个简约版已安装程序列表:

Dir hklm:\software\microsoft\windows\currentversion\uninstall |
ForEach-Object { 
 Write-Host -ForegroundColor Yellow "Installed Products:" }{
 $values = Get-ItemProperty $_.PSPath;
 "{0:-30} {1:20}" -f $values.DisplayName, $values.MoreInfoURL
 }{Write-Host -ForegroundColor Yellow "Finished!"}

荔非苔注:上面的脚本写法稍微有点坑爹,其实是ForEach-Object可以接受三个脚本块用于管道的流模式处理,分别代表begin,process和end。

键的子键

在注册表编辑器中,某个键的子键在PowerShell中可以这样调用:

$key.SubKeyCount
4

Dir也能获取子键的名称。需要将PSPath这样的PowerShell路径传递给Dir:

PS> Dir $key.PSPath

    Hive: HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1

Name                           Property
----                           --------
0409                           Install : 1
PowerShellEngine               ApplicationBase         : C:\Windows\System32\WindowsPowerShell\v1.0
                               PSCompatibleVersion     : 1.0, 2.0
                               RuntimeVersion          : v2.0.50727
                               ConsoleHostAssemblyName : Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0,
                               Culture=neutral,
                                                         PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil
                               ConsoleHostModuleName   :
                               C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell.ConsoleHost.dll
                               PowerShellVersion       : 2.0
PowerShellSnapIns
PSConfigurationProviders
ShellIds

原文链接:Managing Windows Registry

本文链接: https://www.pstips.net/searching-the-registry.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

2 条评论 “PowerShell注册表(三)搜索注册表