C#Reg_Binary和BATCH

时间:2018-06-11 06:11:03

标签: c# winforms batch-file

我是BATCH粉丝,我正在尝试使用C#winForms而不是批处理来实现我的密钥。

我制作了一个简单的批处理脚本:

@echo off
reg add "HKEY_CURRENT_USER\Software\TestProgram\Kool" /f /v "Setting" /t REG_BINARY /d h4h999d27e93f3666188231a018c9d44406136wb 1>nul 2>&1

更新我的reg键无需担心。但是我想尝试用C#WinForms实现相同的结果,我相信我有正确的公式,但结果不正确。

我尝试了以下方法(在检查reg_binary是否存在并首先删除之后):

    private void button1_Click(object sender, EventArgs e)
    {
        if (Registry.GetValue(@"HKEY_CURRENT_USER\Software\TestProgram\Kool", "Setting", null) == null)
        {
            RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\TestProgram\Kool");
            try
            {
                var data = Encoding.Unicode.GetBytes("h4h999d27e93f3666188231a018c9d44406136wb");
                //Storing the values
                key.SetValue("Setting", data, RegistryValueKind.Binary);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
                MessageBox.Show(exc.StackTrace);
            }
            key.Close();

            MessageBox.Show("binary key created");
        }
    else
        {
             MessageBox.Show("error");
        }
   }

这使得关键不用担心,但它与我通过批处理时得到的格式或结果不一样,有人可以向我解释原因吗?我的结果和我的批处理文件一样。

我觉得我错过了一些简单的东西,也许它不正确的字节我似乎无法解决它。

我已阅读这些内容以寻求帮助: Write a Stringformated Hex Block to registry in Binary value How to retrieve a REG_BINARY value from registry and convert to string How can I read binary data from registry to byte array Read Registry_binary and convert to string

但仍然没有成功。

1 个答案:

答案 0 :(得分:3)

要创建二进制密钥,您需要传递byte[]。所以你应该首先将十六进制字符串转换为字节数组,然后添加值。

例如:

var path = @"Software\TestProgram\Kool";
var key = Registry.CurrentUser.OpenSubKey(path, true);
if (key == null)
    key = Registry.CurrentUser.CreateSubKey(path, true);
var hex = "d5d000d27e93f3116100224a018c9d00406136c3";
var value = StringToByteArray(hex);
key.SetValue("Setting", value, RegistryValueKind.Binary);

我使用了JaredPar在this post中分享的StringToByteArray方法:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}