Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  18:06[Войти] | [Зарегистрироваться]
Ответ на вопрос № 33786

20-07-2005 09:30
Здравствуйте Господа программисты!
помогите непрофессионалу - необходимо включать и отключать сетевую плату. Перекопал все "королевство". Хоть в каком направлении копать? Лучше пример. Буду очень признателен.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

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 думаю можно использовать, только правильно параметры задать.

19-05-2006 08:45
А если 2 сетевухи и надо отключить одну, то не один способ не катит.

25-12-2005 05:04 | Сообщение от автора вопроса
devcon.exe отрабатывает действительно корректоно. Единственно в enable и disable командах нужно в строках писать маски УСТРОЙСТВ (DEV_1050), а НЕ ПОСТАВЩИКОВ (VEN_8086*),  к примеру,

devcon.exe disable *DEV_1050* -мне показалось работает корректно

т.к. по вендор (VendorID), к примеру 8086 устройств может быть очень много!

devcon.exe disable PCI\VEN_8086* - выключит все устройства 8086
а это неправильно.

Большое спасибо за ответы. Действительно очень помогли!!!

17-08-2005 13:17
Данный скрипт (.cmd or .bat) автоматом определяет сетевые интерфейсы и устраивает им UP & DOWN

17-08-2005 13:14
Привожу пример скрипта для автоматичекого отключения/включения сетевых интерфейсов

================
@echo off
devcon.exe find =net | FINDSTR /C:"PCI\VEN_" >net.dev
FOR /F "eol=: delims=:,&" %%i in (net.dev) do (
rem           echo %%i
           devcon.exe disable %%i* >nul
           devcon.exe enable %%i* >nul
)
del net.dev
================

21-07-2005 05:18
Чтоб не повторяться, зайди почитай
http://forum.winsov.ru/index.php?showtopic=2618

21-07-2005 05:05
Я объяснил общий подход к решению вопроса. Можно пройти в цикле все подветки (00xx) этого пути в реестре, и запомнить всё что нужно в массивах. Кстати автор "Х" описал как блокировать интерфейс.
Для этого нужно знать его =индекс=. Индекс можно узнать функцией GetAdaptersInfo по соответствию с  GUID - это поле AdapterName записи  IP_ADAPTER_INFO и это же параметр NetCgfInstanceId в реестре). Вот так всё закручено. Я когда разбирался написал для себя демку которая выдаёт список (StringGrid)интерфейсов и может Блок/Разблок. и Откл./Вкл. выбранный интерфейс. Именно так и делал. А к сложностям надо привыкать, если собираешься на Delphi писать программы, каторые для неё не свойственны.

21-07-2005 02:51 | Сообщение от автора вопроса
Здравствуйте! последний пример достаточно сложный... покопаюсь. А вот насчет блокировки трафика без отключения сетевой платы от автора "Orinoko" очень хотелось бы увидеть что-нибудь.  Очень жду. Спасибо за понимание.

21-07-2005 01:01
const
  MAX_ADAPTER_NAME_LENGTH        = 256;
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
  MAX_ADAPTER_ADDRESS_LENGTH    = 8;

  MAX_INTERFACE_NAME_LEN = 256;
  MAXLEN_PHYSADDR = 8;
  MAXLEN_IFDESCR = 256;
  MIB_IF_ADMIN_STATUS_UP = 1;
  MIB_IF_ADMIN_STATUS_DOWN = 2;

  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = record
                      Next: PIP_ADAPTER_INFO;
                      ComboIndex: DWORD;
                      AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
                      Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
                      AddressLength: UINT;
                      Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
                      Index: DWORD;
                      Type_: UINT;
                      DhcpEnabled: UINT;
                      CurrentIpAddress: PIP_ADDR_STRING;
                      IpAddressList: IP_ADDR_STRING;
                      GatewayList: IP_ADDR_STRING;
                      DhcpServer: IP_ADDR_STRING;
                      HaveWins: BOOL;
                      PrimaryWinsServer: IP_ADDR_STRING;
                      SecondaryWinsServer: IP_ADDR_STRING;
                      LeaseObtained: time_t;
                      LeaseExpires: time_t;
                    end;

  PMIB_IFROW = ^MIB_IFROW;
  MIB_IFROW = record
                wszName:array[1..MAX_INTERFACE_NAME_LEN]of WCHAR;
                dwIndex: DWORD;
                dwType: DWORD;
                dwMtu: DWORD;
                dwSpeed: DWORD;
                dwPhysAddrLen: DWORD;
                bPhysAddr:array[1..MAXLEN_PHYSADDR]of BYTE;
                dwAdminStatus: DWORD;
                dwOperStatus: DWORD;
                dwLastChange: DWORD;
                dwInOctets: DWORD;
                dwInUcastPkts: DWORD;
                dwInNUcastPkts: DWORD;
                dwInDiscards: DWORD;
                dwInErrors: DWORD;
                dwInUnknownProtos: DWORD;
                dwOutOctets: DWORD;
                dwOutUcastPkts: DWORD;
                dwOutNUcastPkts: DWORD;
                dwOutDiscards: DWORD;
                dwOutErrors: DWORD;
                dwOutQLen: DWORD;
                dwDescrLen: DWORD;
                bDescr:array[1..MAXLEN_IFDESCR]of BYTE;
              end;


  function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO; var pOutBufLen: ULONG): DWORD; stdcall; external 'IPHLPAPI.dll';
  function GetIfEntry(pIfRow: PMIB_IFROW): DWORD; stdcall; external 'Iphlpapi.dll';
  function SetIfEntry(pIfRow: PMIB_IFROW): DWORD; stdcall; external 'Iphlpapi.dll';


procedure GetAdapt;
var
  InterfaceInfo, TmpPointer: PIP_ADAPTER_INFO;
  IP: PIP_ADDR_STRING;
  Len: ULONG;
  Adap, MAC, IPs: string;

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;


20-07-2005 11:45 | Сообщение от автора вопроса
Пример в полной мере рабочий. Но, как я понял, необходимо перед выполнением любых действий, СНАЧАЛА определить устройства(!), потом вручную(!) выбрать и сохранить(!) ГДЕ-то 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. Вопросы сами напрашиваются

20-07-2005 10:46 | Сообщение от автора вопроса
блокировка - это уже еще более интересно. Пож. опишите, ГДЕ посмотреть и почитать?

20-07-2005 10:35
Как Отключить/Включить сетевое соединение.

Отключение сетевого соединения производится посредством отключения соответствующей сетевой платы.

Для этого необходимо с сайта 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 сек., но иногда и больше). В таких случаях достаточно просто его заблокировать, а потом разблокировать. При этом соединение есть, но оно не работает. Реакция на изменение состояния возникает сразу. Но это отдельная песня

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования