PowerShell для получения значения реестра: пошаговое руководство

В этой статье вы узнаете, как использовать PowerShell для получения значения реестра и запроса записей в реестре с использованием различных методов.

Давайте начнем!

Предварительные требования

Все примеры в этой статье будут продемонстрированы с использованием PowerShell 7.1, который на момент публикации статьи является последней версией. Вы также можете использовать Windows PowerShell 5.1, если хотите. Вам также следует иметь базовое понимание драйверов PowerShell.

Некоторые примеры могут не работать без прав администратора.

Получение ключей и значений реестра с помощью Get-ChildItem

Одним из самых простых способов найти ключи и значения реестра является использование командлета Get-ChildItem. Он использует PowerShell для получения значения реестра и других данных, перечисляя элементы в драйверах PowerShell. В данном случае драйвером PowerShell является драйвер HKLM, найденный при выполнении команды Get-PSDrive.

Выполните следующую команду в консоли 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. свойства, связанные с PowerShell, которые все начинаются с PS
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 с тем же контейнером реестра, что и раньше, давайте посмотрим значение для ключа 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.

Продолжая работу с контейнером WindowsUpdate, проверьте наличие контейнера AU, запустив следующую команду PowerShell:

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
     }
 }

Используя пользовательскую функцию, вы вводите путь и имя ключа или контейнера, а также значение, которое вы ищете, и пользовательская функция возвратит True или False (3), как показано на скриншоте ниже:

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

Следующие шаги

Знайте, что вы можете использовать команды Get-ChildItem, Get-ItemProperty и Get-ItemPropertyValue в PowerShell для получения значения и ключей реестра, что еще можно сделать?

Если вы хотите узнать больше о работе с реестром с помощью PowerShell, ознакомьтесь со статьей от Microsoft Docs, озаглавленной “Работа с ключами реестра”. Вы также можете найти отличную демонстрацию установки значений реестра в сообщении блога ATA Использование активной настройки: Как задать значение реестра во всех пользователях.

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