Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] работа с диапазонами ip адресов (http://forum.oszone.net/showthread.php?t=158205)

Dump 25-11-2009 16:29 1279608

работа с диапазонами 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

И т.д.

Подскажите что почитать, или как примерно сделать :)

kaster 25-11-2009 17:00 1279638

Цитата:

Цитата Dump
Подскажите что почитать »

Help!
Цитата:

Цитата Dump
Пример:
Комп. с 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


Dump 25-11-2009 21:15 1279827

Цитата:

Цитата kaster
Help! »

И не поспоришь :)
За код спасибо!!!

Creat0R 25-11-2009 22:39 1279868

Через _VersionCompare надёжнее:

Код:

#include <Misc.au3>

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($sRange_IPs, $sIPAddress = @IPAddress1)
    If Not StringInStr($sRange_IPs, "-") Then Return SetError(1, 0, 0)

    Local $aSplit = StringSplit(StringStripWS($sRange_IPs, 8), "-")
    Local $sIP_Range_1 = $aSplit[1]
    Local $sIP_Range_2 = $aSplit[2]

    Return (_VersionCompare($sIPAddress, $sIP_Range_1) >= 0 And _VersionCompare($sIPAddress, $sIP_Range_2) <= 0)
EndFunc


amel27 26-11-2009 05:57 1280044

ну и еще вариант 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()


Dump 26-11-2009 07:58 1280075

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, или там не много изменений ?

amel27 26-11-2009 09:27 1280114

Цитата:

Цитата Dump
а во втором примере его нет »

это не просто примеры - это разные функции (UDF), в одном требуется, в другом - нет

Цитата:

Цитата Dump
это имеет значения в алгоритме работы Функции »

нет, проверяется только вхождение в интервал

Цитата:

Цитата Dump
можно немного подробнее описать Функцию _IpAddressIsRange »

только по своему варианту:

- API ф-ция inet_addr из Ws2_32.dll преобразует адрес в целое число (4 байта), где каждый байт отвечает за один октет;
- порядок байтов в полученном значении обратный: младший байт отвечает за старший октет и т.д., поэтому перед сравнением порядок байтов нужно "перевернуть", чтобы вес октета соответствовал весу байта;
- после этого операция сравнения адресов идентична сравнению целых чисел;
- кроме прочего inet_addr проверяет корректность IP адреса, выдавая ошибку на адреса типа "300.1.1.1"

Dump 26-11-2009 10:07 1280139

Благодарю за помощь! Всё работает !

Скажите пожалуйста, что за аббревиатура UDF ?
И я пошел учится

amel27 26-11-2009 10:24 1280154

Цитата:

Цитата Dump
что за аббревиатура UDF »

UDF (User Defined Function) - определенная пользователем функция (через Func/EndFunc)


Время: 09:35.

Время: 09:35.
© OSzone.net 2001-