Взял за основу скрипт gall и немножко переделал.
Получился скрипт на perl
#!/usr/bin/perl
($cgi_script) = ($0 =~ m:(.*)[/\\](.*)[1];
$ip = $ENV{'REMOTE_ADDR'};
$url = 'http://' . $ENV{'HTTP_HOST'} . $ENV{'REQUEST_URI'};
$debug = 0;
$addr{'192.168.0.0/24'} = 'one';
$addr{'55.22.207.66'} = 'two';
$addr{'55.22.200.19'} = 'three';
$settings{one}[0] = $ip;
$settings{one}[1] = '255.255.255.0';
$settings{one}[2] = '192.168.0.129';
$settings{one}[3] = '172.16.2.126';
$settings{two}[0] = '';
$settings{two}[1] = '255.255.255.0';
$settings{two}[2] = '192.168.4.129';
$settings{two}[3] = '192.168.4.129';
$settings{three}[0] = '';
$settings{three}[1] = '255.255.255.0';
$settings{three}[2] = '192.168.3.129';
$settings{three}[3] = '192.168.3.129';
$settings{amn}[0] = '';
$settings{amn}[1] = '255.255.255.0';
$settings{amn}[2] = '194.58.162.129';
$settings{amn}[3] = '194.58.162.129';
if($ENV{'REQUEST_METHOD'} eq 'POST') {read STDIN, $query, $ENV{'CONTENT_LENGTH'};}
else {$query = $ENV{'QUERY_STRING'};}
if($query eq '')
{
foreach $net (keys %addr)
{
($op, $mask) = split/\//, $net;
$mask = 32 if ($mask eq '');
$pop = unpack "L", pack "C4", split /\./, $op;
$pip = unpack "L", pack "C4", split /\./, $ip;
$pmask = unpack "L", pack "B32", (1 x $mask);
if (($pip & $pmask) == ($pop & $pmask)) { $now = $addr{$net}; last; }
}
print "Content-type: text/html\n\n";
print qq~
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=cp1251">
<META HTTP-EQUIV="Pragma" CONTENT="No-Cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="No-Cache,Must-Revalidate,No-Store">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<title>Автоматическая настройка подключения</title>
<script>
function checkform()
{
if(settings.ip.value=="")
{
alert("Введите IP-адрес")
return false;
}
if(settings.mask.value=="")
{
alert("Введите маску подсети")
return false;
}
if(settings.gate.value=="")
{
alert("Введите основной шлюз")
return false;
}
if(settings.dns.value=="")
{
alert("Введите Предпочитаемый DNS-сервер")
return false;
}
return true;
}
</script>
</head>
<body bgcolor="#6696bc">
<center>
<h2>Создание файла автоматической настройки подключения к локальной сети</h2>
<h3>Внимание: файл настройки будет сохранять те значения, которые вы укажете сейчас.<br>Поэтому, пожалуйста, заполняйте поля внимательно.<br>Файл настройки работает для Windows NT/9x/XP/2000/2003.</h3>
<FORM name="settings" ACTION="$cgi_script" METHOD="POST" onsubmit="return checkform()">
<table border="0" cellspacing="0" cellpadding="5" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<tr><td align=right>IP-адрес: <td><INPUT name="ip" type=text size=15 maxlength=15 value="$settings{$now}[0]"></td></tr>
<tr><td align=right>Маска подсети: <td><INPUT name="mask" type=text size=15 maxlength=15 value="$settings{$now}[1]"></td></tr>
<tr><td align=right>Основной шлюз: <td><INPUT name="gate" type=text size=15 maxlength=15 value="$settings{$now}[2]"></td></tr>
<tr><td align=right>Предпочитаемый DNS-сервер: <td><INPUT name="dns" type=text size=15 maxlength=15 value="$settings{$now}[3]"></td></tr>
<tr><td align=right><INPUT type=reset value="по умолчанию"> <td><input type=submit value=' скачать '></td></tr>
</table>
</FORM>
<a href="$cgi_script">обновить</a></center></font><br></body></html>
~;
}
else
{
@pairs = split(/&/, $query);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/<([^>]|\n)*>//g;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<([^>]|\n)*>//g;
$p{$name} = $value;
}
$filename = "settings $p{ip}.vbs";
$file = qq~
Option Explicit
On Error Resume Next
Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim strGateway
Dim strGatewayMetric
Dim strAddress
Dim strIPAddress
Dim strSubnetMask
Dim colNetAdapters
Dim errEnable
Dim errGateways
Dim objShell
Dim intValue
Dim Button
Dim arrNewDNSServerSearchOrder
Dim colNicConfigs
Dim objNicConfig
Dim strDNSServer
Dim intSetDNSServers
Dim strMask
Dim strGate
Dim strDns
strComputer = "."
strAddress = ("$p{ip}")
strMask = ("$p{mask}")
strGate = ("$p{gate}")
strDns = ("$p{dns}")
strIPAddress = Array(strAddress)
strSubnetMask = Array(strMask)
strGateway = Array(strGate)
strGatewayMetric = Array(1)
arrNewDNSServerSearchOrder = Array(strDns)
Button = MsgBox ("Сейчас вам будет предложено применить настройки к каждой сетевой карте из имеющихся в системе." & vbCRLF & _
"Нажмите ''Ok'' для той сетевой карты, которую нужно настроить." & vbCRLF & _
"Для остальных карточек нажимайте ''Нет''." & vbCRLF & _
"Нажмите ''Отмена'', если хотите выйти." & vbCRLF & _
"Перед тем, как нажать кнопку ''Ok'' убедитесь, что подключение к локальной сети включено и сетевой кабель вставлен в сетевую карту." & vbCRLF & _
"Без этих условий настройки не сохранятся." & vbCRLF & vbCRLF & _
"Применяемые настройки: " & vbCRLF & _
"IP: " & strAddress & vbCRLF & _
"Маска: " & strMask & vbCRLF & _
"Шлюз: " & strGate & vbCRLF & _
"DNS: " & strDns & vbCRLF, vbOKOnly + vbInformation, "Настройка подключения")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\\\" & strComputer & "\\root\\cimv2")
Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled = TRUE")
for Each objNetAdapter in colNetAdapters
Button = MsgBox ("Сетевая карта: " & vbCRLF & objNetAdapter.Caption & vbCRLF & vbCRLF & _
"Сохранять настройки для неё?" & vbCRLF & _
"Ок - сохранение настроек, Нет - нет, Отмена - выход", vbYesNoCancel + vbQuestion, "Сохранение настроек")
If Button = vbYes Then
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
intSetDNSServers = objNetAdapter.SetDNSServerSearchOrder(arrNewDNSServerSearchOrder)
If errEnable = 0 Then
Button = MsgBox ("IP изменен на: " & strAddress & vbCRLF & _
"Маска изменена на: " & strMask & vbCRLF & _
"Шлюз изменен на: " & strGate & vbCRLF & _
"DNS изменен на: " & strDns & vbCRLF & vbCRLF & "Для сетевой карты: " & vbCRLF & objNetAdapter.Caption, _
vbOKOnly + vbInformation, "Сохранение настроек")
Else
Button = MsgBox ("Ошибка. Некорректные настройки, скачайте файл настройки заново." & vbCRLF & _
"Файл настройки можно скачать по адресу:" & vbCRLF & _
"$url", vbOKOnly + vbCritical, "Ошибка настройки")
End If
End If
if Button = vbCancel Then
WScript.Quit
End if
Next
WScript.Quit
~;
print "Content-type: application/vbs\r\nContent-disposition: attachment; filename=\"$filename\"\r\n\r\n";
@a = split /\n/, $file;
$, = "\r\n";
foreach $b (@a)
{
chomp $b;
chomp $b;
print "$b\r\n";
}
}
Который, будучи скормленным веб серверу, будет выдавать страничку.
На страничке можно написать ип, маску, шлюз, днс и нажать кнопку "скачать".
Кроме того, скрипт пытается по ИП адресу зашедшего на страничку определить и подставить его параметры.
У меня они описаны в начале скрипта.
Но так же можно указывать любые параметры.
В результате нажатия кнопки "скачать" на ваш компьютер сохранится vbs файл с этими настройками.
Файл будет примерно такой:
Option Explicit
On Error Resume Next
Dim objWMIService
Dim objNetAdapter
Dim strComputer
Dim strGateway
Dim strGatewayMetric
Dim strAddress
Dim strIPAddress
Dim strSubnetMask
Dim colNetAdapters
Dim errEnable
Dim errGateways
Dim objShell
Dim intValue
Dim Button
Dim arrNewDNSServerSearchOrder
Dim colNicConfigs
Dim objNicConfig
Dim strDNSServer
Dim intSetDNSServers
Dim strMask
Dim strGate
Dim strDns
strComputer = "."
strAddress = ("192.168.0.5")
strMask = ("255.255.255.0")
strGate = ("192.168.0.129")
strDns = ("172.16.2.126")
strIPAddress = Array(strAddress)
strSubnetMask = Array(strMask)
strGateway = Array(strGate)
strGatewayMetric = Array(1)
arrNewDNSServerSearchOrder = Array(strDns)
Button = MsgBox ("Сейчас вам будет предложено применить настройки к каждой сетевой карте из имеющихся в системе." & vbCRLF & _
"Нажмите ''Ok'' для той сетевой карты, которую нужно настроить." & vbCRLF & _
"Для остальных карточек нажимайте ''Нет''." & vbCRLF & _
"Нажмите ''Отмена'', если хотите выйти." & vbCRLF & _
"Перед тем, как нажать кнопку ''Ok'' убедитесь, что подключение к локальной сети включено и сетевой кабель вставлен в сетевую карту." & vbCRLF & _
"Без этих условий настройки не сохранятся." & vbCRLF & vbCRLF & _
"Применяемые настройки: " & vbCRLF & _
"IP: " & strAddress & vbCRLF & _
"Маска: " & strMask & vbCRLF & _
"Шлюз: " & strGate & vbCRLF & _
"DNS: " & strDns & vbCRLF, vbOKOnly + vbInformation, "Настройка подключения")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled = TRUE")
for Each objNetAdapter in colNetAdapters
Button = MsgBox ("Сетевая карта: " & vbCRLF & objNetAdapter.Caption & vbCRLF & vbCRLF & _
"Сохранять настройки для неё?" & vbCRLF & _
"Ок - сохранение настроек, Нет - нет, Отмена - выход", vbYesNoCancel + vbQuestion, "Сохранение настроек")
If Button = vbYes Then
errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)
errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)
intSetDNSServers = objNetAdapter.SetDNSServerSearchOrder(arrNewDNSServerSearchOrder)
If errEnable = 0 Then
Button = MsgBox ("IP изменен на: " & strAddress & vbCRLF & _
"Маска изменена на: " & strMask & vbCRLF & _
"Шлюз изменен на: " & strGate & vbCRLF & _
"DNS изменен на: " & strDns & vbCRLF & vbCRLF & "Для сетевой карты: " & vbCRLF & objNetAdapter.Caption, _
vbOKOnly + vbInformation, "Сохранение настроек")
Else
Button = MsgBox ("Ошибка. Некорректные настройки, скачайте файл настройки заново." & vbCRLF & _
"Файл настройки можно скачать по адресу:" & vbCRLF & _
"http://elizovo.ru/cgi-bin/settings.cgi", vbOKOnly + vbCritical, "Ошибка настройки")
End If
End If
if Button = vbCancel Then
WScript.Quit
End if
Next
WScript.Quit
Файл выдает различные информационные сообщения.
И что самое главное, при переборе сетевых адаптеров каждый раз спрашивает, применять ли настройки.
Таким образом можно явно указать, для какой сетевухи сохранять параметры.
У меня в сети используется один DNS сервер, поэтому и подставляется один.
Но для двух серверов файл переписать нетрудно.
2Флэшмобер:
Имена всех интерфейсов не нужны.
Нужны только те, у которых есть TCP/IP прооткол.
Как я понял из доков, это легко делается через WMI.
Вот пример кода, реализующего это:
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled = TRUE")
И потом перебирая адаптеры из colNetAdapters.... )
Опытным путем было установлено, что такой запрос показывает только включенные адаптеры.
И ещё просьба - если будете делать инсталлятор, оставьте место для программ типа inetaccess или wintray.
Получится первосортная программа типа "Установка интернета на компьютер".