Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.25;
Скачать: CL | DM;

Вниз

Изменить основной шлюз, альтерн. и предпочит ДНС в виндовсе   Найти похожие ветки 

 
DelphiN! ©   (2006-02-06 09:18) [0]

Как изменить САБЖ, и применить изменения сразу, без перезагрузки. Сам ксожадению данную информацию найти не смог :(


 
Rouse_ ©   (2006-02-06 09:43) [1]

Очень просто. Есть такая недокументированная функция в iphlpapi.dll
Выглядит она так:

function SetAdapterIpAddress(szAdapterGUID: PChar; dwDHCP, dwIP, dwMask, dwGateway: DWORD): DWORD; stdcall; external "iphlpapi.dll";

Первый параметр - ГУИД сетевого интерфейса. найти его ты можешь через GetAdaptersInfo. Пример здесь: http://rouse.front.ru/netifenum.zip

дальше идут адрес DHCP сервера, IP адрес и маска подсети которые ты хочешь установить и последним параметром идет шлюз.

Если какойто из параметров менять не хочешь - передавай ноль, если будешь менять, то передавай через inet_addr, к примеру inet_addr("192.168.1.2")

По поводу первого параметра, я не помню, там либо PChar либо PWideChar - поэксперементируй.


 
DelphiN! ©   (2006-02-06 11:57) [2]


>  [1] Rouse_ ©   (06.02.06 09:43)


Спасибо, попробовал, но к сожадению адреса по каким-то причинам не меняются, вот как я это сделал :


const
 MAX_ADAPTER_NAME_LENGTH        = 256;
 MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
 MAX_ADAPTER_ADDRESS_LENGTH     = 8;
 IPHelper = "iphlpapi.dll";

 MIB_IF_TYPE_OTHER     = 1;
 MIB_IF_TYPE_ETHERNET  = 6;
 MIB_IF_TYPE_TOKENRING = 9;
 MIB_IF_TYPE_FDDI      = 15;
 MIB_IF_TYPE_PPP       = 23;
 MIB_IF_TYPE_LOOPBACK  = 24;
 MIB_IF_TYPE_SLIP      = 28;

type
 time_t = Longint;

 IP_ADDRESS_STRING = record
   S: array [0..15] of Char;
 end;
 IP_MASK_STRING = IP_ADDRESS_STRING;
 PIP_MASK_STRING = ^IP_MASK_STRING;

 PIP_ADDR_STRING = ^IP_ADDR_STRING;
 IP_ADDR_STRING = record
   Next: PIP_ADDR_STRING;
   IpAddress: IP_ADDRESS_STRING;
   IpMask: IP_MASK_STRING;
   Context: DWORD;
 end;

 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;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   function GetAdapterGUID: String;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

 function SetAdapterIpAddress(szAdapterGUID: PChar; dwDHCP, dwIP, dwMask, dwGateway: DWORD): DWORD; stdcall; external "iphlpapi.dll";

 function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
   var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 Len: Cardinal;
 strl: TStringList;
begin
 try
   strl := TStringList.Create;
   strl.Text := GetAdapterGUID;
   if strl.Count > 0 then
     SetAdapterIpAddress(PChar(strl.Strings[0]),0,0,inet_addr("255.255.255.0"),inet_addr("198.162.0.147"));
 finally
   strl.Free;
 end;
end;

function TForm1.GetAdapterGUID: String;
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 IP: PIP_ADDR_STRING;
 Len: ULONG;
 AdapterType: String;
begin
 if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then
 begin
   GetMem(InterfaceInfo, Len);
   try
     if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then
     begin
       TmpPointer := InterfaceInfo;
       repeat
         if Result <> "" then
           Result := Result+#13#10;
         Result := Result+TmpPointer^.AdapterName;
         TmpPointer := TmpPointer.Next;
       until TmpPointer = nil;
     end;
   finally
     FreeMem(InterfaceInfo);
   end;
 end;
end;


 
DelphiN! ©   (2006-02-06 12:22) [3]

SetAdapterIpAddress возвращает 68


 
Rouse_ ©   (2006-02-06 13:19) [4]

DHCP клиент должен быть включен в службах, ну и текущай IP третим параметром тоже передай попробуй.


 
piople ©   (2006-02-06 13:33) [5]

А как при этом еще заменить DNS? и альтернативный DNS?


 
DelphiN! ©   (2006-02-06 13:41) [6]

DHCP клиент включен, ИП адрес тоже ставить пробовал, результат тотже :(


 
DelphiN! ©   (2006-02-06 13:50) [7]

В кодах ошибок Windows код 68 соответствует ошибке "Превышен предел по числу имен для локальной сетевой платы компьютера".
Что это значит?


 
Rouse_ ©   (2006-02-06 14:41) [8]

Тэкс, попробуй передать ГУИД просто строкой... Он у тебя должен быть известен:

Вот тут еще посмотри: http://rsdn.ru/Forum/Message.aspx?mid=511834


 
DelphiN! ©   (2006-02-06 15:08) [9]


>  [8] Rouse_ ©   (06.02.06 14:41)


Переустановил драйвера на сетевую карту и все заработало! Странно, а локальная сеть у меня работала без проблемм ... Теперь осталось изменить предпочитаемый и альтернативный ДНС сервер.
Может кто знает как сделать и это?


 
DelphiN! ©   (2006-02-08 14:51) [10]

Функция SetAdapterIpAddress не работает, если на компьютере прописано несколько IP адресов!


 
DelphiN! ©   (2006-02-08 14:51) [11]

Возвращает код 68


 
piople ©   (2006-02-14 05:30) [12]

Что значит - "прописано несколько IP адресов" несколько сетевых карт в машине?


 
Rouse_ ©   (2006-02-14 22:43) [13]


> Что значит - "прописано несколько IP адресов" несколько
> сетевых карт в машине?

за каждой сетевой картой может быть закреплено несколько IP адесов. Добавляются через свойства сетевого подключения...
Матчасть однако... ;)


 
Kuzia   (2006-02-15 15:31) [14]

Нужна аналогичная функция для Win98 (в ип хелпере 98 - SetAdapterIpAddress нет). Собственно даже нужен только способ включить DHCP для определенного интерфейса.



Страницы: 1 вся ветка

Текущий архив: 2006.06.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
15-1149077142
adalx
2006-05-31 16:05
2006.06.25
Вообще-то вопрос по сетям, но мне там не отвечают


3-1145965808
Alpine
2006-04-25 15:50
2006.06.25
Проблемма с UPPER(FIELD) LIKE .... в IB 7.01


2-1149757702
Gamer
2006-06-08 13:08
2006.06.25
Изменение размера выпавшего окна ComboBox


2-1149679048
Кирей
2006-06-07 15:17
2006.06.25
Работа с winexec


2-1149685074
AlexanderMS
2006-06-07 16:57
2006.06.25
Как хранится переменная типа String в памяти.