Работа с ключами и записями реестра Windows из PowerShell
Для работы с реестром Windows не обязательно использовать графический редактор
regedit.exe
, или утилиту командной строки
reg.exe.
PowerShell предоставляет администратору большое количество инструментов для взаимодействия с реестром. С помощью PowerShell вы можете создать, изменить или удалить ключ/параметр реестра, выполнить поиск значения и подключиться к реестру на удаленном компьютере.
Работа с реестром Windows в PowerShell похожа на работу с обычными файлами на локальном диске. Основное отличие в том, что в этой концепции ветки реестра являются аналогом файлов, а ключи (параметры) реестра – свойствами этих файлов.
Выведите список доступных дисков на компьютере:
get-psdrive
Обратите внимание, что среди обычных дисков (с назначенными буквами дисков) есть особые устройства, доступные через провайдера Registry – HKCU (HKEY_CURRENT_USER) и HKLM (HKEY_LOCAL_MACHINE). Вы можете перемещаться по дереву реестра так же как вы перемещаетесь по дискам. Для обращения к определенному кусту реестра используется адресация HKLM: и HKCU:.
cd HKLM:
Dir -ErrorAction SilentlyContinue
Т.е. вы можете обращаться к веткам реестра и им значениям (параметрам) с помощью тех же командлетов 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.
Чтобы получить значение параметра ключа реестре, используется командлет Get-ItemProperty.
$DriverUpdate = Get-ItemProperty –Path “HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching”
$DriverUpdate.SearchOrderConfig
Мы получили, что значение параметра SearchOrderConfig равно 1.
Изменить значение параметра реестра из PowerShell
Чтобы изменить значение параметра реестра, воспользуйтесь командлетом Set-ItemProperty:
Set-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching' -Name SearchOrderConfig -Value 0
Проверьте, что значение параметра изменилось:
Get-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionDriverSearching' -Name SearchOrderConfig
Как создать новый раздел (ключ) или параметр реестра из командной строки 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 "*winitpro*"}
Управление правами на ветки реестра из PowerShell
С помощью командлета Get-Acl вы можете получить текущие права на ветку реестра (командлет Get-ACL позволяет также управлять NTFS разрешениями на файлы и папки).
$rights = Get-Acl -Path 'HKCU:Control PanelDesktopNewKey'
$rights.Access.IdentityReference
В следующем примере мы изменим 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 позволяет получить доступ к реестру удаленного компьютера. К удаленном компьютеру можно подключится через 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")
Итак, мы рассмотрели типовые примеры использования PowerShell для работы с системным реестром Windows. Как вы видите, ничего сложного. Возможности редактирования реестра Windows из PowerShell очень удобно использовать различных скриптах автоматизации.
Windows 10
Работа с ключами и записями реестра Windows из PowerShell