在ASP中用组件检测当前网卡地址的代码

时间:2022-09-18 13:52:01
  1. Option Explicit  
  2.  
  3.    Private Const NCBASTAT = &H33  
  4.    Private Const NCBNAMSZ = 16  
  5.    Private Const HEAP_ZERO_MEMORY = &H8  
  6.    Private Const HEAP_GENERATE_EXCEPTIONS = &H4  
  7.    Private Const NCBRESET = &H32  
  8.  
  9.    Private Type NCB  
  10.         ncb_command As Byte 'Integer  
  11.         ncb_retcode As Byte 'Integer  
  12.         ncb_lsn As Byte 'Integer  
  13.         ncb_num As Byte ' Integer  
  14.         ncb_buffer As Long 'String  
  15.         ncb_length As Integer  
  16.         ncb_callname As String * NCBNAMSZ  
  17.         ncb_name As String * NCBNAMSZ  
  18.         ncb_rto As Byte 'Integer  
  19.         ncb_sto As Byte ' Integer  
  20.         ncb_post As Long  
  21.         ncb_lana_num As Byte 'Integer  
  22.         ncb_cmd_cplt As Byte  'Integer  
  23.         ncb_reserve(9) As Byte ' Reserved, must be 0  
  24.         ncb_event As Long  
  25.    End Type  
  26.    Private Type ADAPTER_STATUS  
  27.         adapter_address(5) As Byte 'As String * 6  
  28.         rev_major As Byte 'Integer  
  29.         reserved0 As Byte 'Integer  
  30.         adapter_type As Byte 'Integer  
  31.         rev_minor As Byte 'Integer  
  32.         duration As Integer  
  33.         frmr_recv As Integer  
  34.         frmr_xmit As Integer  
  35.         iframe_recv_err As Integer  
  36.         xmit_aborts As Integer  
  37.         xmit_success As Long  
  38.         recv_success As Long  
  39.         iframe_xmit_err As Integer  
  40.         recv_buff_unavail As Integer  
  41.         t1_timeouts As Integer  
  42.         ti_timeouts As Integer  
  43.         Reserved1 As Long  
  44.         free_ncbs As Integer  
  45.         max_cfg_ncbs As Integer  
  46.         max_ncbs As Integer  
  47.         xmit_buf_unavail As Integer  
  48.         max_dgram_size As Integer  
  49.         pending_sess As Integer  
  50.         max_cfg_sess As Integer  
  51.         max_sess As Integer  
  52.         max_sess_pkt_size As Integer  
  53.         name_count As Integer  
  54.    End Type  
  55.    Private Type NAME_BUFFER  
  56.         name  As String * NCBNAMSZ  
  57.         name_num As Integer  
  58.         name_flags As Integer  
  59.    End Type  
  60.    Private Type ASTAT  
  61.         adapt As ADAPTER_STATUS  
  62.         NameBuff(30) As NAME_BUFFER  
  63.    End Type  
  64.  
  65.    Private Declare Function Netbios Lib "netapi32.dll" _  
  66.            (pncb As NCB) As Byte  
  67.    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _  
  68.            hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)  
  69.    Private Declare Function GetProcessHeap Lib "kernel32" () As Long  
  70.    Private Declare Function HeapAlloc Lib "kernel32" _  
  71.            (ByVal hHeap As Long, ByVal dwFlags As Long, _  
  72.            ByVal dwBytes As Long) As Long  
  73.    Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, _  
  74.            ByVal dwFlags As Long, lpMem As Any) As Long  
  75.  
  76. Public Function GetMACAddress(sIP As String) As String  
  77.     Dim sRtn As String  
  78.     Dim myNcb As NCB  
  79.     Dim bRet As Byte  
  80.  
  81.     Dim aIP() As String  
  82.     Dim x As Long  
  83.     Dim nIP As String  
  84.  
  85.     If InStr(sIP, ".") = 0 Then  
  86.        GetMACAddress = "无效的IP地址."  
  87.        Exit Function  
  88.     End If  
  89.  
  90.     aIP = Split(sIP, ".", -1, vbTextCompare)  
  91.     If UBound(aIP()) <> 3 Then  
  92.        GetMACAddress = "无效的IP地址."  
  93.        Exit Function  
  94.     End If  
  95.  
  96.     For x = 0 To UBound(aIP())  
  97.         If Len(aIP(x)) > 3 Then  
  98.            GetMACAddress = "无效的IP地址"  
  99.            Exit Function  
  100.         End If  
  101.  
  102.         If IsNumeric(aIP(x)) = False Then  
  103.            GetMACAddress = "无效的IP地址"  
  104.            Exit Function  
  105.         End If  
  106.  
  107.         If InStr(aIP(x), ",") <> 0 Then  
  108.            GetMACAddress = "无效的IP地址"  
  109.            Exit Function  
  110.         End If  
  111.  
  112.         If CLng(aIP(x)) > 255 Then  
  113.            GetMACAddress = "无效的IP地址"  
  114.            Exit Function  
  115.         End If  
  116.  
  117.         If nIP = "" Then  
  118.            nIP = String(3 - Len(aIP(x)), "0") & aIP(x)  
  119.         Else  
  120.            nIP = nIP & "." & String(3 - Len(aIP(x)), "0") & aIP(x)  
  121.         End If  
  122.     Next  
  123.  
  124.     sRtn = ""  
  125.     myNcb.ncb_command = NCBRESET  
  126.     bRet = Netbios(myNcb)  
  127.     myNcb.ncb_command = NCBASTAT  
  128.     myNcb.ncb_lana_num = 0  
  129.     myNcb.ncb_callname = nIP & Chr(0)  
  130.  
  131.     Dim myASTAT As ASTAT, tempASTAT As ASTAT  
  132.     Dim pASTAT As Long  
  133.     myNcb.ncb_length = Len(myASTAT)  
  134.  
  135.     pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)  
  136.     If pASTAT = 0 Then  
  137.         GetMACAddress = "memory allcoation failed!"  
  138.         Exit Function  
  139.     End If  
  140.  
  141.     myNcb.ncb_buffer = pASTAT  
  142.     bRet = Netbios(myNcb)  
  143.  
  144.     If bRet <> 0 Then  
  145.        GetMACAddress = "不能从当前IP地址获得MAC,当前IP地址: " & sIP  
  146.        Exit Function  
  147.     End If  
  148.  
  149.     CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)  
  150.  
  151.     Dim sTemp As String  
  152.     Dim i As Long  
  153.     For i = 0 To 5  
  154.         sTemp = Hex(myASTAT.adapt.adapter_address(i))  
  155.         If i = 0 Then  
  156.            sRtn = IIf(Len(sTemp) < 2, "0" & sTemp, sTemp)  
  157.         Else  
  158.            sRtn = sRtn & Space(1) & IIf(Len(sTemp) < 2, "0" & sTemp, sTemp)  
  159.         End If  
  160.     Next  
  161.     HeapFree GetProcessHeap(), 0, pASTAT  
  162.     GetMACAddress = sRtn  
  163. End Function 

使用方法:

  1. set S_MAC = server.CreateObject( "工程名.类名")  
  2. response.write S_MAC.GetMACAddress(Request.Servervariables("REMOTE_HOST"))  
  3. set S_MAC = nothing