1 (изменено: Eduard, 2015-09-16 21:41:07)

Тема: AHK: Сканер локальной сети, получение IP устройств

Интересуюсь быстрым методом получения IP всех устройств, что находятся в локальной сети. Может кто нибудь писал подобный скрипт или знает удобную утилиту?

2

Re: AHK: Сканер локальной сети, получение IP устройств

Утилит по-любому много есть удобных. Пример.

3

Re: AHK: Сканер локальной сети, получение IP устройств

Необходима утилита желательно без GUI, что нибудь миниатюрное с консольным интерфейсом – мне же необходимо использовать найденные IP в скрипте.

4

Re: AHK: Сканер локальной сети, получение IP устройств

Пока что написал такой костыль:

#NoEnv

; check all adress
c:= 100 ; beg value
Loop, 15
{
    Run, % "ping -n 1 -w 100 -l 1 192.168.1." c++, , hide
    Sleep 15
}
Sleep 200
;~ ExitApp

RunCon(ComSpec, "arp -a", a)
S:= MatchStr(a, "192.168.1.")
Loop, parse, S, `n ,`r
{
    if mac:= GetMac(A_LoopField)
        g.= mac "`n"
}
MsgBox, % "s = " s "_`n" "g = " g "_`n"  ; WWatch
ExitApp

GetMac(ByRef Line)
{
    Loop, Parse, Line
        if (A_LoopField = "-")
        {
            k:= 0, Begp:= p:= A_Index
            While (SubStr(Line, p+= 3, 1) = "-")
                k++
            if (k = 4) ; 5 in row
                return Substr(Line, Begp - 2,  17)
        }
    return ""
}

MatchStr(Str, ByRef pat){
    Loop, Parse, Str,`n,`r
    {
        if instr(A_LoopField, pat)
            NStr.= A_LoopField "`n"
    }
    return NStr
}
#0::ExitApp
f12::Run, % "C:\Program Files\AutoHotkey\SciTE\SciTE.exe " """" A_ScriptFullPath """"

RunCon(CmdLine, Input, ByRef Output)
{
    static BufSizeChar := 1024, hParent := 0
    static Show := 0, Flags := 0x101  ; STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW
    static Buf, BufSizeByte, ProcessInfo, StartupInfo, PipeAttribs
    static piSize, siSize, paSize, flOffset, shOffset, ihOffset
    static inOffset, outOffset, errOffset, thrOffset
    If (!hParent) {
        BufSizeByte := A_IsUnicode ? BufSizeChar * 2 : BufSizeChar
        If (A_PtrSize = 8) {
            piSize := 24, siSize := 104, paSize = 24
            flOffset := 60, shOffset := 64, ihOffset := 16
            inOffset := 80, outOffset := 88, errOffset := 96
            thrOffset := 8
        }
        Else {
            piSize := 16, siSize := 68, paSize = 12
            flOffset := 44, shOffset := 48, ihOffset := 8
            inOffset := 56, outOffset := 60, errOffset := 64
            thrOffset := 4
        }
        VarSetCapacity(Buf, BufSizeByte, 0),    VarSetCapacity(ProcessInfo, piSize, 0)
        VarSetCapacity(StartupInfo, siSize, 0), VarSetCapacity(PipeAttribs, paSize, 0)
        NumPut(siSize, StartupInfo, 0, "uint"), NumPut(Flags, StartupInfo, flOffset, "uint")
        NumPut(Show, StartupInfo, shOffset, "ushort")
        NumPut(paSize, PipeAttribs, 0, "uint"), NumPut(1, PipeAttribs, ihOffset, "int")
        hParent := DllCall("GetCurrentProcess", "ptr")
    }
    DllCall("CreatePipe", "ptr *", hRead1_tmp, "ptr *", hWrite2
                        , "ptr", &PipeAttribs, "uint", 0)
    DllCall("CreatePipe", "ptr *", hRead2, "ptr *", hWrite1_tmp
                        , "ptr", &PipeAttribs, "uint", 0)

    NumPut(hRead2,  StartupInfo, inOffset, "ptr") 
    NumPut(hWrite2, StartupInfo, outOffset, "ptr")
    NumPut(hWrite2, StartupInfo, errOffset, "ptr")
    
    DllCall("DuplicateHandle", "ptr", hParent, "ptr", hRead1_tmp
                             , "ptr", hParent, "ptr *", hRead1
                             , "uint", 0, "uint", 0
                             , "uint", 2)    ; DUPLICATE_SAME_ACCESS
    DllCall("CloseHandle", "ptr", hRead1_tmp)
    DllCall("DuplicateHandle", "ptr", hParent, "ptr", hWrite1_tmp
                             , "ptr", hParent, "ptr *", hWrite1
                             , "uint", 0, "uint", 0
                             , "uint", 2)
    DllCall("CloseHandle", "ptr", hWrite1_tmp)
    
    DllCall("ExpandEnvironmentStrings", "str", CmdLine, "str", Buf, "uint", BufSizeChar)
    CmdLine := Buf
    Ret := DllCall("CreateProcess", "ptr", 0, "str", CmdLine, "ptr", 0, "ptr", 0
                                  , "uint", 1, "uint", 0, "ptr", 0, "ptr", 0
                                  , "ptr", &StartupInfo, "ptr", &ProcessInfo)
    If (!Ret) {
        MsgBox,, %A_ThisFunc%, Не удалось создать процесс.
        Output := ""
        Return 1
    }
    hChild := NumGet(ProcessInfo, 0, "ptr")
    DllCall("CloseHandle", "ptr", NumGet(ProcessInfo, thrOffset, "ptr"))
    DllCall("CloseHandle", "ptr", hRead2)
    DllCall("CloseHandle", "ptr", hWrite2)
    If (Input) {
        InLen := StrLen(Input) + 2
        VarSetCapacity(InBuf, InLen, 0)
        StrPut(Input . "`r`n", &InBuf, "cp866")
        DllCall("WriteFile", "ptr", hWrite1, "ptr", &InBuf, "uint", InLen
                           , "uint *", BytesWritten, "uint", 0)
    }
    DllCall("CloseHandle", "ptr", hWrite1)
    Output := ""
    Loop {
        If not DllCall("ReadFile", "ptr", hRead1, "ptr", &Buf, "uint", BufSizeByte
                                 , "uint *", BytesRead, "uint", 0)
            Break
        NumPut(0, Buf, BytesRead, "Char")
        Output .= StrGet(&Buf, "cp866")
    }
    DllCall("CloseHandle", "ptr", hRead1)
    DllCall("GetExitCodeProcess", "ptr", hChild, "int *", ExitCode)
    DllCall("CloseHandle", "ptr", hChild)
    Return ExitCode
}

5

Re: AHK: Сканер локальной сети, получение IP устройств

Вот здесь лежит пинг функция реализована через DllCall:
http://www.autohotkey.com/board/topic/4 … ly-a-ping/
Каким образом из структуры которую возвращает ping(...) функция получить время отклика?

res := ping("192.168.1.101")            ; ping the selected host
rt := NumGet(res+0, 8, "UInt")            ; get reply time [ms]
MsgBox, % "`nrt = " rt "_`n" 

Этот код возвращает 0 при том что res имеет не нулевое значение и постоянно меняется.

6

Re: AHK: Сканер локальной сети, получение IP устройств

А в виде чего должна удобная утилита выдавать результат?