一、引言
曾有朋友在群里问读取硬盘序列号的实现,下面这个小代码就是大家一个集体智慧,我写这篇文章呢,主要想引起大家一起探讨,主要想在几个方向上探讨:
- 电脑的还有哪些信息需要读取
- 电脑某个信息的读取方法
二、代码
经过一晚上的研究和收集,当然还有探讨,总结出以下三种方法,分享给大家也许会对你有点帮助!经大家测试,第二种、第三种方法有一定局限性,经查资料: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 }
三、其他电脑信息获取方法
- 获取MAC地址:http://www.autoahk.com/archives/7758
- 获取个人电脑信息:http://www.autoahk.com/archives/7751
四、寄语
希望大家分享你的小技巧和小知识点!上边代码的执行效率有待提高,希望大家多多指点!!
注意:并不是所有的cpu都有序列号!
电脑的还有哪些信息需要读取?
硬盘ID,mac地址,主板不知道有没有唯一ID
会陆续有的
顶
6666666666