> Кстати, полез я в msdn - подумал, что раз не мытьем - так > катаньем: напишу тулзу свою, которая бы меня полностью > устраивала. И выяснил интересную вещь. Оказывается, даже на > десктопе, где netsh нормально работает, функция > GetAdaptersInfo отдает запись типа IP_ADAPTER_INFO, в > которой поле AdapterName имеет значение такого же вида, как > и в ноуте! То есть вида > {7BE685A5-0905-4624-AFEB-1780CF3D804F}!! > ! И я вообще не нашел нигде упоминания о том имени > соединения, которым оперирует netsh... > Короче, что-то я запутался совсем. Кстати, пишу на Delphi - > это такая морока... Ничерта не понятно - какие кода у каких > констант. Не ясно, какие именно типы должны быть у > некоторых полей в передаваемых структурах... Все, блин, > методом научного тыка. Пару лет назад в msdn были кода > констант - сейчас же я ничего такого не нахожу (по крайней > мере в разделе IP Helper - msdn за январь 2004 г.). Тут в > свое время на форуме пробегал архив сишных хидеров - > поковырялся в них - только для пары полей нашел коды > констант - и все. может, кто посвежее подкинет чего? Или > вообще нужно бросать это гиблое дело и переходить на VC...
Насчёт - переходить на VC или нет - не думаю... пиши на чём привык - так толку будет больше. Ты можешь взять бесплатный С++ компиллер выдранный их VS или WTL, которые сейчас MS раздаёт всем бесплатно и значения констант искать GREP-ом в хидер-файлах которые в полном объёме к этому компиллеру прилагаются. Ссылку на компиллер и WTL можно даже в новостях bugtraq поискать. Она там проскакивала..
Вот в этой теме:
http://www.bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=5&m=104738 я поднимал вопрос о быстрой смене настроек протокола при перемещении между различными сетями. ZloyShaman посоветовал использовать для этого netsh.
Т.к. опыта работы с утилитой у меня не было, то для начала решил потренироваться "на кошечках" - на настольной системе :-). Пишу скрипт следующего содержания:
----
interface ip
set address "LAN" static 192.168.102.122 255.255.255.0 192.168.102.243 1
delete dns "LAN" all
add dns "LAN" 192.168.100.150 index=1
add dns "LAN" 192.168.100.2 index=2 ----
(это реальные настройки сетки)
Имя интерфейса "LAN" соответствует имени подключения (можно глянуть в папке "Сеть и удаленный доступ к сети"), однако, не полагаясь на это, гляжу, как же сам netsh "видит" название соединения. Запускаю netsh и в нем даю команды:
----
interface ip show address ----
на которые получаю следующее:
----
Настройка интерфейса "LAN"
DHCP разрешен: Нет
IP-адрес: 192.168.102.122
Маска подсети: 255.255.255.0
Основной шлюз: 192.168.102.243
Метрика шлюза: 1
Метрика интерфейса: 1 ----
то есть получается, что для netsh это имя должно подойти. Так и поступаю. Сохраняю команды в скрипт и передаю этот скрипт на выполнение в netsh. Все чудесно. Настройки меняются, как и положено.
Перехожу ко второй части Марлезонского балета - адаптации этих скриптов к условиям ноута.
Прежде всего, дабы не мудрствовать, переименовал соединение по локалке в "LAN" - чтобы было меньше переделывать (скриптов-то несколько штук). Копирую скрипты на ноут, запускаю... и получаю сообщение об ошибке:
Указан недопустимый интерфейс "LAN" Тю, думаю. Что за чертовщина... Уже известным способом проверяю, под каким именем "видит" netsh мое соединение и фигею: в качестве имени соединения отображается "{7BE685A5-0905-4624-AFEB-1780CF3D804F}". Ну, думаю, черт с ним: как хочет - так и укажу. Изменяю один скрипт до следующего состояния:
----
interface ip
set address "{7BE685A5-0905-4624-AFEB-1780CF3D804F}" static 192.168.102.123 255.255.255.0 192.168.102.243 1
delete dns "{7BE685A5-0905-4624-AFEB-1780CF3D804F}" all
add dns "{7BE685A5-0905-4624-AFEB-1780CF3D804F}" 192.168.100.150 index=1
add dns "{7BE685A5-0905-4624-AFEB-1780CF3D804F}" 192.168.100.2 index=2 ----
и запускаю. В итоге скрипт вываливается с точно такой же ошибкой:
Указан недопустимый интерфейс "{7BE685A5-0905-4624-AFEB-1780CF3D804F}" И вот с этого момента, что я ни пробовал вводить - и без кавычек, и без скобок, и со служебными словами типа name= - все без толку. Одна и та же ошибка - недопустимый, мол, интерфейс. Пробовал перезагружаться и повторять опыты - ноль эмоций.
Добавлю, что на настольной системе стоит Intel'овская PCI-карточка, а в ноуте торчит PCMCIA-карточка Surecom.
Кто что посоветует? Блин, победа ж была так близка! :-)
А на ноуте какая OS?
02.06.04 00:08 Автор: nemo Статус: Незарегистрированный пользователь
Я апример заметил, что в 2000 до того как какой-нибудь пользователь злогинится интеравктивно в систему имена у всех интерфейсов отсутствуют, т.е ссылаться можно только по GUID-у, а в XP SP1, даже до интерактивного логона все имена у интерфейсов нормальные.
Windows 2000 Professional Rus SP4+ (то есть со всеми...02.06.04 13:55 Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
Windows 2000 Professional Rus SP4+ (то есть со всеми положенными фиксами)
> Я апример заметил, что в 2000 до того как какой-нибудь > пользователь злогинится интеравктивно в систему имена у > всех интерфейсов отсутствуют, т.е ссылаться можно только по > GUID-у, а в XP SP1, даже до интерактивного логона все имена > у интерфейсов нормальные.
Тут пользователь как раз залогинился... Интересно - а так вообще должно быть (я имею в виду имя соединения?).
Кстати, утром обнаружил я интересную фичу. При попытке запуска этого скрипта иногда (но не всегда! я бы сказал, через один или 2 раза) в журнале приложений появляется запись:
Тип события: Предупреждение
Источник события: PlugPlayManager
Категория события: Отсутствует
Код события: 256
Дата: 02.06.2004
Время: 10:13:50
Пользователь: Нет данных
Компьютер: Notebook
Описание:
Таймаут отправки уведомления об изменении интерфейса устройства в окно ""
Ничего не пойму. Неужели вся эта бодяга связана с политиками безопасности? Не может быть - я в них ничего не менял, все по умолчанию. Ноут в домен не входит и никогда не входил. Все пользователи (а все действия выполнялись при авторизации пользователя с правами локального админа) авторизуются локально. Что за чертовщина?
Ещё учти, что для того, чтобы интерфейсам были имена...03.06.04 20:41 Автор: nemo Статус: Незарегистрированный пользователь
> Ничего не пойму. Неужели вся эта бодяга связана с > политиками безопасности? Не может быть - я в них ничего не > менял, все по умолчанию. Ноут в домен не входит и никогда > не входил. Все пользователи (а все действия выполнялись при > авторизации пользователя с правами локального админа) > авторизуются локально. Что за чертовщина?
Ещё учти, что для того, чтобы интерфейсам были имена присвоены должны быть обязательно две службы запущены: Plug and Play и Диспетчер подключений удаленного доступа. Может быть ещё какие-нибудь службы (посмотри - может ты их застопил).
Да нет, обе работают.
03.06.04 23:45 Автор: J'JF <Dmytro Volhushyn> Статус: Elderman
> Ещё учти, что для того, чтобы интерфейсам были имена > присвоены должны быть обязательно две службы запущены: Plug > and Play и Диспетчер подключений удаленного доступа.
Да нет, обе работают.
> Может быть ещё какие-нибудь службы (посмотри - может ты их > застопил).
Я остановил только службу Маршрутизации и удаленного доступа. Однако, она никак не вляет на ситуацию - проверил.
Кстати, полез я в msdn - подумал, что раз не мытьем - так катаньем: напишу тулзу свою, которая бы меня полностью устраивала. И выяснил интересную вещь. Оказывается, даже на десктопе, где netsh нормально работает, функция GetAdaptersInfo отдает запись типа IP_ADAPTER_INFO, в которой поле AdapterName имеет значение такого же вида, как и в ноуте! То есть вида {7BE685A5-0905-4624-AFEB-1780CF3D804F}!!! И я вообще не нашел нигде упоминания о том имени соединения, которым оперирует netsh...
Короче, что-то я запутался совсем. Кстати, пишу на Delphi - это такая морока... Ничерта не понятно - какие кода у каких констант. Не ясно, какие именно типы должны быть у некоторых полей в передаваемых структурах... Все, блин, методом научного тыка. Пару лет назад в msdn были кода констант - сейчас же я ничего такого не нахожу (по крайней мере в разделе IP Helper - msdn за январь 2004 г.). Тут в свое время на форуме пробегал архив сишных хидеров - поковырялся в них - только для пары полей нашел коды констант - и все. может, кто посвежее подкинет чего? Или вообще нужно бросать это гиблое дело и переходить на VC...
Да нет, обе работают.06.06.04 00:37 Автор: nemo Статус: Незарегистрированный пользователь
> Кстати, полез я в msdn - подумал, что раз не мытьем - так > катаньем: напишу тулзу свою, которая бы меня полностью > устраивала. И выяснил интересную вещь. Оказывается, даже на > десктопе, где netsh нормально работает, функция > GetAdaptersInfo отдает запись типа IP_ADAPTER_INFO, в > которой поле AdapterName имеет значение такого же вида, как > и в ноуте! То есть вида > {7BE685A5-0905-4624-AFEB-1780CF3D804F}!! > ! И я вообще не нашел нигде упоминания о том имени > соединения, которым оперирует netsh... > Короче, что-то я запутался совсем. Кстати, пишу на Delphi - > это такая морока... Ничерта не понятно - какие кода у каких > констант. Не ясно, какие именно типы должны быть у > некоторых полей в передаваемых структурах... Все, блин, > методом научного тыка. Пару лет назад в msdn были кода > констант - сейчас же я ничего такого не нахожу (по крайней > мере в разделе IP Helper - msdn за январь 2004 г.). Тут в > свое время на форуме пробегал архив сишных хидеров - > поковырялся в них - только для пары полей нашел коды > констант - и все. может, кто посвежее подкинет чего? Или > вообще нужно бросать это гиблое дело и переходить на VC...
Насчёт - переходить на VC или нет - не думаю... пиши на чём привык - так толку будет больше. Ты можешь взять бесплатный С++ компиллер выдранный их VS или WTL, которые сейчас MS раздаёт всем бесплатно и значения констант искать GREP-ом в хидер-файлах которые в полном объёме к этому компиллеру прилагаются. Ссылку на компиллер и WTL можно даже в новостях bugtraq поискать. Она там проскакивала..