Работа с ключами и записями реестра Windows из PowerShell

Для работы с реестром Windows не обязательно использовать графический редактор regedit.exe , или утилиту командной строки reg.exe. PowerShell предоставляет администратору большое количество инструментов для взаимодействия с реестром. С помощью PowerShell вы можете создать, изменить или удалить ключ/параметр реестра, выполнить поиск значения и подключиться к реестру на удаленном компьютере.

Навигация в реестре с помощью PowerShell

Работа с реестром Windows в PowerShell похожа на работу с обычными файлами на локальном диске. Основное отличие в том, что в этой концепции ветки реестра являются аналогом файлов, а ключи (параметры) реестра – свойствами этих файлов.

Выведите список доступных дисков на компьютере:

get-psdrive

get-psdrive: ветки реестра в powershell как диски

Обратите внимание, что среди обычных дисков (с назначенными буквами дисков ) есть особые устройства, доступные через провайдера Registry – HKCU (HKEY_CURRENT_USER) и HKLM (HKEY_LOCAL_MACHINE). Вы можете перемещаться по дереву реестра так же как вы перемещаетесь по дискам. Для обращения к определенному кусту реестра используется адресация HKLM: и HKCU: .

cd HKLM:
Dir -ErrorAction SilentlyContinue

вывести список разделов в ветке реестра с помощью powershelleestra

Т.е. вы можете обращаться к веткам реестра и им значениям (параметрам) с помощью тех же командлетов PowerShell, которые вы используете для управления файлами.

Для обращения к веткам (разделам реестра) используются командлеты с -Item :

  • Get-Item – получить информацию о ветке реестра
  • New-Item — создать новый раздел реестра
  • Remove-Item – удалить ветку реестра

Ключи (параметры) реестра нужно рассматривать, как свойства ветки реестра (аналогично свойствам файла). Для работы с параметрами реестра используются командлеты, заканчивающиеся на -ItemProperty :

  • Get-ItemProperty – получить значение параметра реестра
  • Set-ItemProperty – изменить название или значение параметра реестра
  • New-ItemProperty – создать параметр реестра
  • Rename-ItemProperty – переименовать параметр реестра
  • Remove-ItemProperty — удалить параметр

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

cd HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching

Или

Set-Location -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching

Получить значение параметра реестра с помощью PowerShell

Обратите внимание, что параметры, хранящиеся в ветке реестра, считаются не вложенными объектами (не аналогом файлов на файловой системе), а параметрами (Property) конкретной ветки реестра. Т.е. у любой ветке реестра может быть любое количество параметров.

Выведите содержимое текущей ветки командой:

dir

или

Get-ChildItem

Как вы видите, команда вывела информацию о вложенных ветках реестра и их свойствах. Но не вывела информацию о параметр SearchOrderConfig, который является свойством текущей ветки.

Чтобы получить список параметров (свойств) ветки реестра, выполните:

Get-Item .

или

Get-Item -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching

Как вы видите, ключ реестра DriverSearching имеет только один параметр – SearchOrderConfig со значением 1.

список доступных параметров ветки реестра - вывести из powershell

Чтобы получить значение параметра ключа реестре, используется командлет Get-ItemProperty.

$DriverUpdate = Get-ItemProperty –Path “HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching”
$DriverUpdate.SearchOrderConfig

get-itemproperty - получить значение параметра реестра из командной строки powershell

Мы получили, что значение параметра SearchOrderConfig равно 1.

Изменить значение параметра реестра из PowerShell

Чтобы изменить значение параметра реестра, воспользуйтесь командлетом Set-ItemProperty:

Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching' -Name SearchOrderConfig -Value 0

Проверьте, что значение параметра изменилось:

Get-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching' -Name SearchOrderConfig
Set-ItemProperty

Как создать новый раздел (ключ) или параметр реестра из командной строки PowerShell?

Чтобы создать новую ветку реестра используется команда New-Item. Создадим новую ветку с именем NewKey:

$HKCU_Desktop= "HKCU:Control PanelDesktop"
New-Item –Path $HKCU_Desktop –Name NewKey

Теперь создадим новый параметр (свойство) в новой ветке. Допустим, нам нужно создать новый строковый параметр типа REG_SZ с именем SuperParamString и значением file_name.txt :

New-ItemProperty -Path $HKCU_DesktopNewKey -Name "SuperParamString" -Value ”file_name.txt”  -PropertyType "String"

Вы можете использовать следующие типы данных для параметров в реестре:

  • Binary (REG_BINARY)
  • DWord (REG_DWORD)
  • Qword (REG_QWORD)
  • String (REG_SZ)
  • ExpandString (REG_EXPAND_SZ)
  • MultiString (REG_MULTI_SZ)
  • Unknown

Убедитесь, что в реестре появился новый ключ и параметр.

создать ключ и параметр реестра

Как из PowerShell проверить, что раздел реестра существует?

Если вам нужно проверить, существует ли раздел определенный реестра, используйте командлет Test-Path:

Test-Path 'HKCU:Control PanelDesktopNewKey'

Следующий PowerShell скрипт позволит проверить, существует ли определенный параметр реестра, и если нет, создать его.

regkey='HKCU:Control PanelDesktopNewKey'
$regparam='testparameter'

if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore)
{ write-host 'Параметр реестра существует' }
else
{ New-ItemProperty -Path $regkey -Name $regparam -Value ”new_value”  -PropertyType "String"  }

С помощью командлета Copy-Item можно скопировать записи из одной ветки реестра в другую

$source='HKLM:SOFTWARE7-zip'
$dest = 'HKLM:SOFTWAREbackup'
Copy-Item -Path $source -Destination $dest -Recurse

Если нужно скопировать все, включая вложенные ветки, добавьте параметр –Recurse.

Удаление раздела или параметра реестра

Для удаления параметра в ветке реестра используется команда Remove-ItemProperty. Удалим созданный ранее параметр SuperParamString:

$HKCU_Desktop= "HKCU:Control PanelDesktop"
Remove-ItemProperty –Path $HKCU_DesktopNewKey –Name "SuperParamString"

Можно удалить ветку реестра целиком со всем содержимым:

Remove-Item –Path $HKCU_DesktopNewKey –Recurse

Примечание . Ключ –Recurse говорит о том, что нужно рекурсивно без подтверждения удалить все вложенные подразделы.

Для удаления всех вложенных веток реестра (но не самого раздела):

Remove-Item –Path $HKCU_DesktopNewKey* –Recurse

Как переименовать ветку или параметр реестра?

Вы можете переименовать параметр реестра с помощью команды:

Rename-ItemProperty –path 'HKCU:Control PanelDesktopNewKey' –name "SuperParamString" –newname “OldParamString”

Аналогично можно переименовать ветку реестра:

Rename-Item -path 'HKCU:Control PanelDesktopNewKey' OldKey

Поиск в реестре с помощью PowerShell

PowerShell позволяет выполнять поиск по реестру. Следующий скрипт выполняет поиск по ветке HKCU:Control PanelDesktop параметров, в имени которых содержится ключ dpi.

$Path = (Get-ItemProperty ‘HKCU:Control PanelDesktop’)
$Path.PSObject.Properties | ForEach-Object {
If($_.Name -like '*win*'){
Write-Host $_.Name ' = ' $_.Value
}
}

Для поиска ветки реестра с определенным именем:

Get-ChildItem -path hkcu: -recurse -ErrorAction SilentlyContinue | Where-Object {$_.Name -like "*remontka*"}

Управление правами на ветки реестра из PowerShell

С помощью командлета Get-Acl вы можете получить текущие права на ветку реестра (командлет Get-ACL позволяет также управлять NTFS разрешениями на файлы и папки ).

$rights = Get-Acl -Path 'HKCU:Control PanelDesktopNewKey'
$rights.Access.IdentityReference

получить текущие разрешения на ветку реестра из powershell

В следующем примере мы изменим ACL на данную ветку реестра, предоставив право записи для группы Users.

Получите текущие разрешения:
$rights = Get-Acl -Path 'HKCU:Control PanelDesktopNewKey'

Укажите, кому нужно дать доступ:

$idRef = [System.Security.Principal.NTAccount]"BuiltInUsers"

Выберите уровень доступа:

$regRights = [System.Security.AccessControl.RegistryRights]::WriteKey
Задайте настройки наследования:

$inhFlags = [System.Security.AccessControl.InheritanceFlags]::None
$prFlags = [System.Security.AccessControl.PropagationFlags]::None

Тип доступа (Allow/Deny):

$acType = [System.Security.AccessControl.AccessControlType]::Allow
Создайте правило:
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ($idRef, $regRights, $inhFlags, $prFlags, $acType)

Добавим новое правило к текущему списку:

$rights.AddAccessRule($rule)

Применить новые права к ветке реестра:

$rights | Set-Acl -Path 'HKCU:Control PanelDesktopNewKey'

Проверьте, что новые в списке доступа к ветке реестра появилась новая группа пользователей.

powershell скрипт - изменить права на раздел реестра

Удаленный доступ к реестру с помощью PowerShell

PowerShell позволяет получить доступ к реестру удаленного компьютера. К удаленном компьютеру можно подключится через WinRM ( Invoke-Command или Enter-PSSession ). Чтобы получить значение параметра реестра на удаленном компьютере, выполните:

Invoke-Command –ComputerName srv-fs1 –ScriptBlock { Get-ItemProperty -Path 'HKLM:SystemSetup' -Name WorkingDirectory}

Или вы можете использовать подключение к удаленному реестру (служба RemoteRegistry должна быть включена):

$Server = "srv-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey= $Reg.OpenSubKey("SystemSetup")
$RegValue = $RegKey.GetValue("WorkingDirectory")

Совет . Если нужно создать/изменить определённый параметр реестра на нескоьких компьютерах домена AD, проще воспользоваться возможностями GPO .

Итак, мы рассмотрели типовые примеры использования PowerShell для работы с системным реестром Windows. Как вы видите, ничего сложного. Возможности редактирования реестра Windows из PowerShell очень удобно использовать различных скриптах автоматизации.

EnglishRussianUkrainian