5.3读取cpu序列号三种方法对比分析

用三种方法读取cpu序列号,并分析了它们之间的优缺点,欢迎大家指导,本文采用迭代开发的模式,陆续会处获取其他软硬件信息的方法和技术,欢迎大家持续关注!期望最终能成为一个完善的脚本!

5.3读取cpu序列号三种方法对比分析

一、引言

曾有朋友在群里问读取硬盘序列号的实现,下面这个小代码就是大家一个集体智慧,我写这篇文章呢,主要想引起大家一起探讨,主要想在几个方向上探讨:

  • 电脑的还有哪些信息需要读取
  • 电脑某个信息的读取方法

二、代码

经过一晚上的研究和收集,当然还有探讨,总结出以下三种方法,分享给大家也许会对你有点帮助!经大家测试,第二种、第三种方法有一定局限性,经查资料:wmic命令需要两个先决条件a. 启动Windows Management Instrumentation服务,开放TCP135端口。b. 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以自己的身份验证”。

第一种方法

利用系统原生Win32函数获取

特点

  • 函数原生,可以说是win下最标准的使用方法
  • 获取速度较慢
CpuID:=GetCpuID()
MsgBox, %CpuID%
GetCpuID()
{
	objSWbemObject:=ComObjGet("winmgmts:Win32_Processor.DeviceID='cpu0'")
	序列号:=objSWbemObject.ProcessorId
	return,%序列号%
}

第二种方法

通过系统cmd.exe进行获取,(插曲)这个方法难到我了,因为才疏学浅,不会正则,最终在Troy的帮助下完成,希望有时间的朋友,可以先学习一下正则表达式。

特点

  • 运行速度明显比上边方法快一些
  • 占用剪贴板
CpuID:=GetCpuID()
MsgBox, %CpuID%
GetCpuID()
{
	序列号:=objSWbemObject.ProcessorId
	命令:="wmic cpu get Processorid"
	RunWait, %ComSpec% /c %命令% | clip,,hide
	if RegExMatch(clipboard, "iO)([\w `t]+)[`r`n `t]+([^`r`n]+)", match)
	{
		m_First := match.Value(1)
		m_Second := match.Value(2)
		return % m_Second
	}
}

第三种方法(推荐)

这种方法内在原理与方法二差不多,由king推荐的

特点

  • 速度快
  • 不占用剪贴板
CpuID:=GetCpuID()
MsgBox, %CpuID%
GetCpuID()
{
	Version := StdoutToVar_CreateProcess("wmic cpu get Processorid")
	if RegExMatch(Version, "iO)([\w `t]+)[`r`n `t]+([^`r`n]+)", match)
	{
		m_First := match.Value(1)
		m_Second := match.Value(2)
		return % m_Second
	}
}

; 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
}

 

三、其他电脑信息获取方法

  1. 获取MAC地址:http://www.autoahk.com/archives/7758
  2. 获取个人电脑信息:http://www.autoahk.com/archives/7751

四、寄语

希望大家分享你的小技巧和小知识点!上边代码的执行效率有待提高,希望大家多多指点!!

 

注意:并不是所有的cpu都有序列号!

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

拼音输入法,随机打字 ,码字大神欺骗脚本

2017-12-8 16:10:03

其他

[AHKV2]AutoHotKey(ahk) v2

2017-12-12 13:15:26

4 条回复 A文章作者 M管理员
  1. lhlh1024

    电脑的还有哪些信息需要读取?
    硬盘ID,mac地址,主板不知道有没有唯一ID

  2. Illidan

  3. hahahah

    6666666666

个人中心
购物车
优惠劵
有新私信 私信列表
搜索