Option ExplicitPublic Const NCBASTAT As Long = &H33
Public Const NCBNAMSZ As Long = 16
Public Const HEAP_ZERO_MEMORY As Long = &H8
Public Const HEAP_GENERATE_EXCEPTIONS As Long = &H4
Public Const NCBRESET As Long = &H32Public Type NET_CONTROL_BLOCK '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 TypePublic 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
Public Type NAME_BUFFER
name As String * NCBNAMSZ
name_num As Integer
name_flags As Integer
End TypePublic Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End TypePublic Declare Function Netbios Lib "netapi32.dll" _
(pncb As NET_CONTROL_BLOCK) As BytePublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, ByVal _
hpvSource As Long, ByVal _
cbCopy As Long)Public Declare Function GetProcessHeap Lib "kernel32" () As Long
Public Declare Function HeapAlloc Lib "kernel32" _
(ByVal hHeap As Long, ByVal dwFlags As Long, _
ByVal dwBytes As Long) As LongPublic Declare Function HeapFree Lib "kernel32" _
(ByVal hHeap As Long, _
ByVal dwFlags As Long, _
lpMem As Any) As Long
Public Function GetMACAddress() As String'retrieve the MAC Address for the network controller
'installed, returning a formatted stringDim tmp As String
Dim pASTAT As Long
Dim NCB As NET_CONTROL_BLOCK
Dim AST As ASTAT'The IBM NetBIOS 3.0 specifications defines four basic
'NetBIOS environments under the NCBRESET command. Win32
'follows the OS/2 Dynamic Link Routine (DLR) environment.
'This means that the first NCB issued by an application
'must be a NCBRESET, with the exception of NCBENUM.
'The Windows NT implementation differs from the IBM
'NetBIOS 3.0 specifications in the NCB_CALLNAME field.
NCB.ncb_command = NCBRESET
Call Netbios(NCB)'To get the Media Access Control (MAC) address for an
'ethernet adapter programmatically, use the Netbios()
'NCBASTAT command and provide a "*" as the name in the
'NCB.ncb_CallName field (in a 16-chr string).
NCB.ncb_callname = "* "
NCB.ncb_command = NCBASTAT'For machines with multiple network adapters you need to
'enumerate the LANA numbers and perform the NCBASTAT
'command on each. Even when you have a single network
'adapter, it is a good idea to enumerate valid LANA numbers
'first and perform the NCBASTAT on one of the valid LANA
'numbers. It is considered bad programming to hardcode the
'LANA number to 0 (see the comments section below).
NCB.ncb_lana_num = 0
NCB.ncb_length = Len(AST)pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS _
Or HEAP_ZERO_MEMORY, NCB.ncb_length)If pASTAT = 0 Then
Debug.Print "memory allocation failed!"
Exit Function
End IfNCB.ncb_buffer = pASTAT
Call Netbios(NCB)
CopyMemory AST, NCB.ncb_buffer, Len(AST)tmp = Format$(Hex(AST.adapt.adapter_address(0)), "00") & " " & _
Format$(Hex(AST.adapt.adapter_address(1)), "00") & " " & _
Format$(Hex(AST.adapt.adapter_address(2)), "00") & " " & _
Format$(Hex(AST.adapt.adapter_address(3)), "00") & " " & _
Format$(Hex(AST.adapt.adapter_address(4)), "00") & " " & _
Format$(Hex(AST.adapt.adapter_address(5)), "00")
HeapFree GetProcessHeap(), 0, pASTAT
GetMACAddress = tmp
End Function在网上找的一段vb获得本机mac地址的程序,但是运行了之后得到的是00 00 00 00 00 00    请大家帮忙看看!比较急   小弟在先等,  先谢谢!

解决方案 »

  1.   

    将下面这段代码拷贝到程序中,然后在你的程序需要的时候调用EthernetAddress(0),该函数返回的字符串就是您机器上网卡的以太序列号。  Private Const NCBASTAT = &H33 Private Const NCBNAMSZ = 16 Private Const HEAP_ZERO_MEMORY = &H8 Private Const HEAP_GENERATE_EXCEPTIONS = &H4 Private Const NCBRESET = &H32  Private 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 Type  Private 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 Type  Private Type ASTAT  adapt As ADAPTER_STATUS  NameBuff(30) As NAME_BUFFER End Type  Private 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 Long  Private 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  
      

  2.   

    Option ExplicitPrivate Const NCBASTAT = &H33Private Const NCBNAMSZ = 16Private Const HEAP_ZERO_MEMORY = &H8Private Const HEAP_GENERATE_EXCEPTIONS = &H4Private Const NCBRESET = &H32   Private Type NCB    ncb_command As Byte                                    'Integer    ncb_retcode As Byte                                    'Integer    ncb_lsn As Byte                                        'Integer    ncb_num As Byte                                        ' Integer    ncb_buffer As Long                                     'String    ncb_length As Integer    ncb_callname As String * NCBNAMSZ    ncb_name As String * NCBNAMSZ    ncb_rto As Byte                                        'Integer    ncb_sto As Byte                                        ' Integer    ncb_post As Long    ncb_lana_num As Byte                                   'Integer    ncb_cmd_cplt As Byte                                   'Integer    ncb_reserve(9) As Byte                                 ' Reserved, must be 0    ncb_event As LongEnd Type   Private Type ADAPTER_STATUS    adapter_address(5) As Byte                             'As String * 6    rev_major As Byte                                      'Integer    reserved0 As Byte                                      'Integer    adapter_type As Byte                                   'Integer    rev_minor As Byte                                      'Integer    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 IntegerEnd Type   Private Type NAME_BUFFER    name  As String * NCBNAMSZ    name_num As Integer    name_flags As IntegerEnd Type   Private Type ASTAT    adapt As ADAPTER_STATUS    NameBuff(30) As NAME_BUFFEREnd TypePrivate Declare Function Netbios Lib "NETAPI32.DLL" (pncb As NCB) As BytePrivate 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 LongPrivate Declare Function HeapAlloc Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, ByVal dwBytes As Long) As LongPrivate Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As LongFunction GetMACAddress(sIP As String) As String    Dim sRtn As String    Dim myNcb As NCB    Dim bRet As Byte    Dim aIP() As String    Dim X As Long    Dim nIP As String    Dim ProcessHeap As Long    ProcessHeap = GetProcessHeap    If InStr(sIP, ".") = 0 Then        GetMACAddress = ""        Exit Function    End If    aIP = Split(sIP, ".", -1, vbTextCompare)    If UBound(aIP()) <> 3 Then        GetMACAddress = ""        Exit Function    End If    For X = 0 To UBound(aIP())        If Len(aIP(X)) > 3 Then            GetMACAddress = ""            Exit Function        End If        If IsNumeric(aIP(X)) = False Then            GetMACAddress = ""            Exit Function        End If        If InStr(aIP(X), ",") <> 0 Then            GetMACAddress = ""            Exit Function        End If        If CLng(aIP(X)) > 255 Then            GetMACAddress = ""            Exit Function        End If        If nIP = "" Then            nIP = String(3 - Len(aIP(X)), "0") & aIP(X)        Else            nIP = nIP & "." & String(3 - Len(aIP(X)), "0") & aIP(X)        End If    Next    sRtn = ""    myNcb.ncb_command = NCBRESET    bRet = Netbios(myNcb)    myNcb.ncb_command = NCBASTAT    myNcb.ncb_lana_num = 0    myNcb.ncb_callname = nIP & Chr(0)    Dim myASTAT As ASTAT, tempASTAT As ASTAT    Dim pASTAT As Long    myNcb.ncb_length = Len(myASTAT)    pASTAT = HeapAlloc(ProcessHeap, HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)    If pASTAT = 0 Then        GetMACAddress = ""                                 'memory allcoation failed!        Exit Function    End If    myNcb.ncb_buffer = pASTAT    bRet = Netbios(myNcb)    If bRet <> 0 Then        GetMACAddress = ""                                 '"Can not get the MAC Address from IP Address: " & sIP        Exit Function    End If    CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)    Dim sTemp As String    Dim i As Long    For i = 0 To 5        sTemp = Hex(myASTAT.adapt.adapter_address(i))        If i = 0 Then            sRtn = IIf(Len(sTemp) < 2, "0" & sTemp, sTemp)        Else            sRtn = sRtn & Space(1) & IIf(Len(sTemp) < 2, "0" & sTemp, sTemp)        End If    Next    HeapFree ProcessHeap, 0, pASTAT    GetMACAddress = sRtn
    End Function
    使用方法:GetMACAddress(ip地址)
      

  3.   

    你的程序得到的也是000000000000    
    我在dos下用ipconfig /all  看我的mac是00-0c-f1-ad-2d-51