Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Толик Панков ([info]hex_laden) в [info]csharp_dotnet
@ 2013-04-09 12:02:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:баги, вопросы

Баг в WMI?
А точнее в методе EnableDHCP класса Win32_NetworkAdapterConfiguration
Решаю задачу - написать программу, которая модифицировала бы свойства протокола IPv4 сетевого адаптера. В частности, необходимо, в некоторых случаях включать автоматическое получение IP-адреса.

Для решения задачи использую следующий код:


        public static int EnableDHCP(string stMAC)
        {
            //создаем новый Management Class для управления конфигурациями сетевых адаптеров
            ManagementClass AdaptersMan = new ManagementClass("Win32_NetworkAdapterConfiguration");
            //Получаем коллекцию объектов Management Object - все сетевые карты компа в данном случае
            ManagementObjectCollection AdaptersCollect = AdaptersMan.GetInstances();

            foreach (ManagementObject mAdapter in AdaptersCollect) //перебираем все адаптеры в коллекции
            {
                if ((string)mAdapter["MACAddress"] == stMAC) //Нашли адаптер с нужным MAC'ом
                {
                    try
                    {
                        ManagementBaseObject retManObj; //сюда будет возвращено значение InvokeMethod
                        ManagementBaseObject methodParameters = mAdapter.GetMethodParameters("EnableDHCP"); //А это объект для хранения параметров метода
                        //в данном случае их нет и дальше ничего не делаем
                        //сразу вызываем метод
                        retManObj = mAdapter.InvokeMethod("EnableDHCP", methodParameters, null);
                        return Convert.ToInt32(retManObj["returnValue"]);
                    }
                    catch
                    {
                        return -2; //произошла ошибка
                    }
                }
            }

            return -1; //Не нашли адаптер с нужным MAC
        }



Если сетевой кабель подключен, то все работает корректно, однако, при отключенном сетевом кабеле метод EnableDHCP возвращает ошибку 94, а в свойствах адаптера образуется следующий пиздец:

Этот баг был справедливо замечен одним из комментаторов и в соответствующей статье на MSDN. Так вот вопрос - что это? Неужто баг WMI? И можно ли его как-то побороть, или придется искать другие способы изменения параметров адаптера (не через WMI)


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


[info]steinkrauz
2013-04-09 12:35 (ссылка)
Судя по всем, баг WMI. Так что единственный способ -- менять напрямую в реестре
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\|EnableDHCP (DWORD)
0 -- выключено, 1 -- включено.

(Ответить) (Ветвь дискуссии)


[info]hex_laden
2013-04-09 13:00 (ссылка)
Благодарю. GUID, насколько я понимаю, можно из Win32_NetworkAdapter получить? Во всяком случае свойство GUID там есть, судя по MSDN.

Мда, странно все это. Как-так, MS пролюбил такой БАГИЩЕ в своем собственном WMI? Oo Ужос, как страшно жидь.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]steinkrauz
2013-04-09 13:31 (ссылка)
Да, либо Win32_NetworkAdapter, либо GetAdaptersAddresses вызвать.


Да не странно ни разу. Просто не вписался такой вариант ни в один из сценариев, используемых MS.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]hex_laden
2013-04-09 13:48 (ссылка)
Благодарю.
Через реестр, походу, даже удобнЕе, ибо можно не только установить параметры, но еще и выдрать их и сохранить куда-нибудь. Потом как напейшу программку, закину в сообщество. Будет просьба, если не сложно, посмотреть код и более профессиональным взглядом сказать, насколько он говно. Думаю себе портфолио сделать, а то надоело мне рулить бешенными монтажниками хочу быть вольною царицей кодить спокойно, не рискуя пиздануться с крыши или погибнуть от летящего с большой высоты шуруповерта.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]steinkrauz
2013-04-09 14:01 (ссылка)
Код гляну, но я не гуру ни разу.

(Ответить) (Уровень выше)