如何使用Powershell将字符串编码为REG_BINARY

时间:2013-08-07 00:07:07

标签: powershell

我正在尝试使用Powershell将值写入REG_BINARY。如果我提供数据,我可以写入REG_BINARY,但我需要能够编码我想在文件中写入的内容,以便我可以使用系统和日期变量。以下是我的代码和错误。

如果您取消注释第一个$数据,它将起作用。

function Convert-ToCHexString 
{
    param ([String] $str) 
    $ans = ''
    [System.Text.Encoding]::ASCII.GetBytes($str) | % { $ans += "0x{0:x2}," -f $_ }
    return $ans.Trim(' ',',')
}

$Folder = Convert-ToCHexString Z:\
$Username = Convert-ToCHexString $env:USERNAME
$Filename = Convert-ToCHexString \archive.pst

$key = "HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook\0a0d020000000000c000000000000046"

#$data = 0x5a,0x3a,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74
$data = $Folder + "," + $Username + "," + $Filename + ",0x00,0x00,0x00"

Set-ItemProperty -path $key -name "001f0324" -value ([byte[]]($data))

以下是我得到的错误:

无法转换值“0x5a,0x3a,0x5c,0x6a,0x62,0x79,0x65,0x72,0x73,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74,0x00 ,0x00,0x00“键入”System.Byte []“。错误:“无法转换值”0x5a,0x3a,0x5c,0x6a,0x62,0x79,0x65,0x72,0x73,0x5c,0x61,0x72,0x63,0x68,0x69,0x76,0x65,0x2e,0x70,0x73,0x74,0x00 ,0x00,0x00“键入”System.Byte“。错误:”其他不可解析的字符位于字符串的末尾。“”

2 个答案:

答案 0 :(得分:0)

如果属性期望字节数组使用[Text.Encoding]::Unicode.GetBytes($data)。不知道最后的0x00,0x00,0x00是什么,但如果你需要,只需将三个0附加到字节数组的末尾,然后再传递给Set-ItemProperty。

答案 1 :(得分:0)

您的函数Convert-ToCHexString会返回一个字符串,其中您的项目以逗号分隔。

您执行的强制转换([byte[]]($data))仅在您的字符串仅包含单个十六进制值或者是可以通过这种方式解析的值数组时才起作用。它不会为你分割字符串。

但是,GetBytes函数已经返回一个字节数组,因此无需将其转换为字符串然后再返回。此外,根据您的评论,看起来outlook希望将这些值编码为Unicode(UTF-16),这并不奇怪,因为这是Windows的默认值。你还需要null终止你的字节数组(你从outlook看到的最后两个0)。这使你的功能看起来像这样:

function Convert-ToCHexString 
{
    param ([String] $str) 
    $ans = ''
    [System.Text.Encoding]::Unicode.GetBytes($str + "`0")
}