Запись значений в реестр с помощью C # - PullRequest
2 голосов
/ 02 ноября 2009

Я нахожусь в процессе создания приложения на C #, которое будет отслеживать изменения, внесенные в реестр, и записывать их обратно в реестр при следующем входе пользователя в систему.

Пока что у меня есть мониторинг изменений, отчеты о них, запись улья, ключа и значения в текстовый файл. Сейчас я нахожусь в точке, где мне нужно извлечь их значения из файла и поместить их обратно в реестр. Сейчас я просмотрел различные учебные пособия, но ни один из них не смог ответить на вопрос / проблему, которые у меня есть, поэтому, например, ключ реестра, который я хочу изменить:

HKEY_USERS \ S-1-5-21-2055990625-1247778217-514451997-41655 \ Программное обеспечение \ Microsoft \ Windows NT \ CurrentVersion \ Подсистема сообщений Windows \ Профили \ Outlook \ 0a0d020000000000c000000000000046, значение 01020402 и содержимое, содержащееся в этом

Что я хочу сделать, это написать обратно и изменить значение по мере необходимости. В настоящее время у меня есть 3 строки, одна содержит местоположение ключа, одна - значение, а последняя - содержимое значения, хотя я мог легко изменить манипуляции со строками, чтобы получить, а не получить то, что мне нужно или не нужно. Так что, если кто-нибудь сможет предоставить мне способ написать об этом, это будет оценено.

P.S. Итак, вы знаете, что значение paticular - это двоичное значение, которое я преобразовал в строку для хранения. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Любая помощь будет оценена .... спасибо

РЕДАКТИРОВАТЬ Код, который я сейчас использую:

public class reg
{
    public void write(string key, string valueName, string value)
    {
        Byte[] byteValue = System.Text.Encoding.UTF8.GetBytes(value);

        Registry.SetValue(key, valueName, value, RegistryValueKind.Binary);
    }
}

Ответы [ 2 ]

6 голосов
/ 02 ноября 2009

Полагаю, вам просто нужно найти подходящий класс для записи в реестр. Использование этого класса делает его относительно простым. Это все, что вы ищете?

string key = @"HKEY_CLASSES_ROOT\.sgdk2";
string valueName = string.Empty; // "(Default)" value
string value = "sgdk2file";

Microsoft.Win32.Registry.SetValue(key,valueName, value,
   Microsoft.Win32.RegistryValueKind.String);

Чтобы преобразовать шестнадцатеричную строку в двоичные данные:

static byte[] HexToBin(string hex)
{
   var result = new byte[hex.Length/2];
   for (int i = 0; i < hex.Length; i += 2)
   {
      result[i / 2] = byte.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
   }
   return result;
}

Если вам нужно снова увидеть эти байты как шестнадцатеричные, вы можете использовать код, подобный следующему:

static string BytesToHex(byte[] bytes)
{
   System.Text.StringBuilder sb = new StringBuilder();
   for (int i = 0; i < bytes.Length; i++)
   {
      sb.Append(bytes[i].ToString("x2"));
   }
   return sb.ToString();
}

Как показывает этот код, байты, представленные в виде hex 0e, ff и 10, преобразуются в двоичные 00001110, 11111111 и 00010000 соответственно.

static void Main(string[] args)
{
   byte[] bytes = HexToBin("0eff10");
   Console.WriteLine(BytesToBinaryString(bytes));
}

static byte[] HexToBin(string hex)
{
   var result = new byte[hex.Length / 2];
   for (int i = 0; i < hex.Length; i += 2)
   {
      result[i / 2] = byte.Parse(hex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
   }
   return result;
}

static string BytesToBinaryString(byte[] bytes)
{
   var ba = new System.Collections.BitArray(bytes);
   System.Text.StringBuilder sb = new StringBuilder();
   for (int i = 0; i < ba.Length; i++)
   {
      int byteStart = (i / 8) * 8;
      int bit = 7 - i % 8;
      sb.Append(ba[byteStart + bit] ? '1' : '0');
      if (i % 8 == 7)
         sb.Append(' ');
   }
   return sb.ToString();
}
1 голос
/ 02 ноября 2009

Итак, у вас есть строка, которую нужно преобразовать в двоичный файл и записать в реестр? Это работает?

string valueString = "this is my test string";
byte[] value = System.Text.Encoding.ASCII.GetBytes(valueString);
Microsoft.Win32.Registry.SetValue(keyName, valueName, valueString, Microsoft.Win32.RegistryValueKind.Binary);
...