Необходимо добавить постоянный маршрут в этих системах. Под информации MSDN данные заносятся в раздел реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip \Parameters\PersistentRoutes
Решил проверить на виртуальной машине результат работы системной программы Route. Были созданы ключи:
HKLM\SYSTEM\ControlSet001\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc}\16\00000000ac1000000c00000000000000000000000000000000000000000000000000000000000000c0a8be0200000000: FF FF FF FF FF FF FF FF FF FF FF FF 01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters\PersistentRoutes\172.16.0.0,255.240.0.0,192.168.190.2,1: ""
HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc}\16\00000000ac1000000c00000000000000000000000000000000000000000000000000000000000000c0a8be0200000000: FF FF FF FF FF FF FF FF FF FF FF FF 01 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes\172.16.0.0,255.240.0.0,192.168.190.2,1: ""
Если выполнить команду route print, то при удаленных ветках HKLM\SYSTEM\ControlSet001\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc} и HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc}, постоянных маршрутов не будет. Значит толку от веток PersistentRoutes нет.
Что это может быть? GUID сетевого адаптера? Но если извлечь информацию через GetAdaptersInfo, там другой GUID.
Здравствуйте, Мельников Максим Викторович, Вы писали:
ММВ>Необходимо добавить постоянный маршрут в этих системах. Под информации MSDN данные заносятся в раздел реестра:
А
IP Helper не поможет?
http://msdn.microsoft.com/en-us/library/Aa365860 и т.д. по ссылкам..
Здравствуйте, MTimur, Вы писали:
MT>http://msdn.microsoft.com/en-us/library/Aa365860 и т.д. по ссылкам..
Извиняюсь.. то ли руки кривые, то ли лыжи...
Правильная ссылка
Здравствуйте, MTimur, Вы писали:
MT>Правильная ссылка
Я как раз добавляю маршрут через CreateIpForwardEntry. Проблема в том, что для сохранения постоянности маршрута, его нужно записывать в реестр, иначе после перезагрузки в таблице маршрутов в системе такого маршрута не будет. В Windows 2000 и Windows XP все нормально, но всякие висты и семерки всю малину портят, а ведь на них сейчас активно пересаживаются пользователи. Что-то гугл на китайских сайтах находит про eb004a00-9b1a-11d4-9123-0050047759bc, там я так понял дизассемблировали iphlpapi.dll, но я ничего не понял даже с переводчиком к какому решению там пришли и что за дела там такие. =)
Здравствуйте, Maks1509, Вы писали:
M>Здравствуйте, MTimur, Вы писали:
MT>>Правильная ссылка
M>Я как раз добавляю маршрут через CreateIpForwardEntry. Проблема в том, что для сохранения постоянности маршрута, его нужно записывать в реестр, иначе после перезагрузки в таблице маршрутов в системе такого маршрута не будет. В Windows 2000 и Windows XP все нормально, но всякие висты и семерки всю малину портят, а ведь на них сейчас активно пересаживаются пользователи. Что-то гугл на китайских сайтах находит про eb004a00-9b1a-11d4-9123-0050047759bc, там я так понял дизассемблировали iphlpapi.dll, но я ничего не понял даже с переводчиком к какому решению там пришли и что за дела там такие. =)
Не совсем понятно, что не работает именно в висте.
Не сохраняется маршрут? — Тогда
здесь:
MIB_IPPROTO_NETMGMT
A static route. This value is used to identify route information for IP routing set through network management such as the Dynamic Host Configuration Protocol (DCHP), the Simple Network Management Protocol (SNMP), or by calls to the CreateIpForwardEntry, DeleteIpForwardEntry, or SetIpForwardEntry functions.
Или CreateIpForwardEntry с ошибкой отрабатывает? — Тогда там и искать ошибку, например, вот такая "мелочь" может быть:
On Windows Vista and Windows Server 2008, the route metric specified in the dwForwardMetric1 member of the MIB_IPFORWARDROW structure represents a combination of the route metric added to the interface metric specified in the Metric member of the MIB_IPINTERFACE_ROW structure of the associated interface. So the dwForwardMetric1 member of the MIB_IPFORWARDROW structure should be equal to or greater than Metric member of the associated MIB_IPINTERFACE_ROW structure. If an application would like to set the route metric to 0, then the dwForwardMetric1 member of the MIB_IPFORWARDROW structure should be set equal to the value of the interface metric specified in the Metric member of the associated MIB_IPINTERFACE_ROW structure. An application can retrieve the interface metric by calling the GetIpInterfaceEntry function.
Если не ошибаюсь, этот самый dwForwardMetric1 должен быть не меньше
магической 10.
Здравствуйте, MTimur, Вы писали:
MT>Не совсем понятно, что не работает именно в висте.
MT>Не сохраняется маршрут? — Тогда здесь:
MT>MIB_IPPROTO_NETMGMT
MT>A static route. This value is used to identify route information for IP routing set through network management such as the Dynamic Host Configuration Protocol (DCHP), the Simple Network Management Protocol (SNMP), or by calls to the CreateIpForwardEntry, DeleteIpForwardEntry, or SetIpForwardEntry functions.
MT>Или CreateIpForwardEntry с ошибкой отрабатывает? — Тогда там и искать ошибку, например, вот такая "мелочь" может быть:
MT>On Windows Vista and Windows Server 2008, the route metric specified in the dwForwardMetric1 member of the MIB_IPFORWARDROW structure represents a combination of the route metric added to the interface metric specified in the Metric member of the MIB_IPINTERFACE_ROW structure of the associated interface. So the dwForwardMetric1 member of the MIB_IPFORWARDROW structure should be equal to or greater than Metric member of the associated MIB_IPINTERFACE_ROW structure. If an application would like to set the route metric to 0, then the dwForwardMetric1 member of the MIB_IPFORWARDROW structure should be set equal to the value of the interface metric specified in the Metric member of the associated MIB_IPINTERFACE_ROW structure. An application can retrieve the interface metric by calling the GetIpInterfaceEntry function.
MT>Если не ошибаюсь, этот самый dwForwardMetric1 должен быть не меньше магической 10.
Все превосходно сохраняется в таблице маршрутизации, но добавленный маршрут существует до первой перезагрузки. Временным решением проверяю версию системы и если dwMajorVersion соответствует вистовскому или семерочному, просто запускаю системный route.exe. Впринципе код полноценно работоспособен и на этих системах, но он бесполезен без ключей HKLM\SYSTEM\ControlSet001\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc}\16 и HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{eb004a00-9b1a-11d4-9123-0050047759bc}\16, ведь только по ним система определяет маршруты как постоянные.
function CreateForwardEntry(pszDest, pszMask, pszHop: WideString): DWORD;
const
fmtLine: WideString = 'route ADD %s MASK %s %s -P';
fmtSkey: WideString = '%s,%s,%s,1';
fmtHkey: WideString = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\PersistentRoutes';
var
pszText : WideString;
si : TStartupInfoW;
pi : TProcessInformation;
dwError : DWORD;
//
pRoute : MIB_IPFORWARDROW;
dwIndex : DWORD;
dwMetric: DWORD;
//
regKey : HKEY;
cbData : DWORD;
Dispos : DWORD;
//
dwDest : IPAddr;
dwMask : IPAddr;
dwHop : IPAddr;
begin
Result := ERROR_INVALID_FUNCTION;
// в системах Windows Vista и Windows 7 теперь необходимо добавлять двоичные
// данные в ключ (не сохраняется постоянный маршрут):
// HKLM\SYSTEM\CurrentControlSet\Control\Nsi\{GUID}\16\<binary value>
// http://support.microsoft.com/kb/2011762
// временное решение - запускаем системное приложение route.exe и проверяем
// код выхода процесса.
if (osvi.dwMajorVersion >= 6) then
begin
pszText := FormatW(fmtLine, [pszDest, pszMask, pszHop]);
ZeroMemory(@si, SizeOf(TStartupInfoW));
with si do
begin
cb := SizeOf(TStartupInfoW);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;
end;
if CreateProcessW(nil, LPWSTR(pszText), nil, nil, FALSE, 0, nil, nil, si, pi) then
begin
WaitforSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, Result);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;
end
else
begin
dwDest := inet_addr(LPTSTR(WideStringToAnsi(pszDest, CP_ACP)));
dwMask := inet_addr(LPTSTR(WideStringToAnsi(pszMask, CP_ACP)));
dwHop := inet_addr(LPTSTR(WideStringToAnsi(pszHop, CP_ACP)));
dwIndex := DWORD(-1);
try
dwError := GetBestInterface(dwDest, dwIndex);
if (dwError = ERROR_SUCCESS) then
begin
if (dwIndex <> DWORD(-1)) then
try
dwError := GetBestRoute(dwDest, 0, pRoute);
if (dwError = NO_ERROR) then
try
dwMetric := pRoute.dwForwardMetric1;
ZeroMemory(@pRoute, SizeOf(MIB_IPFORWARDROW));
with pRoute do
begin
dwForwardDest := dwDest;
dwForwardMask := dwMask;
dwForwardPolicy := 0;
dwForwardNextHop := dwHop;
dwForwardIfIndex := dwIndex;
dwForwardType := MIB_IPROUTE_TYPE_DIRECT;
dwForwardProto := PROTO_IP_NETMGMT;
dwForwardAge := 0;
dwForwardNextHopAS := 0;
dwForwardMetric1 := dwMetric;
dwForwardMetric2 := DWORD(-1);
dwForwardMetric3 := DWORD(-1);
dwForwardMetric4 := DWORD(-1);
dwForwardMetric5 := DWORD(-1);
end;
dwError := CreateIpForwardEntry(@pRoute);
if (dwError = NO_ERROR) then
try
cbData := {(lstrlenW(LPWSTR(pszText)) + 1) * SizeOf(WideChar)}2;
pszText := FormatW(fmtSkey, [pszDest, pszMask, pszHop]);
dwError := RegCreateKeyExW(HKEY_LOCAL_MACHINE, LPWSTR(fmtHkey), 0,
nil, REG_OPTION_NON_VOLATILE, KEY_WRITE, nil, regKey, @Dispos);
if (dwError = ERROR_SUCCESS) then
try
dwError := RegSetValueExW(regKey, LPWSTR(pszText), 0, REG_SZ,
LPWSTR(WideString('')), cbData);
Result := dwError;
finally
RegCloseKey(regKey);
end;
finally
end;
except
end;
except
end;
end;
except
end;
end;
end;
Здравствуйте, Maks1509, Вы писали:
M>Здравствуйте, MTimur, Вы писали:
M>Все превосходно сохраняется в таблице маршрутизации, но добавленный маршрут существует до первой перезагрузки.
Тогда
через WMI.
Здравствуйте, MTimur, Вы писали:
MT>Тогда через WMI.
А если служба WMI отключена? Да и миниальная система там Windows XP указана. Способ с запуском route.exe мне кажется тогда более предпочитаемым.