Option ExplicitPrivate Const NCBASTAT = &H33
Private Const NCBNAMSZ = 16
Private Const HEAP_ZERO_MEMORY = &H8
Private Const HEAP_GENERATE_EXCEPTIONS = &H4
Private Const NCBRESET = &H32Private Type NCB
    ncb_command As Byte
    ncb_retcode As Byte
    ncb_lsn As Byte
    ncb_num As Byte
    ncb_buffer As Long
    ncb_length As Integer
    ncb_callname As String * NCBNAMSZ
    ncb_name As String * NCBNAMSZ
    ncb_rto As Byte
    ncb_sto As Byte
    ncb_post As Long
    ncb_lana_num As Byte
    ncb_cmd_cplt As Byte
    ncb_reserve(9) As Byte ' Reserved, must be 0
    ncb_event As Long
End TypePrivate Type ADAPTER_STATUS
    adapter_address(5) As Byte
    rev_major As Byte
    reserved0 As Byte
    adapter_type As Byte
    rev_minor As Byte
    duration As Integer
    frmr_recv As Integer
    frmr_xmit As Integer
    iframe_recv_err As Integer
    xmit_aborts As Integer
    xmit_success As Long
    recv_success As Long
    iframe_xmit_err As Integer
    recv_buff_unavail As Integer
    t1_timeouts As Integer
    ti_timeouts As Integer
    Reserved1 As Long
    free_ncbs As Integer
    max_cfg_ncbs As Integer
    max_ncbs As Integer
    xmit_buf_unavail As Integer
    max_dgram_size As Integer
    pending_sess As Integer
    max_cfg_sess As Integer
    max_sess As Integer
    max_sess_pkt_size As Integer
    name_count As Integer
End Type
Private Type NAME_BUFFER
    name As String * NCBNAMSZ
    name_num As Integer
    name_flags As Integer
End TypePrivate Type ASTAT
    adapt As ADAPTER_STATUS
    NameBuff(30) As NAME_BUFFER
End TypePrivate Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetProcessHeap Lib "kernel32" () As Long
Private Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As LongPublic Function EthernetAddress(LanaNumber As Long) As String
    Dim udtNCB As NCB
    Dim bytResponse As Byte
    Dim udtASTAT As ASTAT
    Dim udtTempASTAT As ASTAT
    Dim lngASTAT As Long
    Dim strOut As String
    Dim x As Integer
    udtNCB.ncb_command = NCBRESET
    bytResponse = Netbios(udtNCB)
    udtNCB.ncb_command = NCBASTAT
    udtNCB.ncb_lana_num = LanaNumber
    udtNCB.ncb_callname = "* "
    udtNCB.ncb_length = Len(udtASTAT)
    lngASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, udtNCB.ncb_length)
    strOut = ""
    If lngASTAT Then
        udtNCB.ncb_buffer = lngASTAT
        bytResponse = Netbios(udtNCB)
        CopyMemory udtASTAT, udtNCB.ncb_buffer, Len(udtASTAT)
        With udtASTAT.adapt
            For x = 0 To 5
                strOut = strOut & Right$("00" & Hex$(.adapter_address(x)), 2)
            Next x
        End With
        HeapFree GetProcessHeap(), 0, lngASTAT
    End If
    EthernetAddress = strOut
End Function

解决方案 »

  1.   

    用 ipconfig /all 可以查看正确的MAC
      

  2.   

    网卡型号: Atheros AR8121_AR8113_AR8114 PCI-E Ethernet Controller
      

  3.   

    获取主机名、物理地址和IP的VBS:
    Dim Wsh
    Set Wsh=WScript.CreateObject("WScript.Shell")
    Wsh.Run "cmd"
    WScript.Sleep 1000   
    Wsh.SendKeys "ipconfig /all >d:\ip.txt"
    Wsh.SendKeys "{enter}"
    Wsh.SendKeys "exit"
    Wsh.SendKeys "{enter}"
    wscript.sleep 1000Dim Fso,Fl,Arr
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set fl= fso.opentextfile("d:\ip.txt",1,true)
    Arr= Split(fl.readall,vblf)
    fl.close
    For k=0 To UBound(arr)
    arr(k)=Replace(arr(k),". ","")
    next
    MsgBox arr(3) &vblf & arr(13) & vblf & arr(15)
    fso.deletefile "d:\ip.txt"
      

  4.   

    不要用vbs 而要 visual basic
      

  5.   

    我以前也用 API 实现过 获取 MAC 地址,但是电脑刚启动时,还是没有办法获取到!所以后来我索性不用 API 了,用 SHELL 执行一下 IPCONFIG /ALL >MAC_ADDRESS.TXT 然后再从文件 mac_address.txt 的内容中找到 MAC 地址,这个办法应该更可靠一点!