相关文章推荐
率性的山楂  ·  错误Galer群集:无法从: ...·  3 月前    · 
傻傻的双杠  ·  css ...·  5 月前    · 

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