Здравствуйте Господа программисты!
помогите непрофессионалу - необходимо включать и отключать сетевую плату. Перекопал все "королевство". Хоть в каком направлении копать? Лучше пример. Буду очень признателен.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
13-11-2009 15:54 | Комментарий к предыдущим ответам
Добрый день, какая интересная беседа))
дело в том , что я пытаюсь покодить в ту же сторону.
Правда мне нужно сменить занчение параметра(NetworkAddress) по рег. адресу:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\0011
хыхы ^^
var:
reg:TregInifile;
brgin......
а ворос таков, что пройдя с помощью reg.openkey по всей ветке затыкаюсь в предпоследнем (4D36E972-E325-11CE-BFC1-08002bE10318) каталоге.
Дело в том , что метод openkey работает по названию раздела, а они там все на одно лицо и выглядят так -4D36E972-E325-11CE-BFC1-08002bE10318
и щтук их там 20.
ПОДСКАЖИТЕ ПОЖАЛУЙТА как программно открыть именно тот, который для сетевой карты.
Кстати подход с devcon.exe оч интересный)) мож он и мне поможет, спасибо.
P.S метод через настройки сетевой не предлагать, сам знаю))) ибо интересует програмный смособ)))
PP.S ну что я могу еще сделать если провайдер догадался поставить у меня на этаже не управляемый свич и ipшки дает по DHCP)))
19-05-2006 10:20 | Комментарий к предыдущим ответам
А если 2 сетевухи и надо отключить одну, то не один способ не катит.
Посмотрите внимательно ответ от "21.07.2005 10:01", там используется SetIfEntry. Да и devcon.exe думаю можно использовать, только правильно параметры задать.
devcon.exe отрабатывает действительно корректоно. Единственно в enable и disable командах нужно в строках писать маски УСТРОЙСТВ (DEV_1050), а НЕ ПОСТАВЩИКОВ (VEN_8086*), к примеру,
devcon.exe disable *DEV_1050* -мне показалось работает корректно
т.к. по вендор (VendorID), к примеру 8086 устройств может быть очень много!
devcon.exe disable PCI\VEN_8086* - выключит все устройства 8086
а это неправильно.
Большое спасибо за ответы. Действительно очень помогли!!!
Я объяснил общий подход к решению вопроса. Можно пройти в цикле все подветки (00xx) этого пути в реестре, и запомнить всё что нужно в массивах. Кстати автор "Х" описал как блокировать интерфейс.
Для этого нужно знать его =индекс=. Индекс можно узнать функцией GetAdaptersInfo по соответствию с GUID - это поле AdapterName записи IP_ADAPTER_INFO и это же параметр NetCgfInstanceId в реестре). Вот так всё закручено. Я когда разбирался написал для себя демку которая выдаёт список (StringGrid)интерфейсов и может Блок/Разблок. и Откл./Вкл. выбранный интерфейс. Именно так и делал. А к сложностям надо привыкать, если собираешься на Delphi писать программы, каторые для неё не свойственны.
Здравствуйте! последний пример достаточно сложный... покопаюсь. А вот насчет блокировки трафика без отключения сетевой платы от автора "Orinoko" очень хотелось бы увидеть что-нибудь. Очень жду. Спасибо за понимание.
begin
// Читаем все IP адреса со всех присутствующих
// в системе сетевых интерфейсов
// Смотрим сколько памяти нам требуется?
kol:=0;
Form2.ListView1.Clear;
if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then
begin
// Берем нужное кол-во
GetMem(InterfaceInfo, Len);
try
// выполнение функции
if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then
begin
// Перечисляем все сетевые интерфейсы
TmpPointer := InterfaceInfo;
repeat
// перечисляем все IP адреса каждого интерфейса
IP := @TmpPointer.IpAddressList;
repeat
AdaptIndex[kol]:=TmpPointer.Index;
inc(kol);
Adap:=Trim(TmpPointer.Description);
MAC:=Dim2Hex(TmpPointer.Address,TmpPointer.AddressLength);
IPs:=IP.IpAddress.S;
with Form2.ListView1.Items.Add do
begin
Caption:=IntToStr(kol);
SubItems.Add(Adap);
SubItems.Add(MAC);
SubItems.Add(IPs);
end;
IP := IP.Next;
until IP = nil;
TmpPointer := TmpPointer.Next;
until TmpPointer = nil;
end;
finally
// Освобождаем занятую память
FreeMem(InterfaceInfo);
end;
end;
end;
procedure SetAdapt(Index: integer);
var
Stat, i: integer;
IfRow: MIB_IFROW;
begin
for i:=0 to kol-1 do
begin
IfRow.dwIndex:=AdaptIndex[i];
if GetIfEntry(@IfRow)=NO_ERROR then
begin
if Index=i then Stat:=MIB_IF_ADMIN_STATUS_UP else Stat:=MIB_IF_ADMIN_STATUS_DOWN;
IfRow.dwAdminStatus:=Stat;
SetIfEntry (@IfRow);
end;
end;
end;
Пример в полной мере рабочий. Но, как я понял, необходимо перед выполнением любых действий, СНАЧАЛА определить устройства(!), потом вручную(!) выбрать и сохранить(!) ГДЕ-то VendorID, и ВОТ ТОЛЬКО(!) потом автоматом выключать или включать сетевую (нужную) плату по запомненному где-то VendorID. Для массового использования не совсем идет...
или в HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}0001 - это и есть сетевухи?
или можно отследить HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\00**\Ndi\Interfaces -параметр LowerRanges=ethernet. Вопросы сами напрашиваются
Отключение сетевого соединения производится посредством отключения соответствующей сетевой платы.
Для этого необходимо с сайта Microsoft списать 'devcon.exe'. Это консольный диспетчер устройств. С его помощью из командной строки можно управлять ВСЕМИ устройствами, в частности и net-адаптерами. Соответственно из вашей программы можно будет просто вызвать эту программу с необходимыми параметрами. Например:
- devcon find =net - выводит список всех сетевых устройств с указанием их VendorID
- devcon disable PCI\VEN_1516* - отключает сетевое устройство с VID=PCI\VEN_1516 - это у меня сетевуха Surecom (написано для примера)
- devcon enable PCI\VEN_1516* - включает оное
- devcon find pci\* - выводит все найденные устройства PCI
- devcon rescan - обновляет список устройств PnP
ну и так далее
На Delphi это выглядит так:
procedure TForm1.DisableAdapter;
var S: string;
begin
S:='devcon.exe disable PCI\VEN_1516*';
WinExec(pchar(S),SW_HIDE);
end;
procedure TForm1.EnableAdapter;
var S: string;
begin
S:='devcon.exe enable PCI\VEN_1516*';
WinExec(pchar(S),SW_HIDE);
end;
Программным способом VendorID всех сетевых интерфейсов лучше брать в реестре:
По адресу HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\ находится список всех сетевых интерфейсов, установленных на компе. Оттуда нас интересеут параметр "ComponentId" соответствующего соединения (это и есть VendorID). Там же есть имя каждого интерфейса (параметр "DriverDesc"). Надо также обратить внимание на параметр "NetCfgInstanceId" - это GUID данного интерфейса.
Очень часто не требуется отключать интерфейс, так как время отключения, а тем более включение его - это достаточно длительный по времени процесс, зависящий от типа оборудования и настроек сети (может длиться 5-15 сек., но иногда и больше). В таких случаях достаточно просто его заблокировать, а потом разблокировать. При этом соединение есть, но оно не работает. Реакция на изменение состояния возникает сразу. Но это отдельная песня
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.