В Windows, реестр — это централизованное хранилище конфигурационных
данных, где операционная система и приложения сохраняют информацию о
настройках и параметрах. Работа с реестром Windows является важной
частью разработки, так как позволяет взаимодействовать с этим хранилищем
для получения, изменения или удаления значений.
В Visual Basic .NET для работы с реестром используется класс
Microsoft.Win32.Registry
и его подклaссы. В этой главе мы
рассмотрим, как работать с реестром с использованием VB.NET.
Открытие и чтение ключей
реестра
Для работы с реестром в VB.NET важно правильно открыть нужный ключ
реестра. В реестре Windows ключи и значения разделяются на несколько
“корневых” уровней, таких как:
HKEY_LOCAL_MACHINE
— для системных настроекHKEY_CURRENT_USER
— для настроек текущего
пользователяHKEY_CLASSES_ROOT
— для ассоциаций файлов и типовHKEY_USERS
— для информации о пользователях
Чтобы открыть и прочитать данные, используется метод
Registry.GetValue
.
Пример открытия ключа и чтения значения:
Imports Microsoft.Win32
Dim key As String = "SOFTWARE\Microsoft\Windows\CurrentVersion"
Dim value As String = "ProgramFilesDir"
Dim result As Object = Registry.GetValue("HKEY_LOCAL_MACHINE\" & key, value, Nothing)
If result IsNot Nothing Then
Console.WriteLine("Значение: " & result.ToString())
Else
Console.WriteLine("Значение не найдено.")
End If
В этом примере мы открываем ключ реестра, который хранит путь к папке
с программами, и пытаемся получить значение ключа
ProgramFilesDir
.
Чтение всех значений в
ключе реестра
Для чтения всех значений из конкретного ключа, можно использовать
метод GetValueNames
для получения списка всех имен
значений. Затем можно читать каждое значение по его имени:
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion")
If regKey IsNot Nothing Then
For Each valueName As String In regKey.GetValueNames()
Dim value As Object = regKey.GetValue(valueName)
Console.WriteLine("Имя: " & valueName & ", Значение: " & value.ToString())
Next
Else
Console.WriteLine("Ключ не найден.")
End If
Здесь мы открываем ключ и выводим все его значения и имена.
Запись в реестр
Запись данных в реестр требует наличия прав на изменение реестра. Для
этого используется метод SetValue
, который позволяет
сохранять значения в определенный ключ реестра.
Пример записи строки в реестр:
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\MyApp", True)
If regKey Is Nothing Then
regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\MyApp")
End If
regKey.SetValue("UserSetting", "True")
Console.WriteLine("Значение успешно записано.")
В этом примере мы пытаемся открыть ключ реестра. Если ключ не
существует, создаем его с помощью метода CreateSubKey
.
После этого записываем значение в ключ с использованием
SetValue
.
Типы данных в реестре
При записи данных в реестр важно понимать, какие типы данных
поддерживаются:
- String — строка
- DWORD (32-bit integer) — 32-битное целое число
- Binary — бинарные данные
- QWORD (64-bit integer) — 64-битное целое число
- Multi-String — несколько строк
- Expandable String — строка с возможностью
расширения переменных среды
Пример записи строки и целого числа:
' Запись строки
regKey.SetValue("AppName", "MyApplication")
' Запись целого числа
regKey.SetValue("MaxUsers", 100, RegistryValueKind.DWord)
Удаление значений и ключей
Для удаления значений или целых ключей реестра используйте методы
DeleteValue
и DeleteSubKey
.
Пример удаления значения:
' Удаление значения из ключа
regKey.DeleteValue("UserSetting", False)
Пример удаления ключа:
' Удаление подкаталога
regKey.DeleteSubKey("MyApp")
Здесь важно заметить, что при удалении ключа или значения необходимо
быть осторожным, так как это действие необратимо.
Работа с правами доступа к
реестру
Для работы с ключами реестра, защищенными правами доступа (например,
в HKEY_LOCAL_MACHINE
), вам нужно будет иметь
соответствующие права администратора. Если у приложения нет этих прав,
попытка открыть или изменить ключ приведет к исключению.
Для работы с такими ключами необходимо либо запускать приложение от
имени администратора, либо использовать
RegistryKey.OpenSubKey
с флагом Writable
(если
доступ разрешен).
Пример:
Dim regKey As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\MyApp", True)
If regKey Is Nothing Then
Console.WriteLine("Нет прав для изменения этого ключа.")
Else
regKey.SetValue("Setting", "Value")
End If
Использование
реестра для хранения настроек приложения
Реестр является удобным способом хранения настроек для приложений.
Например, вы можете сохранить настройки пользовательского интерфейса,
предпочтительные параметры или информацию о состоянии приложения.
Пример использования реестра для хранения настроек интерфейса:
' Сохранение положения окна
Dim regKey As RegistryKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\MyApp\Settings")
regKey.SetValue("WindowTop", Me.Top)
regKey.SetValue("WindowLeft", Me.Left)
regKey.SetValue("WindowWidth", Me.Width)
regKey.SetValue("WindowHeight", Me.Height)
Для загрузки настроек:
Dim regKey As RegistryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\MyApp\Settings")
If regKey IsNot Nothing Then
Me.Top = CInt(regKey.GetValue("WindowTop", 100))
Me.Left = CInt(regKey.GetValue("WindowLeft", 100))
Me.Width = CInt(regKey.GetValue("WindowWidth", 800))
Me.Height = CInt(regKey.GetValue("WindowHeight", 600))
End If
Заключение
Работа с реестром в Visual Basic .NET предоставляет мощные
возможности для взаимодействия с операционной системой и управления
конфигурацией приложений. Важно помнить, что изменения в реестре могут
повлиять на работу системы, поэтому необходимо всегда быть осторожным
при чтении, записи и удалении данных из реестра.
Реестр Windows (англ. Windows Registry), или системный реестр — иерархически построенная база данных параметров и настроек в большинстве операционных систем семейства Microsoft Windows [2].
В реестре хранятся данные, которые необходимы для правильного функционирования Windows. К ним относятся профили всех пользователей, сведения об установленном программном обеспечении и типах документов, которые могут быть созданы каждой программой, информация о свойствах папок и значках приложений, а также установленном оборудовании и используемых портах [1].
Открытие реестра¶
Поскольку файлов в реестре несколько, его нельзя открыть, например, в текстовом редакторе и внести какие-либо коррективы. Для работы с ним требуется специальная программа – редактор реестра, который является встроенным компонентом операционной системы Windows и вызывается путем ввода команды Regedit
[4].
Существует несколько способов открыть редактор реестра.
Способ №1 – Открытие через утилиту «Выполнить»:
- Выбрать Пуск → Выполнить, либо нажать сочетание клавиш
Win+R
(Win
— клавиша, междуCtrl
иAlt
в нижнем ряду клавиатуры, обычно на ней изображен значок Microsoft Windows ; - В открывшимся окне ввести команду
regedit
; - Нажать клавишу
ОК
.
Рис. 1 – Открытие через утилиту «Выполнить»
Способ №2 – Открытие через поиск по меню «Пуск»:
- Открыть меню Пуск;
- Ввести в строке поиска
regedit
и запустить найденный файл, который отобразится в верхней части Пуска.
Рис. 2 – Открытие через поиск по меню «Пуск»
С другими способами можно ознакомиться в статье Три способа открыть редактор реестра Windows.
Структура реестра¶
Реестр имеет иерархическую структуру, которая напоминает файловую систему жесткого диска – с его каталогами, подкаталогами и файлами. Но называются элементы реестра по-другому: верхний уровень иерархии составляют разделы, каждый из которых может содержать вложенные подразделы, а также параметры. Именно в параметрах хранится основное содержимое реестра, разделы служат лишь для группировки схожих по назначению параметров [4].
Рис. 3 – Редактор реестра
Далее приведен краткий перечень и краткое описание стандартных разделов реестра. Максимальная длина имени раздела составляет 255 символов.
HKEY_CURRENT_USER
Данный раздел является корневым для данных конфигурации пользователя, вошедшего в систему в настоящий момент. Здесь хранятся папки пользователя, цвета экрана и параметры панели управления. Эти сведения сопоставлены с профилем пользователя. Вместо полного имени раздела иногда используется аббревиатура HKCU
.
HKEY_USERS
Данный раздел содержит все активные загруженные профили пользователей компьютера. Раздел HKEY_CURRENT_USER
является подразделом раздела HKEY_USERS
. Вместо полного имени раздела иногда используется аббревиатура HKU
.
HKEY_LOCAL_MACHINE
Раздел содержит параметры конфигурации, относящиеся к данному компьютеру (для всех пользователей). Наиболее интересным является подраздел Software
, который включает в себя настройки всех установленных в системе приложений. Вместо полного имени раздела иногда используется аббревиатура HKLM
.
HKEY_CLASSES_ROOT
Является подразделом HKEY_LOCAL_MACHINE\Software
. Хранящиеся здесь сведения обеспечивают выполнение необходимой программы при открытии файла с использованием проводника. Вместо полного имени раздела иногда используется аббревиатура HKCR
. Начиная с Windows 2000, эти сведения хранятся как в HKEY_LOCAL_MACHINE
, так и в HKEY_CURRENT_USER
.
Раздел HKEY_LOCAL_MACHINE\Software\Classes
содержит параметры по умолчанию, которые относятся ко всем пользователям локального компьютера. Параметры, содержащиеся в разделе HKEY_CURRENT_USER\Software\Classes
, переопределяют принятые по умолчанию и относятся только к текущему пользователю.
Раздел HKEY_CLASSES_ROOT
включает в себя данные из обоих источников. Кроме того, раздел HKEY_CLASSES_ROOT
предоставляет эти объединенные данные программам, разработанным для более ранних версий Windows. Изменения настроек текущего пользователя выполняются в разделе HKEY_CURRENT_USER\Software\Classes
. Модификация параметров по умолчанию должна производиться в разделе HKEY_LOCAL_MACHINE\Software\Classes
. Данные из разделов, добавленных в HKEY_CLASSES_ROOT
, будут сохранены системой в разделе HKEY_LOCAL_MACHINE\Software\Classes
. Если изменяется параметр в одном из подразделов раздела HKEY_CLASSES_ROOT
и такой подраздел уже существует в HKEY_CURRENT_USER\Software\Classes
, то для хранения информации будет использован раздел HKEY_CURRENT_USER\Software\Classes
, а не HKEY_LOCAL_MACHINE\Software\Classes
.
HKEY_CURRENT_CONFIG
Данный раздел содержит сведения о профиле оборудования, используемом локальным компьютером при запуске системы.
Примечание
Реестр 64-разрядных версий Windows подразделяется на 32- и 64-разрядные разделы. Большинство 32-разрядных разделов имеют те же имена, что и их аналоги в 64-разрядном разделе, и наоборот. По умолчанию редактор реестра 64-разрядных версий Windows отображает 32-разрядные разделы в следующем узле: HKEY_LOCAL_MACHINE\Software\WOW6432Node
Файлы реестра на жестком диске¶
Основные файлы, отвечающие за формирование реестра хранятся в папке %SystemRoot%\System32\Config\
. Обычно это C:\Windows\System32\Config\
и в зависимости от версии ОС их состав может несколько различаться.
Файл, хранящий личные настройки пользователя, «скрыт» в папке соответствующей учетной записи, например, в C:\Documents and Settings\Dmitry
. Также файлы, отвечающие за пользовательские настройки, могут храниться в:
C:\Documents and Settings\%Username%\(Ntuser.dat)
;C:\Documents and Settings\%Username%\Local Settings\Application Data\Microsoft\Windows\ (UsrClass.dat)
.
Еще есть резервные копии файлов реестра, созданные системой, хранятся они в
C:\Windows\System32\config\RegBack
– для Windows 7 и Server 2008;C:\Windows\repair
– для XP и Server 2003.
Примечание
По умолчанию операционная система делает резервные копии этих файлов раз в 10 дней с помощью планировщика задач.
Вспомогательные файлы для всех кустов за исключением HKEY_CURRENT_USER
хранятся в системах Windows NT 4.0, Windows 2000, Windows XP, Windows Server 2003 и Windows Vista в папке %SystemRoot%\System32\Config
.
Вспомогательные файлы для куста HKEY_CURRENT_USER
хранятся в папке %SystemRoot%\Profiles\Имя_пользователя
. Расширения имен файлов в этих папках указывают на тип содержащихся в них данных. Отсутствие расширения также иногда может указывать на тип содержащихся в файле данных.
Примечание
Куст (дерево) реестра (англ. hive) — это группа разделов, подразделов и параметров реестра с набором вспомогательных файлов, содержащих резервные копии этих данных.
Таблица 1 — Соответствие кустов реестра и вспомогательных файлов¶
Куст реестра | Вспомогательные файлы |
---|---|
HKEY_LOCAL_MACHINE\SAM |
Sam , Sam.log , Sam.sav |
HKEY_LOCAL_MACHINE\Security |
Security , Security.log , Security.sav |
HKEY_LOCAL_MACHINE\Software |
Software , Software.log , Software.sav |
HKEY_LOCAL_MACHINE\System |
System , System.alt , System.log , System.sav |
HKEY_CURRENT_CONFIG |
System , System.alt , System.log , System.sav , Ntuser.dat , Ntuser.dat.log |
HKEY_USERS\DEFAULT |
Default , Default.log , Default.sav |
Примечание
Например, кусту HKEY_LOCAL_MACHINE\Software
соответствует на жестком диске файл C:\Windows\System32\config\SOFTWARE
.
Рис. 4 – Файлы реестра на жестком диске
Новая техника скрытого извлечения данных из реестра: анализ и рекомендации по защите
Уровень сложностиСложный
Время на прочтение4 мин
Количество просмотров4.5K
Недавно в сети появился инструмент, который позволяет получить учетные данные из реестра Windows без взаимодействия с файловой системой — непосредственно из памяти. Детектировать такие атаки средствами штатного аудита очень непросто. В статье сравниваем механизм работы новой утилиты со старыми средствами, рассказываем о способе обнаружения ее активности и разных подходах к защите.
Утилита go-secdump позволяет удаленно извлекать NT-хеши из куста реестра SAM (security account manager) и секреты LSA (local security authority) непосредственно из памяти и без какого-либо удаленного агента. Она имеет заметные отличия от предыдущих аналогов с точки зрения своего поведения, что влияет на возможность обнаружения активности данной утилиты. Один из пользователей комьюнити создал Pull Request на добавление функциональности инструмента для скрипта secretsdump.py
из Impacket, что сильно скажется на частоте его использования злоумышленниками в «дикой природе», если он в итоге будет принят.
Предыдущие способы получения NT-хешей паролей локальных пользователей тоже так или иначе основывались на чтении из базы данных SAM. Поскольку получить доступ к файлу SAM
в файловой системе работающей ОС невозможно, большинство способов реализованы на чтении ключей SAM
, SYSTEM
и SECURITY
из ветки реестра HKLM
.
Злоумышленники могут получать NT-хеши двумя способами: локально и удаленно. Локальное извлечение хешей может осуществляться с помощью встроенной утилиты reg.exe
:
reg save HKLM\sam sam_file
reg save HKLM\system system_file
reg save HKLM\security security_file
Далее, используя скрипт secretsdump.py
из пакета Impacket, командой secretsdump.py -sam sam_file -system system_file -security security_file LOCAL
извлекают:
-
NT-хеши паролей локальных пользователей;
-
LSA-секреты;
-
кеш паролей доменных пользователей в формате DCC-хешей.
Удаленное извлечение чаще осуществляется такими утилитами, как CrackMapExec, NetExec и secretsdump.py. Данные утилиты также используют описанные выше ветки реестра.
Обнаружение подобных атак
Детектирование локального извлечения данных обычно строится на событии создания процесса (Event ID 4688) — запуске reg.exe
с передачей параметров, содержащих строки system/sam/security
.
Обнаружение удаленного извлечения хешей осуществляется с использованием следующих событий:
1. Аутентификация — событие безопасности с кодом 4624 с типом входа 3 (рис. 1).
2. Вызов удаленного реестра — событие безопасности «Объект общей сетевой папки был проверен на предмет возможности предоставления клиенту желаемого доступа» с кодом 5145 с Relative Target Name — winreg
(рис. 2). Для регистрации данного события необходимо дополнительно настроить аудит, что не всегда используется из-за генерации большого количества событий.
3. Запрос дескриптора объекта — событие безопасности с кодом 4656 (рис. 3). Для регистрации данного события необходимо настроить политику аудита Object Access — Registry и SACL для веток реестра HKLM\SAM
и HKLM\SYSTEM\CurrentControlSet\Control\Lsa
.
4. Сохранение содержимого ключей в каталоге Windows с произвольным именем и чтение данного файла через сетевую шару $ADMIN
. Событие безопасности «Объект общей сетевой папки был проверен на предмет возможности предоставления клиенту желаемого доступа» с кодом 5145 (рис. 4).
Обнаружение атак с использованием go-secdump
Описанные выше способы работают с файловой системой для временного хранения и получения содержимого выгруженных ключей реестра. Инструмент go-secdump использует привилегии WriteDACL для временного доступа к кустам реестра и выгрузки их содержимого без применения временных файлов. Событие 5145 с чтением и удалением TMP-файла зарегистрировано не будет.
Логирование события 4656 нужно настраивать отдельно, но объекты, для которых надо настраивать такой аудит, часто используются компонентами ОС. Поток подобных событий будет высок даже с одного хоста, а если говорить про инфраструктуру в тысячу или десятки тысяч конечных точек, то количество данных событий может влиять на время доступности полезных для форензики событий.
Для мониторинга действий атакующих по изменению веток реестра ACL (access control list) мы используем BI.ZONE EDR, который позволяет генерировать события при изменении/добавлении/удалении объектов ACE (access control entries) для интересующих нас веток реестра, в данном случае — SAM
/SECURITY
.
Настройка аудита добавления ACE в ACL — ветки реестра SAM
позволяет обнаружить атаку c использованием утилиты go-secdump, при которой генерируется только одно событие. Как выглядит алерт при срабатывании правила корреляции как раз на основе данного события, показано на рис. 5.
Настроив логирование сохранения содержимого ветки реестра SAM
, мы имеем возможность обнаружить использование других инструментов, действующих похожим образом, также на основе единичного события.
- Реестр Windows
- Рассылка почты
- Средства Windows
Чтение и запись в реестр Windows в произвольную ветку можно произвести при помощи функций объекта WScript.Shell:
RegRead и RegWrite
Первая функция возвращает значение, считанное из реестра, вторая — записывает заданное значение в реестр.
При попытке считать несуществующий параметр возникает ошибка,
обойти которую нам поможет директива On Error Resume Next
Пара функций для примера:
(получаем настройки программы из реестра Windows)
Function DefaultMailAccount() As String ' читает из реестра настройки почтового ящика, ' установленного в TheBAT! как "ящик по-умолчанию" ' возвращает адрес почты, или пустую строку, если TheBAT! не настроен On Error Resume Next: Err.Clear key$ = "HKEY_CURRENT_USER\Software\RIT\The Bat!\Users depot\Default" DefaultMailAccount = CreateObject("WScript.Shell").RegRead(key$) End Function
Function ПутьКФайлуПрограммыTheBAT() As String ' читает из реестра путь к исполняемому файлу программы TheBAT! ' возвращает путь к файлу, или пустую строку, если TheBAT! не установлен On Error Resume Next: Err.Clear key$ = "HKEY_CURRENT_USER\Software\RIT\The Bat!\EXE path" ПутьКФайлуПрограммыTheBAT = CreateObject("WScript.Shell").RegRead(key$) End Function
Sub TheBAT_MailBoxes() ' макрос выводит список всех почтовых ящиков, настроенных в программе TheBAT! On Error Resume Next: Err.Clear With CreateObject("WScript.Shell") For i = 1 To 100 key$ = "HKEY_CURRENT_USER\Software\RIT\The Bat!\Users depot\User #" & i Err.Clear: mailBox$ = .RegRead(key$) If Err = 0 Then Debug.Print mailBox$ Next End With End Sub
- 16089 просмотров
Для работы с реестром 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
Примечание. Ключ –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")
Совет. Если нужно создать/изменить определённый параметр реестра на нескоьких компьютерах домена AD, проще воспользоваться возможностями GPO.
Итак, мы рассмотрели типовые примеры использования PowerShell для работы с системным реестром Windows. Как вы видите, ничего сложного. Возможности редактирования реестра Windows из PowerShell очень удобно использовать различных скриптах автоматизации.