读取网卡MAC地址全是零

lpb830820 2008-07-23 11:38:54
我从网上下载了用API读取网卡的MAC地址,我自己的电脑是获取的的全是零,但在我的同事的电脑上能正确获取到。这是为什么?是不是还要开启什么服务?
...全文
361 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tzwsoho 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lpb830820 的回复:]
这个我也试过,在我的电脑上是可以,不过当我把程序编译出来给另外的同事测试的时候,获取时出错,说是不能创建对象。我同事的电脑是 XP 系统系统。用 WMI 的是不是还要什么配置的?也就是说用 WMI 的前提条件是什么?需要打包什么文件?还要什么服务?我知道 WMI 是操作系统自带的,就是不知道为什么同事的电脑不行。
[/Quote]

可能要开Windows Management Instrumentation服务。。。。
lpb830820 2008-07-24
  • 打赏
  • 举报
回复
还是不行。还是一样报错。说什么 Null 值,对象什么的。
lpb830820 2008-07-23
  • 打赏
  • 举报
回复
我的电脑有两张网卡,一张是有线的,不过已经被我停用了,因为上次打雷坏了。现在用的是无线的网卡。
lpb830820 2008-07-23
  • 打赏
  • 举报
回复
以上代码试过了,都是全为零的。
happy_sea 2008-07-23
  • 打赏
  • 举报
回复
如果和下面这段代码不一样,就试试下面的,放在模块中,用法:msgbox GetMACAddress()
Public 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 = &H32

Public Type NET_CONTROL_BLOCK
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
ncb_event As Long
End Type

Public 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 Type

Public Type ASTAT
adapt As ADAPTER_STATUS
NameBuff(30) As NAME_BUFFER
End Type

Public Declare Function Netbios Lib "netapi32.dll" (pncb As NET_CONTROL_BLOCK) As Byte

Public 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 Function GetMACAddress() As String
Dim tmp As String
Dim pASTAT As Long
Dim NCB As NET_CONTROL_BLOCK
Dim AST As ASTAT

NCB.ncb_command = NCBRESET
Call Netbios(NCB)

NCB.ncb_callname = "* "
NCB.ncb_command = NCBASTAT

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 If

NCB.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
danielinbiti 2008-07-23
  • 打赏
  • 举报
回复
xp系统肯定是可以的
直接把下面存成.vbs让你同事运行试试
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
msgbox objNetAdapter.macaddress
Next
_l_ 2008-07-23
  • 打赏
  • 举报
回复
现在的很多网卡可以自己设置MAC地址的
lpb830820 2008-07-23
  • 打赏
  • 举报
回复
这个我也试过,在我的电脑上是可以,不过当我把程序编译出来给另外的同事测试的时候,获取时出错,说是不能创建对象。我同事的电脑是 XP 系统系统。用 WMI 的是不是还要什么配置的?也就是说用 WMI 的前提条件是什么?需要打包什么文件?还要什么服务?我知道 WMI 是操作系统自带的,就是不知道为什么同事的电脑不行。
danielinbiti 2008-07-23
  • 打赏
  • 举报
回复
这是vbs

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colNetAdapters = objWMIService.ExecQuery _
("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each objNetAdapter in colNetAdapters
msgbox objNetAdapter.macaddress
Next

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧