如何使用PowerShell设置二进制注册表值(REG_BINARY)?
背景:
我需要使用PowerShell脚本更改ASP.NET State服务的某些属性。遗憾的是,内置的PowerShell cmdlet 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
cmdlet,您可以使用该cmdlet设置注册表值。对于字符串或双字值,您只需传递字符串或int。我知道要更改的数组中的哪个十六进制值,但我无法弄清楚如何设置二进制值。
答案 0 :(得分:19)
以下行为您提供了如何创建一个
的示例New-ItemProperty -Path . -Name Test -PropertyType Binary -Value ([byte[]](0x30,0x31,0xFF))
以及如何更改现有的:
Set-ItemProperty -Path . -Name Test -Value ([byte[]](0x33,0x32,0xFF))
答案 1 :(得分:6)
这篇文章帮助我解决了类似的问题。谢谢!
将xBr0k3n和霍华德的答案结合在一起:
var snow = {
//variables
width: window.innerWidth,height: 650,flakeCount: 10,
gravity: 0.7,windSpeed: 20,flakes: [],
currentFlake: 0,snowGlobe: document.getElementById('snowglobe'),
//methods
getRandom: function(min,max){
return Math.floor(Math.random() * (max - min) + min);
},
animate: function(){
//while loop
while (this.currentFlake < this.flakeCount){
var flake = document.createElement('div'),
newFlake;
flake.className = "flake";
flake.style.fontSize = this.getRandom(20,50) + 'px';
flake.style.top = this.getRandom(0,this.height) + 'px';
flake.style.left = this.getRandom(0,this.left) + 'px';
flake.innerHTML = "*";
newFlake = this.snowGlobe.appendChild(flake);
//set a speed property to the newflake obj
newFlake.speed = this.getRandom(1,100);
this.flakes.push(newFlake);
this.currentFlake++;
}
var flakes = this.flakes;
//use the array of dom elements
for(var i = 0; i < flakes.length; i++){
positionX = false;
positionY = false;
//new Y position
positionY = parseFloat(flakes[i].style.top) + (flakes[i].speed / 100) * this.gravity;
if(positionY > this.height){
positionY = 0 - parseInt(flakes[i].style.fontSize);
positionX = getRandom(0, width);
}
//new X position
if (!positionX) positionX = parseFloat(flakes[i].style.left) + Math.sin(positionY / this.windSpeed);
if (positionX < -20) positionX = this.width + 20;
if (positionX > this.width + 20) positionX = -20;
// Set new position
flakes[i].style.top = positionX + 'px';
flakes[i].style.left = positionX + 'px';
}
}
}
//check browser window, did it resize?
window.onresize = function(){
snow.width = window.innerWidth;
console.log(snow.width);
}
setInterval(snow.animate, 1000/60);
//if you want, coment out the above line and uncoment the one below to see the snow loading
//snow.animate();
答案 2 :(得分:5)
只是我觉得这会错过这个问题的主要部分吗?
你将如何改变原作:
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.))
答案 3 :(得分:2)
仅供参考,您还可以使用PSRemoteRegistry PowerShell模块设置二进制值( http://psremoteregistry.codeplex.com/),在本地或远程计算机上。
$Key = 'SOFTWARE\MyCompany'
Set-RegBinary -Hive LocalMachine -ComputerName Server1 -Key $Key -Value RegBinary -Data @([char[]]'PowerShell')
答案 4 :(得分:1)
复活这个。
以下是如何在易于遵循的 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 的子对象,我们得到一个 array 值,其中每个二进制值(即 { {1}}) 在数组中有自己的位置。
因为它是一个数组,我们可以通过执行 50,33,01,00,00,00,00,00,04
或任何您想要的数字来代替 8 来轻松引用、修改和迭代它。 8 指的是数组中值的位置。在 $getObj.DefaultConnectionSettings[8] = 1
的示例中,第 9 位是 50,33,01,00,00,00,00,00,04
。 请记住,与其他事物一样,数组从 0 开始计数。
将其设置为 04
会将二进制中的 = 1
值更改为 04
,同时保留数组中的其余值不变。
最后,我们使用 01
希望这对其他人有帮助。
答案 5 :(得分:0)
让我们以整数开头:
$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
答案 6 :(得分:0)
我在其他解决方案上遇到了问题,这是我发现可以使用的方法:
简短回答:
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
}