Для работы в Powershell с реестром одной из основных команд является Get-ChildItem (аналог dir). Чтобы увидеть ветки нужно выполнить следующую команду:
Get-PSDrive -PSProvider Registry
Мы увидим два основных пути:
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
Далее, для того что бы перейти к одной из этих веток мы можем сделать:
Set-Location -Path HKLM:\
#или
cd HKLM:\
Или если не хотим переходить, но нам нужно получить содержимое:
Get-ChildItem -Path HKLM:\
#или
dir HKLM:\
Поиск в реестре 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
В предыдущих примерах мы нашли нужную ветку или свойство. Теперь попробуем изменить и создать.
Для изменения у нас есть следующих командлет:
$path = "HKLM:\SOFTWARE\Classes\AppUserModelId\Windows.SystemToast.Winlogon"
Set-ItemProperty -Path $path -Name "IconBackgroundColor" -Value 3
Где:
- path - переменная с путем, где лежат наши свойства
- Name - имя Property, которое хотим изменить
- Value - новое значение
Или мы так же можем поменять через конвейер:
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
Как обычно мы передаем 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}
...
Подписывайтесь на наш Telegram канал
Теги: #powershell