Работа с реестром Windows, используя C# (.NET)

C#, .NET, Windows RegistryСуть такова. При установке на Windows OS, в частности Vista, 7, 8 программных продуктов виртуализации VirtualBox или VMWare, в сетевых подключениях появляются различные сетевые адаптеры, которые Windows Firewall помечает как адаптеры неопознанной сети. Поскольку, мне, обычно, не нужно каким либо образом идентифицировать эти сетевые элементы, я решил убрать эту надпись, мусолящую глаза «Неопознанная сеть». Решение проблемы я нашел на сайте brokenwire.net, вот ссылка на статью. К написанию этой статьи, меня склонило желание написать программу, для автоматизации выше указанных действий. Прошу под кат.

Работу с реестром будем рассматривать на примере программы. Ну что же, давай те писать.

У кого плохо с английским, расскажу вкратце  Нужно в реестре Windows найти ключ, который соответствует нашему адаптеру, созданному VirtualBox’ом или VMWar’ом. После чего создать в нем поле типа DWORD с именем «*NdisDeviceType« и значением «1«. Необходимая ветка ключей реестра лежит в HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}.

Для работы с реестром, нам нужны классы RegistryKey и Registry. Подключим необходимое пространство имен.

using Microsoft.Win32;

Теперь откроем наш ключ, хранящий различные устройства, в том числе и необходимые нам сетевые адаптеры.

            string vmsBaseKeyString = @"SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}";
            RegistryKey vmsBaseKey = Registry.LocalMachine.OpenSubKey(vmsBaseKeyString);

Опишу, что мы сделали. Строка vmsBaseKeyString хранит относительный путь к необходимому ключу, но без первой глобальной ветки. В реестре Windows всего 5 глобальных веток. В коде, к ним можно обращаться через поля класса Registry, которые представляют собой объекты RegistryKey. В данном случае, нам было необходима ветка HKEY_LOCAL_MACHINE. Мы обратились к ней, используя Registry.LocalMachine и вызвали метод OpenSubKey. Этот метод возвращает вложенный раздел по заданному пути в виде объекта класса RegistryKey.

Теперь с помощью метода GetSubKeyNames класса RegistryKey, мы можем получить массив имен вложенных ключей.

string[] subNames = vmsBaseKey.GetSubKeyNames();

Далее нужно найти ключ, которому соответствует наш адаптер. В случае VMWare значение ProviderName должно быть равно «VMware, Inc.«, а для VirtualBox’а, у этого ключа значение DriverDesc должно быть равно «VirtualBox Host-Only Ethernet Adapter». Кроме того, необходимо учесть, что среди дочерних ключей нашего vmsBaseKey, есть ключ Properties, который мы не сможет открыть. При обнаружении ключа, создадим там сразу поле типа DWORD с именем «*NdisDeviceType« и значением 1.

            foreach (var subName in subNames)
            {
                if (subName != "Properties")
                {
                    RegistryKey potentialVmKey = vmsBaseKey.OpenSubKey(subName, true);
                    if ((string)potentialVmKey.GetValue("ProviderName") == "VMware, Inc." ||
                        (string)potentialVmKey.GetValue("DriverDesc") == "VirtualBox Host-Only Ethernet Adapter")
                    {
                        potentialVmKey.SetValue("*NdisDeviceType", 1, RegistryValueKind.DWord);
                    }
                }
            }

Здесь мы используем перегруженный метод OpenSubKey, передавая ему вторым параметром булевое значение true, что указывает на открытие ключа в режиме чтения и записи. Далее, используя метод GetValue и явное преобразование в string, мы проверяем значения полей данного ключа. Если необходимые значения полей совпадают с необходимыми нам значениями, используя метод SetValue, мы создаем новое поле, с именем *NdisDeviceType, со значением 1 и типом RegistryValueKind.DWord, что соответствует типу реестра DWORD.

Вот и все, осталось только выключить и включить сетевые адаптеры, созданные средствами виртуализации.

Задавайте свои ответы.

 

Комментарии 9

  • Спасибо за полезную информацию, не знал об этом.

  • У меня строка с вызовом метода OpenSubKey, возвращает null, почему так?

  • приветсвую помогите удалить эти ключи с реестра
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles\%SystemRoot%/system32/DRIVERS/VBoxNetAdp6.sys
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles\%SystemRoot%/system32/DRIVERS/VBoxNetAdp6.sys
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpLockdownFiles\%SystemRoot%/system32/DRIVERS/VBoxNetAdp6.sys

    все делаю с правами админа ,и безопасным режиме тож не удаляются. Я админ своего ноута но какой то кусок кода не могу удалить Виндовс 8.1 про, х64

    • Может быть они не «не удаляются» а создаются вновь?

      Кстати, зацените мой английский блог. Ссылка в шапке сайта.

  • Забыл написать что все дрова и все папки я удалил от VBOX.
    Reg Organizer показывает эти ключи когда вбиваешь в поиске
    VBoxNetAdp
    VBoxUSB

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *