Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Привет всем. Вот мне надо прописать маршрутизацию программно без всяких консольных извращений. Сразу оговорюсь, на XP работает - ну на своей рабочей системе проверял. Решил проверить на виртуалке, именно на системах 2000 и 7. Что-то вообще не прет там. Ну насчет семерки еще можно догадаться что происходит, но вот 2000. Вроде IP Helper пристуствует судя по MSDN в 2000. На вирртуалке даже под семеркой с запуском там с праваами администратора не прописывается - ну не появляется мой долгожданный мессаджбокс вслучае успешного результата функции. Служба роутинга там включена. Может кто подскажет как оптимальнее учесть все эти виста\семеровские заморочки, особенно с реестром и заодно опробуйте на системах у кого вин2000. Есть сомнения в правильности кода, инфы вообще мало, делал код практически на энтузиазме как мог. Код: program resources; {$APPTYPE CONSOLE} uses Windows, Messages, SysUtils, winsock; type PMIB_IPFORWARDROW = ^MIB_IPFORWARDROW; MIB_IPFORWARDROW = record dwForwardDest : DWORD; dwForwardMask : DWORD; dwForwardPolicy : DWORD; dwForwardNextHop : DWORD; dwForwardIfIndex : DWORD; dwForwardType : DWORD; dwForwardProto : DWORD; dwForwardAge : DWORD; dwForwardNextHopAS: DWORD; dwForwardMetric1 : DWORD; dwForwardMetric2 : DWORD; dwForwardMetric3 : DWORD; dwForwardMetric4 : DWORD; dwForwardMetric5 : DWORD; end; type IPAddr = Cardinal; const iphlpapilib = 'iphlpapi.dll'; function GetBestInterface(dwDestAddr: IPAddr; var pdwBestIfIndex: DWORD): DWORD; stdcall; external iphlpapilib name 'GetBestInterface'; function CreateIpForwardEntry(const pRoute: MIB_IPFORWARDROW): DWORD; stdcall; external iphlpapilib name 'CreateIpForwardEntry'; function RegWriteString(RootKey: HKEY; StrKey, StrName, StrVal: AnsiString): Boolean; var Dispos: DWORD; RegKey: HKEY; vSize : Integer; RegRes: Integer; begin Result := FALSE; vSize := Length(StrVal) + 1; if (vSize < 0) then Exit; RegRes := RegCreateKeyEx(RootKey, PAnsiChar(StrKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, RegKey, @Dispos); if (RegRes <> ERROR_SUCCESS) then Exit; Result := (RegSetValueEx(RegKey, PAnsiChar(StrName), 0, REG_SZ, PAnsiChar(StrVal), vSize) = ERROR_SUCCESS); RegCloseKey(RegKey); end; function CreateIpEntry(Destination, Mask, Gateway: AnsiString): Boolean; const PersistentKey = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes'; var pRoute : MIB_IPFORWARDROW; // структура FuncRes : DWORD; BestIndex: DWORD; // номер интерфейса szRoute : AnsiString; begin Result := FALSE; // сначала подставляем номер интерфейса как -1 и далее через функцию // пытаемся определить лучший индекс интерфейса для маршрута BestIndex := DWORD(-1); FuncRes := GetBestInterface(inet_addr(@GateWay[1]), BestIndex); case FuncRes of // если функция вернула положительный результат, выполняем // следующие действия ERROR_SUCCESS: begin // заполняем структуру MIB_IPFORWARDROW, а также // создаем запись через функцию и проверяем возвращаемый результат // также проверяем значение маски подсети if (Mask = '') then Mask := '255.255.255.255'; ZeroMemory(@pRoute, SizeOf(MIB_IPFORWARDROW)); pRoute.dwForwardDest := inet_addr(@Destination[1]); pRoute.dwForwardMask := inet_addr(@Mask[1]); pRoute.dwForwardPolicy := 0; pRoute.dwForwardNextHop := inet_addr(@Gateway[1]); pRoute.dwForwardIfIndex := BestIndex; pRoute.dwForwardType := 3; pRoute.dwForwardProto := 3; pRoute.dwForwardAge := 0; pRoute.dwForwardNextHopAS := 0; pRoute.dwForwardMetric1 := 1; pRoute.dwForwardMetric2 := DWORD(-1); pRoute.dwForwardMetric3 := DWORD(-1); pRoute.dwForwardMetric4 := DWORD(-1); pRoute.dwForwardMetric5 := DWORD(-1); FuncRes := CreateIpForwardEntry(pRoute); // если функция вернула положительный результат, выполняем // следующие действия case FuncRes of NO_ERROR: begin szRoute := Format('%s,%s,%s,1', [Destination, Mask, Gateway]); Result := RegWriteString(HKEY_LOCAL_MACHINE, PersistentKey, szRoute, ''); end; //ERROR_ACCESS_DENIED, //ERROR_INVALID_PARAMETER, //ERROR_NOT_SUPPORTED:; end; end; //ERROR_NOT_SUPPORTED, //ERROR_CAN_NOT_COMPLETE:; //else // WriteLn(SysErrorMessage(GetLastError)); end; end; begin if CreateIpEntry( '172.16.0.0' , '255.240.0.0' , '172.16.65.1' ) then MessageBox(0, '', '', MB_OK); end. |
|