PowerShell获取注册表值:教程演练

在本文中,学习如何使用 PowerShell 获取注册表值并使用各种方法查询注册表条目。

让我们开始吧!

先决条件

本文中的所有示例都将使用 PowerShell 7.1 进行演示,这是本文发布时的最新版本。如果您选择,也可以使用 Windows PowerShell 5.1。您还应该对 PowerShell 驱动器 有一些基本的了解。

一些示例可能需要管理员权限才能正常运行。

使用 Get-ChildItem 获取注册表键和值

查找注册表键和值的一种最简单的方法之一是使用 Get-ChildItem 命令。这使用 PowerShell 获取注册表值,并通过枚举 PowerShell 驱动器中的项目来实现。在这种情况下,该 PowerShell 驱动器是通过运行 Get-PSDrive 找到的 HKLM 驱动器。

在 PowerShell 控制台中运行以下命令。

Get-ChildItem -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\'

在下面的截图中,您可以看到:

  1. WindowsUpdate 注册表键的完整键路径
  2. 键 AU
  3. 带有相应值的 AU 键的注册表条目列表
Getting registry values for Windows Update

关于上面的截图,有一个小细节需要注意。您可能注意到输出有些误导性。通常,PowerShell控制台输出代表对象的属性。Get-ChildItem在这种情况下表现不同,因为该对象在技术上没有属性。额外的命令在后台运行,以产生您看到的显示格式。

相关:如何在Windows注册表中检查待处理的重新启动

使用Get-ItemProperty获取注册表值

继续使用之前相同的注册表键,这次让我们使用Get-ItemProperty命令,使输出更易读。

使用Get-ItemProperty是获取注册表项属性及其值的最佳方法。运行以下命令:

Get-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'

在下面的截图中,您可以看到键和值的列表:

  1. 对于注册表容器AU
  2. PS开头的所有与PowerShell相关的属性
Using Get-ItemProperty in PowerShell to get registry values

作为替代方案,您还可以通过使用.NET轻微快速地指定注册表项路径来获得相同的输出。以下命令使用.NET注册表类在PowerShell中获取注册表值:

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU

使用Get-ItemPropertyValue获取注册表值

现在是查看关键值的时候了。使用与之前相同的注册表容器,使用Get-ItemPropertyValue cmdlet,让我们看看键NoAutoUpdate的值。运行以下 PowerShell 命令:

Get-ItemPropertyValue -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\' -Name NoAutoUpdate

使用Get-ItemPropertyValue,您将获得更简洁的输出,仅显示值,而不是之前看到的任何其他信息。

NoAutoUpdate key and the corresponding value

在没有 PS 驱动器的情况下查询注册表

在本教程中,您一直在使用 PowerShell 驱动器来处理注册表。这种方式并不是唯一的方式;您还可以利用 .NET 并通过 .NET 类获取注册表信息!

例如,也许您需要使用 PowerShell 在远程计算机上获取 HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU\ : AutoUpate 的注册表值。

您可以通过 .NET 来实现:

  1. 在远程计算机上打开注册表连接。
$Registry = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computername)

2. 打开您要查找的特定注册表键。

$RegistryKey = $Registry.OpenSubKey("SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU", $true)

3. 使用GetValue()方法查询注册表键内部的注册表值的值。

$RegistryKey.GetValue('AU')

使用 .NET 而不是 PowerShell 驱动器会快一点,并且是连接到远程计算机并使用 PowerShell 查询注册表键和值的简单方法。

使用Test-Path测试注册表值

有时您只需要验证注册表值是否存在。您可以使用Test-Path cmdlet 来执行此操作。

继续使用WindowsUpdate容器,通过运行以下PowerShell命令测试AU容器是否存在:

Test-Path -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'

如果结果为True,则键或容器存在。但如果您需要测试某个值或条目是否存在呢?让我们为此测试构建一个自定义函数:

Function Test-RegistryValue ($regkey, $name) {
     if (Get-ItemProperty -Path $regkey -Name $name -ErrorAction Ignore) {
         $true
     } else {
         $false
     }
 }

使用自定义函数,您输入键或容器的路径和名称,以及您要查找的值,自定义函数将返回TrueFalse(如下图所示):

Enter a key and value to test and return True or False

接下来的步骤:

请注意,您可以在PowerShell中使用Get-ChildItemGet-ItemPropertyGet-ItemPropertyValue来获取注册表值和键,还可以做什么呢?

如果您想了解有关使用PowerShell处理注册表的更多信息,请查看Microsoft Docs上标题为“Working with Registry Keys”的文章。您还可以在ATA博客文章Using Active Setup: How to Set a Registry Value in All Users Hives中找到设置注册表值的出色演示。

Source:
https://adamtheautomator.com/powershell-to-get-a-registry-value/