Для работы с реестром Windows не обязательно использовать графический редактор
regedit.exe
, или утилиту командной строки
reg.exe.
PowerShell предоставляет администратору большое количество инструментов для взаимодействия с реестром. С помощью PowerShell вы можете создать, изменить или удалить ключ/параметр реестра, выполнить поиск значения и подключиться к реестру на удаленном компьютере.
- Навигация в реестре с помощью PowerShell
- Получить значение параметра реестра с помощью PowerShell
- Изменить значение параметра реестра из PowerShell
- Как создать новый раздел (ключ) или параметр реестра из командной строки PowerShell?
- Удаление раздела или параметра реестра
- Как переименовать ветку или параметр реестра?
- Поиск в реестре с помощью PowerShell
- Управление правами на ветки реестра из PowerShell
- Удаленный доступ к реестру с помощью 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:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Или
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Получить значение параметра реестра с помощью PowerShell
Обратите внимание, что параметры, хранящиеся в ветке реестра, считаются не вложенными объектами (не аналогом файлов на файловой системе), а параметрами (Property) конкретной ветки реестра. Т.е. у любой ветке реестра может быть любое количество параметров.
Выведите содержимое текущей ветки командой:
dir
или
Get-ChildItem
Как вы видите, команда вывела информацию о вложенных ветках реестра и их свойствах. Но не вывела информацию о параметр SearchOrderConfig, который является свойством текущей ветки.
Чтобы получить список параметров (свойств) ветки реестра, выполните:
Get-Item .
или
Get-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Как вы видите, ключ реестра DriverSearching имеет только один параметр – SearchOrderConfig со значением 1.
Чтобы получить значение параметра ключа реестре, используется командлет Get-ItemProperty.
$DriverUpdate = Get-ItemProperty –Path “HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching”
$DriverUpdate.SearchOrderConfig
Мы получили, что значение параметра SearchOrderConfig равно 1.
Изменить значение параметра реестра из PowerShell
Чтобы изменить значение параметра реестра, воспользуйтесь командлетом Set-ItemProperty:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig -Value 0
Проверьте, что значение параметра изменилось:
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching' -Name SearchOrderConfig
Как создать новый раздел (ключ) или параметр реестра из командной строки PowerShell?
Чтобы создать новую ветку реестра используется команда New-Item. Создадим новую ветку с именем NewKey:
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
New-Item –Path $HKCU_Desktop –Name NewKey
Теперь создадим новый параметр (свойство) в новой ветке. Допустим, нам нужно создать новый строковый параметр типа REG_SZ с именем SuperParamString и значением file_name.txt :
New-ItemProperty -Path $HKCU_Desktop\NewKey -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 Panel\Desktop\NewKey'
Следующий PowerShell скрипт позволит проверить, существует ли определенный параметр реестра, и если нет, создать его.
regkey='HKCU:\Control Panel\Desktop\NewKey'
$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:\SOFTWARE\7-zip\'
$dest = 'HKLM:\SOFTWARE\backup'
Copy-Item -Path $source -Destination $dest -Recurse
Если нужно скопировать все, включая вложенные ветки, добавьте параметр –Recurse.
Удаление раздела или параметра реестра
Для удаления параметра в ветке реестра используется команда Remove-ItemProperty. Удалим созданный ранее параметр SuperParamString:
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
Remove-ItemProperty –Path $HKCU_Desktop\NewKey –Name "SuperParamString"
Можно удалить ветку реестра целиком со всем содержимым:
Remove-Item –Path $HKCU_Desktop\NewKey –Recurse
Для удаления всех вложенных веток реестра (но не самого раздела):
Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse
Как переименовать ветку или параметр реестра?
Вы можете переименовать параметр реестра с помощью команды:
Rename-ItemProperty –path 'HKCU:\Control Panel\Desktop\NewKey' –name "SuperParamString" –newname “OldParamString”
Аналогично можно переименовать ветку реестра:
Rename-Item -path 'HKCU:\Control Panel\Desktop\NewKey' OldKey
Поиск в реестре с помощью PowerShell
PowerShell позволяет выполнять поиск по реестру. Следующий скрипт выполняет поиск по ветке HKCU:\Control Panel\Desktop параметров, в имени которых содержится ключ dpi.
$Path = (Get-ItemProperty ‘HKCU:\Control Panel\Desktop’)
$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 Panel\Desktop\NewKey'
$rights.Access.IdentityReference
В следующем примере мы изменим ACL на данную ветку реестра, предоставив право записи для группы Users.
Получите текущие разрешения:
$rights = Get-Acl -Path 'HKCU:\Control Panel\Desktop\NewKey'
Укажите, кому нужно дать доступ:
$idRef = [System.Security.Principal.NTAccount]"BuiltIn\Users"
Выберите уровень доступа:
$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 Panel\Desktop\NewKey'
Проверьте, что новые в списке доступа к ветке реестра появилась новая группа пользователей.
Удаленный доступ к реестру с помощью PowerShell
PowerShell позволяет получить доступ к реестру удаленного компьютера. К удаленном компьютеру можно подключится через WinRM (Invoke-Command или Enter-PSSession). Чтобы получить значение параметра реестра на удаленном компьютере, выполните:
Invoke-Command –ComputerName srv-fs1 –ScriptBlock { Get-ItemProperty -Path 'HKLM:\System\Setup' -Name WorkingDirectory}
Или вы можете использовать подключение к удаленному реестру (служба RemoteRegistry должна быть включена):
$Server = "srv-fs1"
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Server)
$RegKey= $Reg.OpenSubKey("System\Setup")
$RegValue = $RegKey.GetValue("WorkingDirectory")
Итак, мы рассмотрели типовые примеры использования PowerShell для работы с системным реестром Windows. Как вы видите, ничего сложного. Возможности редактирования реестра Windows из PowerShell очень удобно использовать различных скриптах автоматизации.
У меня вопрос таков:
Вношу изменения в «Default Domain Controllers Policy»
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "EnableCbacAndArmor" -Type DWord -Value 1
Set-GPRegistryValue -Name "Default Domain Controllers Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "CbacAndArmorLeve" -Type DWord -Value 1
Создал один объект групповой политики «DAC Policy» через PS
New-GPO -Name "DAC policy" | New-GPLink -Target "dc=test,dc=com" -LinkEnabled Yes | Set-GPPermission -TargetType User -TargetName "Admin" -PermissionLevel GpoEditDeleteModifySecurity
Set-GPRegistryValue -Name "DAC Policy" -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\KDC\Parameters" -ValueName "CbacAndArmorLeve" -Type DWord -Value 1
Следующим шагом хочу изменить параметр «DAC Policy», который отвечает за присоединение к этой политике доступных централизованных правил доступа, но в реестре не могу найти ветку
Не совсем верный текст: «Для удаления всех элементов в ветке, но не самого раздела, команда будет такой: Remove-Item –Path $HKCU_Desktop\NewKey\* –Recurse»
Эта команда удаляет не все элементы, а только подразделы в текущем разделе. Чтобы удалить параметры (записи) внутри раздела нужна ещё команда: «Remove-ItemProperty -Path $HKCU_Desktop\NewKey -Name *»
Как изменить свойства ветки: ‘HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Search’
Имя — SearchboxTaskbarMode
Тип — REG_DWORD
Значение — 2
Команда для консоли PoSh:
проверьть если ли параметр, если нет — создать, если есть — изменить:
$regkey='HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Search'
$regparam='SearchboxTaskbarMode'
if (Get-ItemProperty -Path $regkey -Name $regparam -ErrorAction Ignore) {Set-ItemProperty -Path $regkey -Name $regparam -Value 2} else { New-ItemProperty -Path $regkey -Name $regparam -Value 2 -PropertyType DWord}
Здравствуйте.
Мне нужно на разных машинах обнулить некоторый ключ. Предположим HKLM:\bla\bla
ключ на одной машине 123 на другой 132 на третьей 1456 и т.д. Но все начинаются на 1.
Создал такую конструкцию.
Set-ItemProperty HKLM:\bla\bla -name 1* -Value $null
Создает ключ «1*» В ветке.
Думал что можно через конвеер.
Get-ItemProperty HKLM:\bla\bla -Name 1* | Set-ItemProperty -Value $null
Пишет «Set-ItemProperty: The input object cannot be bound because it did not contain the information required to bind all mandatory parameters: Name» Что я делаю не так?
Я б сделал так:
$Path = 'HKLM:\Software\7-zip\'
(Get-Item -Path $Path).GetValueNames() |
Where-Object {$_ -like '1*'} |
ForEach-Object{
Set-ItemProperty -Path $Path -Name $_ -Value $null
}
Статья называется «Работа с ключами реестра». У меня вопрос — как насчёт ключа HKEY_CLASSES_ROOT ?
Можно обращаться к этому разделу так:
Get-Item "Registry::HKEY_CLASSES_ROOT\"
Подскажите как правильно написать, чтобы сначала искался параметр с именем «k2», причем имя точное, а затем значение этого параметра удалялось.
Нужно искать по всему реестру, или по конретному пути?
2 вариант с очисткой значения такой:
Clear-ItemProperty -Path "HKLM:\Software\\MyApp" -Name "k2"
Нужно искать по всему реестру, на разных машинах он разный.
Доброго времени суток. Подскажите пожалуйста, меняю значение в ветке реестра Set-ItemProperty -Path ‘HKCU:\Control Panel\Desktop’ -Name «DragFullWindows» -Value ‘1’ как мне применить это изменение, не перезагружая компьютер? Пробовал вырубать процесс explorer и заново запускать, не помогло, есть еще какие то варианты?
Наверно нужно все же делать
logoff.exe
NI HKLM:\SOFTWARE\Classes\Applications\notepad.exe\shell\edit\command
Не создаётся ветка реестра.
пишет что параметр реестра по указанному пути не существует — что я и так знаю.
Он создаст ветку command только если весь путь HKLM:\SOFTWARE\Classes\Applications\notepad.exe\shell\edit\ существует
Добрый день.
Спасибо за статью!
Подскажите, пожалуйста, при запросе значения реестра на удаленном ПК через Enter-PSSession через Get-ItemProperty/Get-ItemPropertyValue выдается зашифрованное значение, т.е. часть букв скрыто знаком *
Делаю запрос email на который был активирован MS Office
Этот ключ по моему и не хранится никогда открыто, кроме случаев с KMS активацией публичным ключом (и то не уверен, может и тогда прячется)
Здравствуйте не подскажите есть возможность вернуть по умолчанию права к ветке реестра.?
Думаю что нелья, вам придется скопировать ACL с другого компьютера