PowerShell еще с самой первой версии предоставляет администратору большой набор инструментов для взаимодействия с системным реестром Windows. При желании, все типовые операции по работе с реестром можно выполнять не из интерфейса старого-доброго Regedit, или утилиты reg.exe, а из командой строки PowerShell. А в различных скриптах и сценариях он бывает вообще незаменим. В этой статье мы рассмотрим, как с помощью PowerShell создавать, редактировать, удалять ключи и параметры реестра Windows, выполнять поиск и подключатся к реестру на удаленном компьютере.
Навигация в реестре с помощью PowerShell
Работа с реестром системы в PowerShell похожа на работу с обычными файлами на локальном диске.
Выведем список доступных дисков:
get-psdrive
Как вы видите, встроенный провайдер позволяет получить доступ к содержимому двух веток реестра: HKEY_CURRENT_USER (HKCU) и HKEY_LOCAL_MACHINE (HKLM). Ветви реестра адресуются, аналогично дискам (HKLM:\ и HKCU:\). К примеру, чтобы перейти в корень ветки HKLM выполните:
cd HKLM:\
Перейдти к конкретной ветке реестра (к примеру, отвечающей за настройки автоматического обновления драйверов) можно с помощью команды Set-Location (короткий псевдоним sl)
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Выведем содержимое ветки:
dir
или
Get-ChildItem
Откроем эту же ветвь в редакторе реестра. Как вы видите, последняя команда вывела только информацию о вложенных ветвях, но не о параметрах текущей ветки.
Дело в том, что с точки зрения PowerShell ветвь реестра (ключ) является аналогом файла, а параметры, хранящиеся в данном ключе реестра – свойствами этого файла.
Поэтому, чтобы получить параметрам, находящимся в данной ветке, воспользуемся командлетом Get-Item:
Get-Item .
или
Get-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching
Как вы видите, ключ DriverSearching имеет только один параметр – SearchOrderConfig со значением 0.
Чтобы обратится к конкретному параметру ключа, используется командлет Get-ItemProperty. К примеру, присвоим содержимое ветки некой переменной и получим значение конкретного параметра:
$DriverUpdate = Get-ItemProperty –Path “HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\DriverSearching”
$DriverUpdate.SearchOrderConfig
Мы получили, что значение параметра SearchOrderConfig равно 1.
Как изменить значение параметра реестра
Чтобы изменить значение данного параметра, воспользуемся командлетом 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
Как создать новый раздел (ключ) или параметр реестра
Для добавления новой ветки реестра, воспользуемся командой New-Item. Создадим новую ветку с именем NewKey:
$HKCU_Desktop= "HKCU:\Control Panel\Desktop"
New-Item –Path $HKCU_Desktop –Name NewKey
Для созданной ветки добавим новый строковый параметр с именем SuperParamString и значением file_name.txt :
New-ItemProperty -Path $HKCU_Desktop\NewKey -Name "SuperParamString" -Value ”file_name.txt” -PropertyType "String"
Убедитесь, что в реестре появился новый ключ и параметр.
Удаление раздела или параметра реестра
Удалим созданный ранее параметр 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 '*dpi*'){
Write-Host $_.Name ' = ' $_.Value
}
}
Удаленный доступ к реестру с помощью 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. Как вы видите, ничего сложного.