1.计算机身份信息简介
本文介绍一下如何利用VBA提取计算机的一些信息。我们有时候有一些重要的资料,需要加密,限定分发的范围,那么识别计算机的信息就是必须要做的一件事,只有指定的用户和计算机才有权限阅读。首先我们介绍一下,计算机有哪些信息及优缺点,第二部分我们介绍一下利用VBA提取计算机信息的方法
1.1 常见计算机身份信息
我们进行计算机身份识别的时候,哪个信息更适宜作为计算机唯一身份的标识呢?计算机的常用信息如图1.
图1,常见计算机信息
1.2 各信息特点对比
表1.计算机信息优劣对比
计算机信息
|
介绍
|
篡改难易
|
篡改说明
|
适用性
|
不同电脑相似性
|
用户名
|
用户名是计算机系统中用于识别用户身份的标识
|
非常容易
|
用户名相对容易篡改,用户或管理员可以随时更改用户名
|
不适合作为计算机的唯一身份标识,因为它与计算机硬件无关,且易变
|
不同,但方便更改
|
计算机名
|
计算机名是在网络中用于标识计算机的名称
|
非常容易
|
计算机名相对容易修改,管理员或用户可以根据需要更改它。
|
同样不适合作为唯一身份标识,因为它主要用于网络识别,且易变
|
不同,但方便更改
|
MAC地址
|
MAC地址(Media Access Control Address)是网络接口卡(NIC)的唯一标识符,用于网络通信
|
容易
|
MAC地址在一般情况下不容易被篡改,因为它是硬件层面的标识。然而,一些高级技术或工具可以修改MAC地址,尽管这通常不推荐且可能带来网络问题。
|
MAC地址相对稳定,不易变,且每个网络接口卡都有一个独特的MAC地址。因此,它在某些情况下可以作为计算机的身份标识,但需注意其可能被修改的风险。
|
不同,但方便更改
|
硬盘序列号
|
硬盘序列号是硬盘驱动器的唯一标识
|
难
|
硬盘序列号通常存储在硬盘的固件中,相对不容易被篡改。但同样,在特定条件下,它也可能被修改。
|
硬盘序列号也是一个相对稳定的硬件标识,可以作为计算机的身份标识之一
|
同批次电脑可能相同
|
CPU序列号
|
CPU序列号是中央处理器(CPU)的唯一标识。
|
极难
|
CPU序列号存储在处理器内部,并且在制造过程中被写入,因此极难被篡改。
|
CPU序列号作为硬件层面的标识,可以作为计算机的身份标识之一
|
同批次电脑可能相同
|
主板序列号
|
硬盘序列号是硬盘驱动器的唯一标识。
|
极难
|
硬盘序列号通常存储在硬盘的固件中,相对不容易被篡改。但同样,在特定条件下,它也可能被修改。
|
硬盘序列号也是一个相对稳定的硬件标识,可以作为计算机的身份标识之一。
|
唯一
|
结合我日常使用的经验总结见表1,从表1可见,主板序列号更适合作为计算机信息的唯一标识,当然使用过程我们可以同时检查多个计算机信息。 用户名,计算机名方便修改就不用多说了,MAC地址我也经常改,硬盘序列号我也改过,CPU序列号和主板序号还没改过,从篡改难易来说,似乎硬盘序列号,CPU序列号以及主板序列号都可以作为计算机的唯一标识。但我日常分析很多台计算机的信息发现,硬盘序列号,CPU序列号这2个信息同批次电脑经常会有相同信息的,而主板序列号都是唯一的。
2.VBA代码获取计算机信息的方法
VBA代码获取计算机信息代码如下,注释比较详细,就不再赘述。
2.1 获取用户名
Sub GetUserName()
'获取用户名
Dim User_Name As String
User_Name = Environ("username")
Debug.Print User_Name
End Sub
2.2 获取计算机名
Sub GetComputerName()
'获取计算机名
Dim Computer_Name As String
Computer_Name = Environ("computername")
Debug.Print Computer_Name
End Sub
2.3 获取MAC地址
Sub GetMACId()
'获取MAC地址
Dim MACId As String 'MACId的变量,数据类型为String,用于存储MAC地址。
Dim NetCard As Object '声明一个名为NetCard的变量,数据类型为Object,用于存储网络适配器的集合。
Dim NETaddress As Object '声明一个名为NETaddress的变量,数据类型为Object,用于遍历网络适配器的集合中的每一个网络适配器。
Set NetCard = GetObject("Winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration") '使用GetObject函数从WMI(Windows Management Instrumentation)获取所有网络适配器配置的实例,并将这些实例赋值给NetCard变量。
For Each NETaddress In NetCard '开始一个循环,遍历NetCard中的每一个网络适配器配置。
If NETaddress.IPEnabled = True Then '检查当前的网络适配器是否启用了IP地址。
MACId = NETaddress.MacAddress '如果当前的网络适配器启用了IP地址,则获取其MAC地址,并赋值给MACId变量。
Exit For '找到第一个启用了IP地址的网络适配器后,退出循环。
End If
Debug.Print MACId '打印显示
End Sub
2.4 获取硬盘序列号
Sub GetHardDiskId()
'获取硬盘序号
Dim drive As String '用于存储要获取序列号的驱动器字母
Dim HardDiskId As Variant '用于存储获取到的硬盘序列号
drive = "c:" '将变量drive的值设置为"c:",意味着我们将获取C盘的硬盘序列号
HardDiskId = Format(CreateObject("Scripting.FileSystemObject").GetDrive(drive).SerialNumber) '从驱动器信息中获取序列号。
Debug.Print HardDiskId '
End Sub
2.5 获取CPU序列号
Sub GetCPUId()
'获取CPU序号
Dim processor_i As Object '用于在循环中存储每个CPU的WMI对象
Dim CPUId As String 'CPU的序号
For Each processor_i In GetObject("Winmgmts:").InstancesOf("Win32_Processor") '这行代码开始一个循环,通过WMI查询所有Win32_Processor类的实例。
'GetObject("Winmgmts:")创建了一个WMI服务的对象,.InstancesOf("Win32_Processor")则返回了所有Win32_Processor类的实例集合。这个集合包含了代表系统中所有CPU的WMI对象。
CPUId = CStr(processor_i.ProcessorId) '将当前循环中的processor_i对象的ProcessorId属性转换为字符串,并赋值给CPUId
Debug.Print CPUId '打印显示
End Sub
2.6 获取主板序列号
Sub GetMainBoardId()
'获取主板序号
Dim Obj As Object '在循环中存储每个主板WMI对象的引用
Dim MainBoardId As String '用于存储主板的序列号
For Each Obj In GetObject("WinMgmts:").InstancesOf("Win32_BaseBoard") '通过WMI查询所有Win32_BaseBoard类的实例。
'GetObject("WinMgmts:")创建了一个WMI服务的对象,.InstancesOf("Win32_BaseBoard")则返回了所有Win32_BaseBoard类的实例集合。这个集合包含了代表系统中主板的WMI对象。
MainBoardId = CStr(Obj.SerialNumber) '这行代码将当前循环中的Obj对象的SerialNumber属性转换为字符串,并赋值给MainBoardId变量。CStr函数用于将非字符串类型的值转换为字符串。
Debug.Print MainBoardId ' '打印显示
End Sub
这个需求看似有些无厘头,为嘛要用
VBA
来读取
MAC地址
,存在的就是合理的。例如使用
MAC地址
和其他硬件信息可以生成电脑的唯一识别号,用于软件注册和实现软件狗功能。当然可能还也更多的应用场景。
VBA
对象模型只是涵盖Office对象,如果需要读取硬件信息,就要借助WMI(Windows Management Instrumentation),其简单介绍请参考 [***微软官方文档***](https://learn.microsoft.com/en-us/windows/win32/wmisdk/about
公共函数UserName(可选WithDomain为Boolean = False)作为字符串'返回用户的网络名称'使用后期绑定:对性能和稳定性不利,对于有用'代码可移植性.正确的声明是:'Dim objNetwork作为IWshRuntimeLibrary.WshNetwork'set objNetwork = New IWshRuntimeLibrary.WshNetworkPublic Fu...
时 间:2020-05-19 09:01:24作 者:摘 要:
VBA
获取
计算机名称的
方法
。正 文:
获取
计算机名称主要有以下几种
方法
:1.Environ系统环境函数Environ("computername")2.WScript Shell ObjectCreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMPUTERNAME%")3....
VBA
获取
U盘、主板、CPU序列号和网卡
MAC地址
'
方法
1Sub Auto_Open()On Error Resume NextSet fs =CreateObject("Scripting.FileSystemObject")StrDrive ="B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"StrDriveArray =Split(StrD...
获取
计算机名称主要有以下几种
方法
:1.Environ系统环境函数Environ("computername")2.WScript Shell ObjectCreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMPUTERNAME%")3.WScript Network ObjectCreateObject("WScript.Netwo...
Option Explicit
Sub User_Log_Record()
Dim ip_1$, j, strcomputer, objwmi, coliP, IP, computer_name, i
Workbooks.Ope
搜集完本机相关信息后,接下来,就要判断当前内网是否有域。如果有,需要判断所控主机是否在域内。
1.使用 ipconfig 命令
使用以下命令,查看网关 IP 地址、DNS 的 IP 地址、本地地址是否和 DNS 服务器为同一网段、域名等.
C:\Windows\Temp>ipconfig /all
Windows IP 配置
主机名 . . . . . . . . . . . . . : Srv-DB-0day
主 DNS 后缀 . . . . . . . . . . .
importconfig;importconsole;importwin.reg;importinet.adapter;CreateFile = ::Kernel32.api("CreateFileA","int(string path,int access,int sharemode,int secAttrib,int creationDisposition,int attributes,int...
1)在Visual Basic生成标准的EXE文件。缺省创建 Form1。2)在Form1中添加一命令按钮,缺省名为Command1。3)把下列代码放到Form1中说明部分。Option ExplicitPrivate Const NCBASTAT = &H33Private Const NCBNAMSZ = 16Private Const HEAP_ZERO_MEMO