Как установить значение двоичного реестра (REG_BINARY) с помощью PowerShell?

Как установить значение двоичного реестра (REG_BINARY) с помощью PowerShell?

Справочная информация:

Мне нужно изменить некоторые свойства службы состояния ASP.NET с помощью сценария PowerShell. К сожалению, встроенный командлет PowerShell Set-Service позволяет изменять только описание службы, тип запуска, отображаемое имя и статус. Мне нужно изменить свойство Subsequent failures на вкладке «Восстановление» (при просмотре свойств службы). Я обнаружил, что это значение хранится в реестре как значение REG_BINARY.

Экспорт значения выглядит так:

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\aspnet_state]
"FailureActions"=hex:50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,\
  00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00

В Powershell есть командлет Set-ItemProperty, с помощью которого вы можете устанавливать значения значений реестра. Для значения типа string или dword вы можете просто передать строку или int. Я знаю, какое шестнадцатеричное значение в массиве нужно изменить, но не могу понять, как установить двоичное значение.


person brett rogers    schedule 01.07.2011    source источник


Ответы (7)


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

New-ItemProperty -Path . -Name Test -PropertyType Binary -Value ([byte[]](0x30,0x31,0xFF))

и как изменить существующий:

Set-ItemProperty -Path . -Name Test -Value ([byte[]](0x33,0x32,0xFF))
person Howard    schedule 01.07.2011

Этот пост помог мне решить аналогичную проблему. Спасибо!

Объединение ответов xBr0k3n и Ховарда:

#Change these three to match up to the extracted registry data and run as Admin
$YourInput = "50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00"
$RegPath   = 'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\aspnet_state'
$AttrName  = "FailureActions"

$hexified = $YourInput.Split(',') | % { "0x$_"}
New-ItemProperty -Path $RegPath -Name $AttrName -PropertyType Binary -Value ([byte[]]$hexified)
person Frison Alexander    schedule 07.11.2015

Неужели только я чувствую, что упускает из виду главную часть вопроса?

Как бы вы подменили оригинал:

50,33,01,00,00,00,00,00,00,00,00,00,03,00,00,00,0e,00,00,\
00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00

В такой формат:

([byte[]](0x33,0x32,0xFF))

РЕДАКТИРОВАТЬ: после попытки заставить это работать, оказывается, вы просто префикс всех пар с помощью '0x'. Не уверен, почему это не было упомянуто в ответе. Так что просто измените приведенное выше на:

0x50,0x33,0x01,0x00,0x00,0x00,0x00,0x00... etc.

Затем оберните это следующим образом:

([byte[]](0x50,0x33,0x01,0x00,0x00,0x00,0x00,0x00... etc.))
person xBr0k3n    schedule 20.10.2014
comment
Исходный вопрос не о разборе формата экспорта *.reg. Хотя другие могут прийти сюда в поисках этого, ваш ответ, в отличие от Фризона Александра, на самом деле не показывает, как преобразовать строку например '50,33,01,00,00,...' в эквивалентный массив [byte[]]. - person mklement0; 06.02.2019

К вашему сведению, вы также можете установить двоичные значения с помощью модуля PSRemoteRegistry PowerShell (http://psremoteregistry.codeplex.com/ ), на локальных или удаленных компьютерах.

$Key = 'SOFTWARE\MyCompany'     
Set-RegBinary -Hive LocalMachine -ComputerName Server1 -Key $Key -Value RegBinary -Data @([char[]]'PowerShell')
person Shay Levy    schedule 03.07.2011

Воскрешая это.

Вот как можно кратко изменить двоичные значения элементов реестра в простой в использовании оболочке PowerShell. В этом примере DefaultConnectionSettings - это элемент реестра со значением REG_BINARY, которое мы пытаемся изменить.

$path = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"
$objName = "DefaultConnectionSettings"
$getObj = Get-ItemProperty -path $path -name $objName
$getObj.DefaultConnectionSettings[8] = 1
$objValue = $getObj.DefaultConnectionSettings
Set-ItemProperty -path $path -name $objName -Value $objValue

Когда вы используете Get-ItemProperty для элемента реестра со значением REG_BINARY, он предоставляет вам несколько дочерних объектов в коллекции.

Ссылаясь на имя элемента (в данном случае мы делаем getObj.DefaultConnectionSettings) в качестве дочернего объекта getObj, мы получаем массив значений, где каждое двоичное значение (т.е. 50,33,01,00,00,00,00,00,04) имеет свою собственную позицию в множество.

Поскольку это массив, мы можем легко ссылаться, изменять и перебирать по нему, выполняя $getObj.DefaultConnectionSettings[8] = 1 или любое другое число, которое вы хотите вместо 8. Число 8 относится к позиции значения в массиве. В примере с 50,33,01,00,00,00,00,00,04 9-я позиция - 04. Помните, что, как и во всем остальном, массивы начинают отсчет с нуля

Установка этого параметра = 1 изменит это значение 04 в двоичном формате на 01, а остальные значения в массиве останутся неизменными.

Наконец, мы вносим изменения с помощью Set-ItemProperty -path $path -name $objName -Value $objValue

Надеюсь, это поможет другим.

person Fishcakes    schedule 15.07.2021

Начнем с целого числа:

$int = 0xffffffff

Получите байты:

$bytes = [bitconverter]::GetBytes($int)

Использование set-itemproperty с малоизвестным параметром -type, который можно использовать с путями реестра:

Set-ItemProperty hkcu:\key1 bin1 $bytes -type binary

Верни это:

$bytes = Get-ItemProperty hkcu:\key1 bin1 | % bin1

Превратите 4 байта в int:

$int = [bitconverter]::toint32($bytes, 0)

'0x{0:x}' -f $int
0xffffffff
person js2010    schedule 18.01.2020

У меня были проблемы с другими решениями, вот что мне удалось:

Короткий ответ:

New-ItemProperty -path $path -name $name -value [byte]0x00,0x01,0x02 -PropertyType Binary

Полный пример:

$path = "HKCU:\Software\Hex-Rays\"
$name = "StrWinStringTypes"
$value = [byte]0x00,0x01,0x02

#if key path found, just add/modify the value/data pair
If (Test-Path($path))
{
    New-ItemProperty -path $path -name $name -value $value -PropertyType Binary -Force | Out-Null
}

#if key path not found, create it first before adding value/data
Else
{
    New-Item -path $path -force
    New-ItemProperty -path $path -name $name -value $value -PropertyType Binary -Force | Out-Null
}
person GuidedHacking    schedule 12.09.2020