如何使用PowerShell设置二进制注册表值(REG_BINARY)?

时间:2011-07-01 17:24:57

标签: powershell registry powershell-v2.0

如何使用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。我知道要更改的数组中的哪个十六进制值,但我无法弄清楚如何设置二进制值。

7 个答案:

答案 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
}