获取MAC地址的三种方法

在我之前出的文章中,有一篇获取cpu序列号的文章,文章中我探讨了三种方法,下面我给出获取MAC地址的三种方法,供大家一起学习探讨。其优缺点跟之前CPU的一样,这里不再赘述。

引言

在我之前出的文章中,有一篇获取cpu序列号的文章,文章中我探讨了三种方法,下面我给出获取MAC地址的三种方法,供大家一起学习探讨。其优缺点跟之前CPU的一样,这里不再赘述。经大家测试,第二种、第三种方法有一定局限性,经查资料:wmic命令需要两个先决条件a. 启动Windows Management Instrumentation服务,开放TCP135端口。b. 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”。

代码分享

MacAddress:=GetMacAddress()
MsgBox, %MacAddress%
;;2.获取网卡硬件地址
;~ ;方法一
;~ GetMacAddress()
;~ {
;~ RunWait, %ComSpec% /c getmac /NH | clip,,hide
;~ RegExMatch(clipboard, ".*?([0-9A-Z].{16})(?!\w\\Device)", mac)
;~ return %mac1%
;~ }
;~ ;方法二
;~ GetMacAddress()
;~ {
;~ NetworkConfiguration:=ComObjGet("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
;~ for mo in NetworkConfiguration
;~ {
;~ if(mo.IPEnabled <> 0)
;~ return mo.MacAddress
;~ }
;~ }
;方法三
GetMacAddress()
{
	NetworkConfiguration := StdoutToVar_CreateProcess("getmac")
	RegExMatch(NetworkConfiguration, ".*?([0-9A-Z].{16})(?!\w\\Device)", mac)
	return %mac1%
}

; Im Original gilt "CP0"; zu CharSet CP850/CP858 vgl.: https://goo.gl/Y8xUYu , http://goo.gl/cMtc6i , https://goo.gl/ssCplI , https://goo.gl/s2P1jK
StdoutToVar_CreateProcess(sCmd, sEncoding:="CP858", sDir:="", ByRef nExitCode:=0) {
	DllCall( "CreatePipe",           PtrP,hStdOutRd, PtrP,hStdOutWr, Ptr,0, UInt,0 )
	DllCall( "SetHandleInformation", Ptr,hStdOutWr, UInt,1, UInt,1                 )

	VarSetCapacity( pi, (A_PtrSize == 4) ? 16 : 24,  0 )
	siSz := VarSetCapacity( si, (A_PtrSize == 4) ? 68 : 104, 0 )
	NumPut( siSz,      si,  0,                          "UInt" )
	NumPut( 0x100,     si,  (A_PtrSize == 4) ? 44 : 60, "UInt" )
	NumPut( hStdInRd,  si,  (A_PtrSize == 4) ? 56 : 80, "Ptr"  )
	NumPut( hStdOutWr, si,  (A_PtrSize == 4) ? 60 : 88, "Ptr"  )
	NumPut( hStdOutWr, si,  (A_PtrSize == 4) ? 64 : 96, "Ptr"  )

	if ( !DllCall( "CreateProcess", Ptr,0, Ptr,&sCmd, Ptr,0, Ptr,0, Int,True, UInt,0x08000000
		, Ptr,0, Ptr,sDir?&sDir:0, Ptr,&si, Ptr,&pi ) )
		return ""
		, DllCall( "CloseHandle", Ptr,hStdOutWr )
		, DllCall( "CloseHandle", Ptr,hStdOutRd )

	DllCall( "CloseHandle", Ptr,hStdOutWr ) ; The write pipe must be closed before Reading the stdout.
	VarSetCapacity(sTemp, 4095)
	while ( DllCall( "ReadFile", Ptr,hStdOutRd, Ptr,&sTemp, UInt,4095, PtrP,nSize, Ptr,0 ) )
	sOutput .= StrGet(&sTemp, nSize, sEncoding)

	DllCall( "GetExitCodeProcess", Ptr,NumGet(pi,0), UIntP,nExitCode )
	DllCall( "CloseHandle",        Ptr,NumGet(pi,0)                  )
	DllCall( "CloseHandle",        Ptr,NumGet(pi,A_PtrSize)          )
	DllCall( "CloseHandle",        Ptr,hStdOutRd                     )
	return sOutput
}

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA捐赠
共{{data.count}}人
人已捐赠
其他

[AHK V1]个人电脑信息获取

2017-12-12 15:17:58

其他

[WMIC]比CMD更强大的命令行WMIC与AHK完美相遇

2017-12-12 19:27:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
有新私信 私信列表
搜索