其实搜集硬件信息的文章也有很多。我这里也分享一下我了解的一些方式。最后在讲一下自己写的《局域网电脑硬件信息搜集》工具是怎么做的。
目录
使用系统信息工具(这个最简单,但是信息不利于传送)
- 系统信息 (System Information)
- 按
Windows + R
打开运行窗口,输入msinfo32
,然后按 Enter。 - 在系统信息窗口中,你可以查看详细的硬件信息,包括处理器、内存、显卡等。
- 按
使用命令行工具(WMI也是常用的获取功能)
-
WMIC (Windows Management Instrumentation Command-line)
- 打开命令提示符 (Cmd),输入以下命令获取CPU信息:
wmic cpu get name, CurrentClockSpeed, MaxClockSpeed, NumberOfCores, NumberOfLogicalProcessors
- 获取内存信息:
mic memorychip get capacity, speed, manufacturer
- 获取显卡信息:
mic path win32_videocontroller get name, adapterram, driverversion
- 打开命令提示符 (Cmd),输入以下命令获取CPU信息:
-
PowerShell
- 打开 PowerShell,输入以下命令获取CPU信息:
Get-WmiObject Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors
- 获取内存信息:
Get-WmiObject Win32_PhysicalMemory | Select-Object Capacity, Speed, Manufacturer
- 获取显卡信息:
Get-WmiObject Win32_VideoController | Select-Object Name, AdapterRAM, DriverVersion
使用python脚本或程序
你也可以编写脚本或程序来自动化硬件信息的收集。下面是一个使用 Python 和
psutil
库的例子:《》import psutil # 获取CPU信息 cpu_info = psutil.cpu_freq() print(f"CPU 最大频率: {cpu_info.max} MHz") print(f"CPU 当前频率: {cpu_info.current} MHz") print(f"CPU 核心数: {psutil.cpu_count(logical=False)}") print(f"CPU 逻辑处理器数: {psutil.cpu_count(logical=True)}") # 获取内存信息 mem_info = psutil.virtual_memory() print(f"总内存: {mem_info.total / (1024 ** 3)} GB") print(f"可用内存: {mem_info.available / (1024 ** 3)} GB") # 获取显卡信息 (需要安装 py-cpuinfo) import cpuinfo gpu_info = cpuinfo.get_cpu_info() print(f"显卡: {gpu_info['brand_raw']}")
- 打开 PowerShell,输入以下命令获取CPU信息:
《局域网电脑硬件信息搜集》的部分代码及思路
实现方法比较简单,主要还是以WIM来读取硬件的信息,举几个例子 :
''----------添加硬盘 '
Dim cmicWmi As New System.Management.ManagementObjectSearcher("Select * From Win32_DiskDrive")
Dim strn As String = ""
Dim YP As String = ""
'MsgBox(“硬盘读取”)
'Try
Dim disksize As String = 0 '数字ID
Dim diskSerialNumber As String = "" '这个我们暂且称其为序列号码
Dim diskModel As String = "" '序列号
Dim sumdisk As Integer = 0
'For Each cmicWmiObj As System.Management.ManagementObject In cmicWmi.Get
For i As Integer = 0 To cmicWmi.Get.Count - 1
'MsgBox("size" & cmicWmiObj("size"))
'MsgBox("serialnumber" & cmicWmiObj("serialnumber"))
'MsgBox("Model" & cmicWmiObj("Model"))
Try
disksize = cmicWmi.Get(i)("size")
Catch ex As Exception
disksize = ""
End Try
Try
diskSerialNumber = cmicWmi.Get(i)("serialnumber")
Catch ex As Exception
diskSerialNumber = ""
End Try
Try
diskModel = cmicWmi.Get(i)("Model")
Catch ex As Exception
diskModel = ""
End Try
'If strn <> "" Then
If diskSerialNumber <> "" Then
diskSerialNumber = diskSerialNumber.Replace(" ", "")
' MsgBox(diskSerialNumber & vbCrLf & diskSerialNumber.Length)
If diskSerialNumber.Length = 40 AndAlso diskSerialNumber.Contains("_") = False Then
Dim newdiskname As String = RunScript(diskSerialNumber).Replace(" ", "").Replace(vbCrLf, "")
If newdiskname.Contains("错误") = False Then
diskSerialNumber = newdiskname
End If
'MsgBox(diskSerialNumber)
End If
End If
strn = strn & diskSerialNumber & " " & diskModel & " 参数:" & CInt(disksize / 1000 / 1000 / 1000) & "G|"
sumdisk += CInt(disksize / 1000 / 1000 / 1000)
'End If
'MsgBox(sumdisk)
Next
Dim alldisk As String = ""
If sumdisk >= 1000 Then
alldisk = "总存储【" & Math.Round(sumdisk / 1000, 2) & "T】"
Else
alldisk = "总存储【" & sumdisk & "G】"
End If
''-------------------主板
Try
Dim WmiZB As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_baseboard")
For Each WmiObj As System.Management.ManagementObject In WmiZB.Get
ZB = WmiObj("Manufacturer") & " " & WmiObj("Product")
Next
Catch
ZB = ""
End Try
'---------电脑型号
Dim cmodel As String = ""
Try
Dim WmiZB As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystemProduct") 'ComputerSystemProduct
For Each WmiObj As System.Management.ManagementObject In WmiZB.Get
'cmodel = WmiObj("Manufacturer") & " " & WmiObj("Model")
cmodel = WmiObj("Vendor") & " " & WmiObj("Version") & WmiObj("NAME") & " "
' String Caption;
'String Description;
'String IdentifyingNumber;
'String Name;
'String SKUNumber;
'String Vendor;
'String Version;
'String UUID;
Next
Catch
cmodel = ""
End Try
''-------------------系统
Dim OS As String = ""
Try
Dim WmiOS As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
Dim osws As String = ""
If Environment.GetEnvironmentVariable("ProgramFiles(x86)") = "" Then
osws = "32 位"
Else
osws = "64 位"
End If
'MsgBox(osws)
'MsgBox(My.Computer.Info.OSPlatform.ToString)
For Each WmiObj As System.Management.ManagementObject In WmiOS.Get
OS = "安装时间:" & Strings.Left(WmiObj("InstallDate"), 8).Insert(4, "年").Insert(7, "月").Insert(10, "日") & " 系统类型:" & osws & " 系统名:" & WmiObj("NAME")
Next
Catch
OS = ""
End Try
然后就是整个界面把获取到的信息写上去。
最后通过TcpClient 将获取的信息传送给服务端,服务端写入数据库就可以了。
其实整体思路比较简单。就是需要考虑的细节比较多。比如获取的参数如何呈现等。
举个例子,一开始的时候,内存信息获取之后是这样呈现的:
内存:91*****1 speed 4800
现在的呈现方式:
总内存【16G】内存1:9******3 海力士(SK Hynix) DDR5 4800 参数:8G|内存2:9******8 海力士(SK Hynix) DDR5 4800 参数:8G
需要通过获取的各个参数,查询厂家的数据以及标准,来转换成用户能够看得懂的语言来呈现出来。个人认为对于这个软件来说,可能用户体验会比代码要更重要。
先写到这里,后面有什么可以在进一步交流,感谢大家的支持!
不想写代码的可以直接去下载使用!