2013-08-07 3 views
2

Я пытаюсь записать значение REG_BINARY с помощью Powershell. Я могу записать REG_BINARY, если я предоставляю данные, но мне нужно иметь возможность кодировать то, что я хочу записать в файле, чтобы я мог использовать переменные системы и даты. Ниже мой код и ошибка.Как закодировать строку в REG_BINARY с помощью Powershell

Если вы раскомментируете первые $ данные, он будет работать.

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 ». Ошибка:« Дополнительные символы, не подлежащие анализу, находятся в конце строки. »«

ответ

0

Если свойство ожидает массив байтов, используйте [Text.Encoding]::Unicode.GetBytes($data). Не уверен, что случилось с 0x00,0x00,0x00 в конце, но если вам это нужно, просто добавьте три 0 в конец массива байтов, прежде чем передавать его в Set-ItemProperty.

+0

Это работает, но при добавлении фотографий 0 не работает. Я получаю ошибку: не могу преобразовать значение «0 0», чтобы ввести «System.Byte». Ошибка: «Строка ввода не была в правильном формате». '$ key =" HKCU: \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Windows Messaging Subsystem \ Profiles \ Outlook \ 0a0d020000000000c000000000000046 " $ data =" Z: \ archive.pst " $ data = [Text.Encoding]: : Unicode.GetBytes ($ data) Write-Host $ data Set-ItemProperty -path $ key -name "001f0324" -значение ([byte []] ($ data)) –

+0

Нужны ли последние 0? Попробуйте это без них. Если они необходимы, вам нужно добавить их так: '$ bytes = [Text.Encoding] :: Unicode.GetBytes ($ data); $ bytes + = 0,0,0' –

+0

Это сделало это, спасибо! Все еще пытаюсь выяснить всю эту вещь разметки комментариев. http://pastebin.com/FVvXg5Yj - это окончательный код. –

0

Ваша функция Convert-ToCHexString возвращает одну строку с вашими данными через запятую.

Выполненное вами действие ([byte[]]($data)) будет работать только в том случае, если ваша строка содержит только одно шестнадцатеричное значение или представляет собой массив значений, которые он может анализировать таким образом. Он не будет разделять строку для вас.

Однако функция GetBytes уже возвращает массив байтов, поэтому нет необходимости преобразовывать ее в строку, а затем обратно. Кроме того, исходя из ваших комментариев, похоже, что Outlook хочет, чтобы эти значения были закодированы как Unicode (UTF-16), что неудивительно, так как это окна по умолчанию. Вам также нужно будет обнулить конец байтового массива (последние два 0, которые вы видите из Outlook). Это делает вашу функцию таким, как показано на рисунке:

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

Это работает, в некотором смысле. Ниже приведены значения, когда я вручную устанавливаю ключ в программе (Outlook) и результаты из вашего кода выше. –

+0

«Перспектива:« 001f0324 »= hex: 5a, 00,3a, 00,5c, 00,61,00,72,00,63,00,68,00,69,00,76,00,65,00, 2e, 00,70,00,73,00,74,00,00,00 Вручную: «001f0324» = гексагон: 5a, 3a, 5c, 61,72,63,68,69,76,65,2e, 70 , 73,74' Значение Outlook ставит три 0x00 в конце значения. Без них ценность в Outlook появляется как азиатский язык. –

+0

@ M3THOD Похоже, что Outlook хочет unicode с нулевым завершением. См. Мое обновление. – zdan

Смежные вопросы