Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > GetAdaptersInfo после Hibernate/standby


Автор: Glen 16.9.2010, 14:57
У меня есть клиентский application на VC++ 6.0. Она при связи с неким сервером должна идентифицировать компьютер на котором она установлена. Для идентификации в частности используется MAC-адрес сетевого адаптера. Программист который это делал получал его так:

вызвал GetAdaptersInfo и получил размер буфера необходимый чтобы вернуть список всех адаптеров;
выделил этот буфер;
вызвал GetAdaptersInfo и получил список всех адаптеров в этот буфер;
в качестве MAC-адреса использовал поле Address из САМОЙ ПЕРВОЙ структуры IP_ADAPTER_INFO находящейся в буфере

Однако у одного из клиентов возникли проблемы: похоже наша программа, установленная на некоем компьютере, через какое-то время стала использовать другой MAC-адрес по сравнению с тем, что был на этом же компьютере раньше. Вроде бы - по словам клиента - это произошло ПОСЛЕ того как тот компьютер вошёл в Hibernate или StandBy; а потом вышел из него. Я пока не имею доступа к тому компьютеру, но скорее всего там установлены НЕСКОЛЬКО адаптеров, и почему-то изменился порядок их следования, когда они возвращаются функцией GetAdaptersInfo. Операционка - WinXP. Какие есть версии почему это могло случиться (или другая причина почему это могло случиться):
- связано ли это именно с Hibernate или StandBy; или возможна какая-то ещё причина;
- не восстановится ли старый порядок следования адаптеров после перезагрузки компьютера?
- не является ли вышеописанный метод опредления MAC-адреса (в целях идентификации компьютера) компьютера в принципе порочным; и чем?

Автор: borisbn 16.9.2010, 15:20
Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- связано ли это именно с Hibernate или StandBy; или возможна какая-то ещё причина;

перечисление адаптеров в windows - вещь не предсказуемая. причём после установки какого-нибудь service pack'а всё может пойти по другому

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не восстановится ли старый порядок следования адаптеров после перезагрузки компьютера?

если восстановится, то, скорее всего, это будет случайностью. Установишь новые драйвера на видео, например, и всё. кердык.

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не является ли вышеописанный метод опредления MAC-адреса (в целях идентификации компьютера) компьютера в принципе порочным; и чем?

эту защиту несложно обойти:
1. перепрошить MAC-адрес на нужный ( чревато, конечно, но делается из интерфейса настроек драйвера )
2. перехватить GetAdaptersInfo и возвращать то, что нужно.

Если у твоих клиентов не хватит на это духа/ума/желания/средств ( нужное подчеркнуть ), то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный

Автор: Glen 16.9.2010, 16:19
Цитата(borisbn @ 16.9.2010,  15:20)
Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- связано ли это именно с Hibernate или StandBy; или возможна какая-то ещё причина;

перечисление адаптеров в windows - вещь не предсказуемая. причём после установки какого-нибудь service pack'а всё может пойти по другому

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не восстановится ли старый порядок следования адаптеров после перезагрузки компьютера?

если восстановится, то, скорее всего, это будет случайностью. Установишь новые драйвера на видео, например, и всё. кердык.

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не является ли вышеописанный метод опредления MAC-адреса (в целях идентификации компьютера) компьютера в принципе порочным; и чем?

эту защиту несложно обойти:
1. перепрошить MAC-адрес на нужный ( чревато, конечно, но делается из интерфейса настроек драйвера )
2. перехватить GetAdaptersInfo и возвращать то, что нужно.

Если у твоих клиентов не хватит на это духа/ума/желания/средств ( нужное подчеркнуть ), то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный

>эту защиту несложно обойти:

Нет, мой клиент этим заниматься не будет. Я имел в виду случаи подобные тому что я встретил - когда порядок следования адаптеров вдруг меняется. Пока это первый заказчик который встретился с проблемой - тысячи инсталляций моей программы работали без неё несколько лет.

Добавлено через 1 минуту и 19 секунд
Цитата(Glen @ 16.9.2010,  16:19)
Цитата(borisbn @ 16.9.2010,  15:20)
Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- связано ли это именно с Hibernate или StandBy; или возможна какая-то ещё причина;

перечисление адаптеров в windows - вещь не предсказуемая. причём после установки какого-нибудь service pack'а всё может пойти по другому

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не восстановится ли старый порядок следования адаптеров после перезагрузки компьютера?

если восстановится, то, скорее всего, это будет случайностью. Установишь новые драйвера на видео, например, и всё. кердык.

Цитата(Glen @  16.9.2010,  14:57 Найти цитируемый пост)
- не является ли вышеописанный метод опредления MAC-адреса (в целях идентификации компьютера) компьютера в принципе порочным; и чем?

эту защиту несложно обойти:
1. перепрошить MAC-адрес на нужный ( чревато, конечно, но делается из интерфейса настроек драйвера )
2. перехватить GetAdaptersInfo и возвращать то, что нужно.

Если у твоих клиентов не хватит на это духа/ума/желания/средств ( нужное подчеркнуть ), то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный

>эту защиту несложно обойти:

Нет, мой клиент этим заниматься не будет. Я имел в виду случаи подобные тому что я встретил - когда порядок следования адаптеров вдруг меняется. Пока это первый заказчик который встретился с проблемой - тысячи инсталляций моей программы работали без неё несколько лет.

>установишь новые драйвера на видео, например, и всё. кердык.

То есть драйверы ВИДЕО могут повлиять на перечисление порядка СЕТЕВЫХ АДАПТЕРОВ?

Автор: borisbn 16.9.2010, 16:21
Цитата(Glen @  16.9.2010,  16:19 Найти цитируемый пост)
тысячи инсталляций моей программы работали без неё несколько лет.

возможно там был всего один адаптер ?
так а чем тебе не нравится предложение
Цитата(Glen @  16.9.2010,  16:19 Найти цитируемый пост)
то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный
 ?

Автор: Glen 12.11.2010, 11:56
Цитата(borisbn @ 16.9.2010,  16:21)
Цитата(Glen @  16.9.2010,  16:19 Найти цитируемый пост)
тысячи инсталляций моей программы работали без неё несколько лет.

возможно там был всего один адаптер ?
так а чем тебе не нравится предложение
Цитата(Glen @  16.9.2010,  16:19 Найти цитируемый пост)
то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный
 ?

'то можно брать адрес не жёстко первого адаптера, а всех и искать в них нужный' - имеется в виду по принципу 'если в списках адаптеров совпадает хотя бы один элемент (вне зависимости от их порядка в списке), то этот - тот же комп'? Да, думаю придётся так и делать. Ибо за прошедшее время я выснил что использованный мной способ имеет принципиальные недостатки:
- на компьютере могут создаваться разным софтом 'виртуальные адаптеры', попадающие в список ПЕРЕД физическими. И - ещё хуже - MAC такого виртуального адаптера может периодичски меняться, это нормальное явление. Я видел это на софте называемом Juniper Network Connect Virtual Adapter
- даже без 'виртуальных' адаптеров может быть такое: есть один Ethernet обычный и один - WiFi. Этот WiFi стоит первым с списке - пока включён. А потом его запретили (когда принесли лаптоп в офис и включили в проводную сеть), и он вообще ИСЧЕЗ из списка адаптеров возвращаемых этой функцией.

Доп вопросы:
Можно ли каким-от образом отделить физические адаптеры от виртуальных?
Есть ли какие-то ещё способы надёжной идентификации компьютера (персоналок и лаптопов)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)