我在我机子上获的网卡地址是正确的
但到另一个机子上 就能了0-0-0-0-0-0
是怎么回事 Option Explicit
Private 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 '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 Long
End TypePrivate 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 Integer
End TypePrivate 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 TypePublic 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 Long
Public Declare Function HeapFree Lib "kernel32" (ByVal hHeap As Long, ByVal dwFlags As Long, lpMem As Any) As Long
Public Declare Function Netbios Lib "netapi32.dll" (pncb As NCB) As Byte'过滤非法字符
Public Function CheckString(ByVal Fy_String As String) As String
    Dim i As Integer
    Dim Fy_In As String
    Dim SecurityString As String
    Dim Fy_Inf
    SecurityString = Fy_String
    Fy_In = "'|;|and|(|)|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
    Fy_Inf = Split(Fy_In, "|")
    For i = 0 To UBound(Fy_Inf)
      SecurityString = Replace(SecurityString, Fy_Inf(i), "")
    Next
    CheckString = SecurityString
End Function
 Public Function MacAddress() As String
    Dim myNcb As NCB
    Dim bRet As Byte
    myNcb.ncb_command = NCBRESET
    bRet = Netbios(myNcb)
    myNcb.ncb_command = NCBASTAT
    myNcb.ncb_lana_num = 0
    myNcb.ncb_callname = "*"
    Dim myASTAT As ASTAT, tempASTAT As ASTAT
    Dim pASTAT As Long
    myNcb.ncb_length = Len(myASTAT)
    Debug.Print Err.LastDllError
    pASTAT = HeapAlloc(GetProcessHeap(), HEAP_GENERATE_EXCEPTIONS Or HEAP_ZERO_MEMORY, myNcb.ncb_length)
    If pASTAT = 0 Then
        Debug.Print "memory allcoation failed!"
        Exit Function
    End If
    myNcb.ncb_buffer = pASTAT
    bRet = Netbios(myNcb)
    Debug.Print Err.LastDllError
    CopyMemory myASTAT, myNcb.ncb_buffer, Len(myASTAT)
    MacAddress = Hex(myASTAT.adapt.adapter_address(0)) & "-" & Hex(myASTAT.adapt.adapter_address(1)) _
        & "-" & Hex(myASTAT.adapt.adapter_address(2)) & "-" _
        & Hex(myASTAT.adapt.adapter_address(3)) _
        & "-" & Hex(myASTAT.adapt.adapter_address(4)) & "-" _
        & Hex(myASTAT.adapt.adapter_address(5))
    HeapFree GetProcessHeap(), 0, pASTAT
End Function

解决方案 »

  1.   

    利用WMI获取系统信息    WMI(Windows Management Instrumentation)技术是微软提供的Windows下的系统管理工具。通过该工具可以在本地或者管理客户端系统中几乎一切的信息。很多专业的网络管理工具都是基于WMI开发的。该工具在Win2000以及WinNT下是标准工具,在Win9X下是扩展安装选项。本文将介绍如何通过VB编程来访问WMI对象的编程。
       首先来看一个简单的通过WMI获取系统信息的范例,这个范例通过WMI对象获得系统中运行的的进程:
    Function Enum1() As String    Dim WMI
        Set WMI = GetObject("WinMgmts:")    Set objs = WMI.InstancesOf("Win32_Process") 
        For Each obj In objs        Enum1 = Enum1 + obj.Description + Chr(13) + Chr(10)    NextEnd Function 
        在上面的代码中,首先通过  GetObject("WinMgmts:")获得WMI对象,在WMI对象下有很多的子项,在这里我们通过WMI.InstancesOf("Win32_Process")获得系统中所有的进程列表子项。Private Function MACAddress() As String   Set objs = GetObject("winmgmts:").ExecQuery( _
          "SELECT MACAddress " & _
          "FROM Win32_NetworkAdapter " & _
          "WHERE " & _
          "((MACAddress Is Not NULL) " & _
          "AND (Manufacturer <> " & _
          "'Microsoft'))")
       For Each obj In objs
          MACAddress = obj.MACAddress
          Exit For
       Next obj
    End Function
    用这个看看
      

  2.   

    Netbios如果被禁用了,一般也就无法查看了..还有防火墙的问题..
      

  3.   

    ipconfig /all >config.txt
    分析TXT即可 不过好象不太安全啊 哈