catcher 发表于 2009-10-1 13:51:18

如何通过IP/mac获取计算机名

本帖最后由 catcher 于 2009-10-1 19:03 编辑

先祝大家国庆快乐!
问了几个群没人回答,只得发贴求助。
在局域网里,如何通过IP/mac获取计算机名。
论坛里有能过IP获取到MAC和计算机名的源码,但我不会拆开。
Amu版主的MAC扫描脚本:
http://www.autoitx.com/forum.php?mod=viewthread&tid=205&highlight=mac
我只想在input里输入某个IP就能获取到计算机名,或输入计算机名得到IP。
_________________________________________________
感谢afan老大,已经搞定。代码详见三楼。

afan 发表于 2009-10-1 17:03:36

我看了下,输入IP返回计算机名应该没问题,一会改好了发上来

afan 发表于 2009-10-1 17:44:50

本帖最后由 afan 于 2009-10-1 18:17 编辑

你试下GUICreate("获取计算机名", 300, 120)
$Label0 = GUICtrlCreateLabel("==============获取计算机名==============", 24, 10, 280, 17)
$Label1 = GUICtrlCreateLabel("请输入IP地址:", 24, 32, 90, 17)
$Input1 = GUICtrlCreateInput("", 115, 30, 150, 18)
GUICtrlSetData(-1, @IPAddress1)
$Label2 = GUICtrlCreateLabel("获取计算机名:", 24, 52, 90, 17)
$Input2 = GUICtrlCreateInput("", 115, 50, 150, 18)
GUICtrlSetState(-1, 144)
$btn = GUICtrlCreateButton("获取", 24, 85, 120, 22)
$btc = GUICtrlCreateButton("退出", 145, 85, 120, 22)
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3, $btc
                        Exit
                Case $btn
                        GUICtrlSetState($Input2, 144)
                        $ip = GUICtrlRead($Input1)
                        $b = StringRegExp($ip, "(((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?))", 3)
                        If @error <> 0 Then
                                MsgBox(0, 0, '请输入IP地址的正确格式')
                        Else
                                GUICtrlSetState($btn, 144)
                                GUICtrlSetData($Input2, '正在搜索,请稍候...')
                                TCPStartup()
                                $nHost = __TCPIpToName($b)
                                TCPShutdown()
                                If $nHost = '' Then
                                        GUICtrlSetData($Input2, '未找到目标计算机')
                                Else
                                        GUICtrlSetData($Input2, $nHost)
                                        GUICtrlSetState($Input2, 80)
                                EndIf
                                GUICtrlSetState($btn, 80)
                        EndIf
        EndSwitch
WEnd

Func __TCPIpToName($sIp, $iOption = Default, $hDll_Ws2_32 = Default)
        Local $vbinIP, $vaDllCall, $vptrHostent, $vHostent, $sHostnames, $vh_aliases, $i
        Local $INADDR_NONE = 0xffffffff, $AF_INET = 2, $sSeperator = @CR
        If $iOption = Default Then $iOption = 0
        If $hDll_Ws2_32 = Default Then $hDll_Ws2_32 = "Ws2_32.dll"
        $vaDllCall = DllCall($hDll_Ws2_32, "long", "inet_addr", "str", $sIp)
        If @error Then Return SetError(1, 0, "") ; inet_addr DllCall Failed
        $vbinIP = $vaDllCall
        If $vbinIP = $INADDR_NONE Then Return SetError(2, 0, "") ; inet_addr Failed
        $vaDllCall = DllCall($hDll_Ws2_32, "ptr", "gethostbyaddr", "long*", $vbinIP, "int", 4, "int", $AF_INET)
        If @error Then Return SetError(3, 0, "") ; gethostbyaddr DllCall Failed
        $vptrHostent = $vaDllCall
        If $vptrHostent = 0 Then
                $vaDllCall = DllCall($hDll_Ws2_32, "int", "WSAGetLastError")
                If @error Then Return SetError(5, 0, "") ; gethostbyaddr Failed, WSAGetLastError Failed
                Return SetError(4, $vaDllCall, "") ; gethostbyaddr Failed, WSAGetLastError = @Extended
        EndIf
        $vHostent = DllStructCreate("ptr;ptr;short;short;ptr", $vptrHostent)
        $sHostnames = __TCPIpToName_szStringRead(DllStructGetData($vHostent, 1))
        If @error Then Return SetError(6, 0, $sHostnames) ; strlen/sZStringRead Failed
        If $iOption = 1 Then
                $sHostnames &= $sSeperator
                For $i = 0 To 63 ; up to 64 Aliases
                        $vh_aliases = DllStructCreate("ptr", DllStructGetData($vHostent, 2) + ($i * 4))
                        If DllStructGetData($vh_aliases, 1) = 0 Then ExitLoop ; Null Pointer
                        $sHostnames &= __TCPIpToName_szStringRead(DllStructGetData($vh_aliases, 1))
                        If @error Then
                                SetError(7) ; Error reading array
                                ExitLoop
                        EndIf
                Next
                Return StringSplit(StringStripWS($sHostnames, 2), @CR)
        Else
                Return $sHostnames
        EndIf
EndFunc   ;==>__TCPIpToName

Func __TCPIpToName_szStringRead($iszPtr, $iLen = -1, $hDll_msvcrt = "msvcrt.dll")
        Local $aStrLen, $vszString
        If $iszPtr < 1 Then Return "" ; Null Pointer
        If $iLen < 0 Then
                $aStrLen = DllCall($hDll_msvcrt, "int:cdecl", "strlen", "ptr", $iszPtr)
                If @error Then Return SetError(1, 0, "") ; strlen Failed
                $iLen = $aStrLen + 1
        EndIf
        $vszString = DllStructCreate("char[" & $iLen & "]", $iszPtr)
        If @error Then Return SetError(2, 0, "")
        Return SetError(0, $iLen, DllStructGetData($vszString, 1))
EndFunc   ;==>__TCPIpToName_szStringRead那个 _GUICtrlIpAddress_Set 函数貌似有问题(Au3版本3.3.1.1)
因此没使用 _GUICtrlIpAddress_Create、_GUICtrlIpAddress_Set
只创建了普通的 Input 控件

catcher 发表于 2009-10-1 17:52:09

我测试有点问题,点获取后,没看到结果就自动退出了
麻烦你再看看

afan 发表于 2009-10-1 18:13:05

是没改IP直接点获取吗?
IP是否显示的内网IP

catcher 发表于 2009-10-1 18:16:59

改了也是显示搜索后就退出,不改的话是直接一点就退出来了

catcher 发表于 2009-10-1 18:18:22

IP是内网的,初始是我本机的IP,点了脚本直接退出,换一个局域网的IP,点了,会显示正在搜索,但没看到结果就退出来了。

afan 发表于 2009-10-1 18:21:00

用1L的扫描MAC正常吗

catcher 发表于 2009-10-1 18:26:39

用amu的那个是正常的

afan 发表于 2009-10-1 18:37:36

这就奇怪了,你把 3# 的代码第28行 $nHost = __TCPIpToName($b) 前加一行 Msgbox(0,0,$b),看看返回什么

catcher 发表于 2009-10-1 18:45:59

返回所输入的IP
确定后会退出程序

catcher 发表于 2009-10-1 18:51:47

Msgbox(0,0,__TCPIpToName($b))
可以取得机器名了

afan 发表于 2009-10-1 18:55:47

Msgbox(0,0,__TCPIpToName($b))
可以取得机器名了
catcher 发表于 2009-10-1 18:51 http://www.autoitx.com/images/common/back.gif

但不会显示在界面是吗?确定后还是会退出?3#的代码后来修改过试了吗?

catcher 发表于 2009-10-1 18:59:55

没注意到你改了三楼的代码。现在一切正常,非常感谢,国庆快乐!
只可惜这些代码我还没看懂。
:face (29):

afan 发表于 2009-10-1 19:06:53

看来以后修改了还得跟一贴提醒下才好啊,呵呵
界面代码比较简单,至于那个获取的函数懂个大概就行了吧~~

国庆快乐!
页: [1] 2
查看完整版本: 如何通过IP/mac获取计算机名