2

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

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

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”。错误:“其他不可解析的字符位于字符串的末尾。”

4

2 回答 2

0

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

只有当您的字符串仅包含一个十六进制值或它可以以这种方式解析的值数组时,您执行的 cast ( [byte[]]($data)) 才会起作用。它不会为您拆分字符串。

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

function Convert-ToCHexString 
{
    param ([String] $str) 
    $ans = ''
    [System.Text.Encoding]::Unicode.GetBytes($str + "`0")
}
于 2013-08-07T00:54:21.580 回答
0

如果该属性需要一个字节数组,请使用[Text.Encoding]::Unicode.GetBytes($data). 不确定最后的 0x00,0x00,0x00 是怎么回事,但如果需要,只需将三个 0 附加到字节数组的末尾,然后再将其传递给 Set-ItemProperty。

于 2013-08-07T00:41:35.227 回答