Управление в Powershell реестром


04 августа 2019


Работа в Powershell с реестром

Для работы в Powershell с реестром одной из основных команд является Get-ChildItem (аналог dir). Чтобы увидеть ветки нужно выполнить следующую команду:

Get-PSDrive -PSProvider Registry

Мы увидим два основных пути:

  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE

Powershell regedit path

Далее, для того что бы перейти к одной из этих веток мы можем сделать:

Set-Location -Path HKLM:\
#или
cd HKLM:\

Или если не хотим переходить, но нам нужно получить содержимое:

Get-ChildItem -Path HKLM:\
#или
dir HKLM:\

Поиск в реестре Powershell

Команды выше возвращает такой результат:

powershell реестр

Hive - это путь, по которому мы получили объекты. То что выделено в области 1 - Name или имена объектов, а в области 2 - это свойства.

Мы не можем обратиться к объекту напрямую, что бы получить это свойство, так:

Get-ChildItem 'HKCU:\Control Panel\Accessibility\Blind Access'

У нас просто ничего не отобразится. Мы можем по ним фильтровать вывод используя следующие ключи:

  • Recurse -рекурсивный поиск. Объекты ищутся не только в текущей директории, но и внутри вложенных.
  • Include - позволяет искать словосочетание в строке. Например если написать так "*network*", то будут отображаться только объекты, где есть упоминание network, причем слева и справа может быть тоже текст благодаря *.
  • Exclude - исключает какое-то упоминание в результатах.

Например так мы найдем все объекты, которые содержат упоминание mouse и исключают keyboard:

Get-ChildItem 'HKCU:\Control Panel\Accessibility\' -Include "*mouse*" -Recurse -Exclude "*keyboard*"

Причем бел ключа Recurse Include и Exclude работать не будут.

Если нам нужно найти конкретное Property из вывода выше, нужно использовать where. В примере я ищу путь с упоминанием mouse и свойством Flags:

Get-ChildItem 'HKCU:\Control Panel\Accessibility\' -Include "*mouse*" -Recurse | where Property -eq Flags

Если нам нужно найти Property с конкретным значением, нужно использовать еще одну команду Get-ItemProperty. В моем случае я ищу MaximumSpeed со значением 80:

$path = Get-ChildItem 'HKCU:\Control Panel\Accessibility\' -Include "*mouse*" -Recurse
$path | Get-ItemProperty | where -Property MaximumSpeed -EQ 80

powershell копирование ветки реестра

 

Изменение свойств реестра и их создание в Powershell

В предыдущих примерах мы нашли нужную ветку или свойство. Теперь попробуем изменить и создать.

Для изменения у нас есть следующих командлет:

$path = "HKLM:\SOFTWARE\Classes\AppUserModelId\Windows.SystemToast.Winlogon"
Set-ItemProperty -Path $path -Name "IconBackgroundColor" -Value 3

Где:

  • path - переменная с путем, где лежат наши свойства
  • Name - имя Property, которое хотим изменить
  • Value - новое значение

powershell registryИли мы так же можем поменять через конвейер:

Get-ChildItem 'HKCU:\Control Panel\Accessibility\' -Include "*mouse*" -Recurse  | Set-ItemProperty -Name MaximumSpeed -Value 86

 

Создание новых веток и свойств реестра Powershell

Для создания новых свойств мы должны выполнить аналогичную команду, но с приставкой New:

$vetka = "HKLM:\SOFTWARE\Classes\AppUserModelId\Microsoft.Office.OUTLOOK.EXE.15"
New-ItemProperty -Path $vetka -Name "ExchangeVal" -PropertyType String -Value 1

Regedit Powershell новое свойство

Как обычно мы передаем Path - переменную с путем и Name - имя новой ветки. PropertyType - это тип данных, который будет содержать наше значение. Оно может быть следующих значений:

  • String - эквивалент REG_SZ.
  • ExpandString - эквивалентно REG_EXPAND_SZ.
  • Binary - эквивалентно REG_BINARY.
  • DWord - эквивалентно REG_DWORD.
  • MultiString - эквивалентно REG_MULTI_SZ.
  • Qword - эквивалентно REG_QWORD.
  • Unknown - указывает, что это не поддерживаемый тип данных, которые есть в REG_RESOURCE_LIST.

Для создания новой ветки:

New-Item -Type Folder -Path $vetka -Name "ExchangeTree"

 

Как в Powershell удалить ветку реестра и свойства или скопировать

Для удаления Property используется эта команда:

$vetka = "HKLM:\SOFTWARE\Classes\AppUserModelId\Microsoft.Office.OUTLOOK.EXE.15"
Remove-ItemProperty -Path $vetka -Name "ExchangeVal"

Если мы хотим удалить ветку:

Remove-Item -Path "HKLM:\SOFTWARE\Classes\AppUserModelId\Microsoft.Office.OUTLOOK.EXE.15\ExchangeTree"

Скопировать можно так:

$dest = 'HKLM:\SOFTWARE\Classes\'
$from = $dest + 'AppUserModelId\Microsoft.Office.OUTLOOK.EXE.15\'
Copy-Item -Path $from -Destination $dest

 

Работа в Powershell с удаленным реестром 

Для работы на удаленном компьютере мы можем использовать PSRemoting - модуль для удаленного выполнения команд Powershell. Более подробно мы уже рассматривали. Для примера так я получу значение просто выполнив команду на компьютере AD1:

Invoke-Command -ComputerName AD1 -ScriptBlock {Get-ChildItem 'HKCU:\Control Panel\Accessibility\' -Include "*mouse*" -Recurse}

 

...

Теги: #powershell


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.