Показать полную графическую версию : [решено] работа с диапазонами ip адресов
Задача такая:
1. Выяснить IP адрес машины, на которой запущен скрипт.
2. В зависимости от того, в какой диапазон IP попадает машина выполнить определённую команду.
Пример:
Комп. с IP попадающим в диапазон [192.168.10.1-192.168.10.29] При выполнении скрипта отрабатывается команда net use z: \\192.168.10.10\share
Комп. с IP попадающим в диапазон [192.168.10.30-192.168.10.59] При выполнении скрипта отрабатывается команда net use z: \\192.168.10.40\share
И т.д.
Подскажите что почитать, или как примерно сделать :)
Подскажите что почитать »
Help!
Пример:
Комп. с IP попадающим в диапазон [192.168.10.1-192.168.10.29] При выполнении скрипта отрабатывается команда net use z: \\192.168.10.10\share
Комп. с IP попадающим в диапазон [192.168.10.30-192.168.10.59] При выполнении скрипта отрабатывается команда net use z: \\192.168.10.40\share »
$aIP = StringSplit(@IPAddress1, '.')
$ip_last = $aIP[$aIP[0]]
If $ip_last <= 29 AND $ip_last >= 1 Then
Run('net use z: \\192.168.10.10\share')
ElseIf $ip_last >=30 AND $ip_last <=59 Then
Run('net use z: \\192.168.10.40\share')
EndIf
Help! »
И не поспоришь :)
За код спасибо!!!
Через _VersionCompare надёжнее:
#include <Misc.au3>
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) _IPAddressIsInRange("192.168.10.1 - 192.168.10.29") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)("net use z: \\192.168.10.10\share", "", @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_HIDE))
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) _IPAddressIsInRange("192.168.10.30 - 192.168.10.59") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Run (http://www.autoitscript.com/autoit3/docs/functions/Run.htm)("net use z: \\192.168.10.40\share", "", @SW_HIDE (http://www.autoitscript.com/autoit3/docs/macros.htm#@SW_HIDE))
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _IPAddressIsInRange($sRange_IPs, $sIPAddress = @IPAddress1 (http://www.autoitscript.com/autoit3/docs/macros.htm#@IPAddress1))
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($sRange_IPs, "-") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aSplit = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)(StringStripWS (http://www.autoitscript.com/autoit3/docs/functions/StringStripWS.htm)($sRange_IPs, 8), "-")
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sIP_Range_1 = $aSplit[1]
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sIP_Range_2 = $aSplit[2]
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) (_VersionCompare($sIPAddress, $sIP_Range_1) >= 0 And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) _VersionCompare($sIPAddress, $sIP_Range_2) <= 0)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
ну и еще вариант UDF - с расширенным контролем ошибок:
If _IPAddressIsInRange("192.168.10.1", "192.168.10.29") Then
Run("net use z: \\192.168.10.10\share", "", @SW_HIDE)
EndIf
If _IPAddressIsInRange("192.168.10.30", "192.168.10.59") Then
Run("net use z: \\192.168.10.40\share", "", @SW_HIDE)
EndIf
Func _IPAddressIsInRange($sIP_Low, $sIP_High, $sIP = @IPAddress1)
Local $iIP_Low = DllCall("Ws2_32.dll", "dword", "inet_addr", "str", $sIP_Low)
Local $iIP_High = DllCall("Ws2_32.dll", "dword", "inet_addr", "str", $sIP_High)
Local $iIP = DllCall("Ws2_32.dll", "dword", "inet_addr", "str", $sIP)
; Меняем порядок байтов на обратный
$iIP_Low = BitRotate(BitRotate(BitRotate($iIP_Low[0],8,"W"),16,"D"),8,"W")
$iIP_High = BitRotate(BitRotate(BitRotate($iIP_High[0],8,"W"),16,"D"),8,"W")
$iIP = BitRotate(BitRotate(BitRotate($iIP[0],8,"W"),16,"D"),8,"W")
; Контроль ошибок
If $iIP_Low = -1 Then Return SetError(1, 1, False) ; Ошибка в 1-м параметре
If $iIP_High = -1 Then Return SetError(1, 2, False) ; Ошибка во 2-м параметре
If $iIP = -1 Then Return SetError(1, 3, False) ; Ошибка в 3-м параметре
Return ($iIP >= $iIP_Low) And ($iIP <= $iIP_High)
EndFunc ;==> _IPAddressIsInRange()
Creat0R, amel27,
Если я правильно понял в первом примере используется дополнительный модуль: #include <Misc.au3> а во втором примере его нет, это ошибка или так задуманно ?
А можно немного подробнее описать Функцию _IpAddressIsRange, если есть время :)
На самом деле, диапазонов намного больше, кроме того, оказывается различны даже подсети, т.е.
примерно так: 192.168.106.0; 192.168.65.0; 192.168.47.0 и т.д. это имеет значения в алгоритме работы Функции ?
И ещё, где можно свежую справку скачать, я раньше пользовался справкой версии 3.2.5.4, сейчас версия 3.3.1.3, или там не много изменений ?
а во втором примере его нет »
это не просто примеры - это разные функции (UDF), в одном требуется, в другом - нет
это имеет значения в алгоритме работы Функции »
нет, проверяется только вхождение в интервал
можно немного подробнее описать Функцию _IpAddressIsRange »
только по своему варианту:
- API ф-ция inet_addr из Ws2_32.dll преобразует адрес в целое число (4 байта), где каждый байт отвечает за один октет;
- порядок байтов в полученном значении обратный: младший байт отвечает за старший октет и т.д., поэтому перед сравнением порядок байтов нужно "перевернуть", чтобы вес октета соответствовал весу байта;
- после этого операция сравнения адресов идентична сравнению целых чисел;
- кроме прочего inet_addr проверяет корректность IP адреса, выдавая ошибку на адреса типа "300.1.1.1"
Благодарю за помощь! Всё работает !
Скажите пожалуйста, что за аббревиатура UDF ?
И я пошел учится (http://autoit-script.ru)
что за аббревиатура UDF »
UDF (User Defined Function) - определенная пользователем функция (через Func/EndFunc)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.