C#:基于WDK和WMI获取机器指纹

同系列文章:

功能描述:

  1. 实现基于WDK获取网卡原生Mac地址、硬盘序列号、CPU ID
  2. 实现基于WMI获取网卡原生Mac地址、硬盘序列号、CPU ID
  3. 实现基于WDK获取系统所有设备的VID和PID
  4. 判断程序是否在VMware虚拟机中运行

源代码出售:

sell
价格:壹仟元人民币
QQ:36748897

动态库及测试程序下载:

HWiNFO 20161229.zip

HWiNFO类公开方法:

/* ----------------------------------------------------------
 * 文件名称:HWiNFO.cs
 * 
 * 作者:秦建辉
 * 
 * QQ:36748897
 * 
 * 博客:http://www.firstsolver.com/wordpress/
 * 
 * 开发环境:
 *      Visual Studio V2013
 *      .NET Framework 4 Client Profile
 *      
 * 版本历史:
 *      V2.0    2015年12月04日
 *              增加对VMware虚拟机的判断。虚拟机可以伪造任意网卡MAC地址
 *              在WDK中实现0权限获取硬盘序列号
 * 
 *      V1.0	2014年04月06日
 *              实现基于WMI获取网卡原生MAC地址、硬盘序列号、CPU ID
 *              实现基于WDK获取网卡原生MAC地址
 *              实现结合设备安装类GUID和设备接口类GUID获取设备VIDPID
------------------------------------------------------------ */
using System;
using System.Collections.Generic;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;

namespace Splash
{
    [StructLayout(LayoutKind.Sequential)]
    public struct T_VIDPID
    {
        public UInt16 VendorID;     // 供应商标识
        public UInt16 ProductID;    // 产品编号
    }

    public static class HWiNFO
    {
        /// <summary>
        /// 基于WMI获取设备属性值
        /// </summary>
        /// <param name="QueryIndex">要查询的属性值索引</param>
        /// <returns>属性值集合</returns>
        /// <remarks>
        ///     QueryIndex其值含义如下:
        ///         0:网卡原生MAC地址(剔除虚拟网卡)
        ///         1:网卡原生MAC地址(剔除虚拟网卡和USB网卡)
        ///         2:硬盘序列号
        ///         3:主板序列号
        ///         4:CPU ID
        ///         5:BIOS序列号
        ///         6:主板型号
        ///         7:网卡当前MAC地址(剔除虚拟网卡)
        ///         8:网卡当前MAC地址(剔除虚拟网卡和USB网卡)
        /// </remarks>
        public static String[] WMI_DeviceQuery(Int32 QueryIndex);

        /// <summary>
        /// 查看系统中是否存在指定标识的硬件设备
        /// </summary>
        /// <param name="CPUID">处理器标识,可以为空</param>
        /// <param name="HardDiskSerialNumber">硬盘序列号,可以为空</param>
        /// <param name="MacAddress">网卡MAC地址(已剔除虚拟网卡和USB网卡),可以为空</param>
        /// <returns>
        ///     true:匹配成功
        ///     false:匹配失败
        /// </returns>
        /// <remarks>
        ///     说明:
        ///         对设备标识不区分大小写
        ///         空项不做判断,非空项必须全部满足
        /// </remarks>
        public static Boolean WMI_DeviceMatch(String CPUID, String HardDiskSerialNumber, String MacAddress);

        /// <summary>
        /// 输出硬件信息到指定INI文件
        /// </summary>
        /// <param name="iniFileName">要保存的ini文件名</param>
        /// <returns>
        ///     true:成功
        ///     false:失败
        /// </returns>
        public static Boolean WMI_DeviceInfoPrint(String iniFileName);

        /// <summary>
        /// 判断程序是否在VMware虚拟机中运行
        /// </summary>
        /// <returns>
        ///     true:程序是在VMware虚拟机中运行
        ///     false:程序不是在VMware虚拟机中运行
        /// </returns>
        public static bool WMI_IsVMware();

        /// <summary>
        /// 结合设备安装类GUID和设备接口类GUID获取设备VIDPID
        /// </summary>
        /// <param name="SetupClassGuid">设备安装类GUID,Empty忽视</param>
        /// <param name="InterfaceClassGuid">设备接口类GUID,Empty忽视</param>
        /// <returns>设备VIDPID列表</returns>
        /// <remarks>
        ///     优点:直接通过设备实例ID提取VIDPID,从而无需获取设备路径来读写IO
        /// </remarks>
        public static T_VIDPID[] WDK_QueryVidPid(Guid SetupClassGuid, Guid InterfaceClassGuid);

        /// <summary>
        /// 验证设备的VIDPID
        /// </summary>
        /// <param name="VendorID">设备VID</param>
        /// <param name="ProductID">设备PID</param>
        /// <param name="SetupClassGuid">设备安装类GUID,Empty忽视</param>
        /// <param name="InterfaceClassGuid">设备接口类GUID,Empty忽视</param>
        /// <returns>
        ///     true:匹配成功
        ///     false:匹配失败
        /// </returns>
        public static Boolean WDK_VIDPIDMatch(UInt16 VendorID, UInt16 ProductID, Guid SetupClassGuid, Guid InterfaceClassGuid);

        /// <summary>
        /// 输出VIDPID信息到指定INI文件
        /// </summary>
        /// <param name="iniFileName">要保存的ini文件名</param>
        /// <returns>
        ///     true:成功
        ///     false:失败
        /// </returns>
        public static Boolean WDK_VIDPIDPrint(String iniFileName);

        /// <summary>
        /// 通过WDK获取网卡原生MAC地址
        /// </summary>
        /// <param name="isIncludeUSB">是否包含USB网卡,默认不包含USB网卡</param>
        /// <returns>获取到的网卡原生MAC地址集合</returns>
        public static String[] WDK_QueryMacAddress(Boolean isIncludeUSB = false);

        /// <summary>
        /// 获取硬盘序列号
        /// </summary>
        /// <returns>获取到的硬盘序列号集合</returns>
        public static String[] WDK_QueryDiskDrive();

        /// <summary>
        /// 查看系统中是否存在指定标识的硬件设备
        /// </summary>
        /// <param name="CPUID">处理器标识,可以为空</param>
        /// <param name="HardDiskSerialNumber">硬盘序列号,可以为空</param>
        /// <param name="MacAddress">网卡MAC地址(已剔除虚拟网卡和USB网卡),可以为空</param>
        /// <returns>
        ///     true:匹配成功
        ///     false:匹配失败
        /// </returns>
        /// <remarks>
        ///     说明:
        ///         对设备标识不区分大小写
        ///         空项不做判断,非空项必须全部满足
        /// </remarks>
        public static Boolean WDK_DeviceMatch(String CPUID, String HardDiskSerialNumber, String MacAddress);

        /// <summary>
        /// 输出硬件信息到指定INI文件
        /// </summary>
        /// <param name="iniFileName">要保存的ini文件名</param>
        /// <returns>
        ///     true:成功
        ///     false:失败
        /// </returns>
        public static Boolean WDK_DeviceInfoPrint(String iniFileName);

        /// <summary>
        /// 判断程序是否在VMware虚拟机中运行
        /// </summary>
        /// <returns>
        ///     true:程序是在VMware虚拟机中运行
        ///     false:程序不是在VMware虚拟机中运行
        /// </returns>
        public static bool WDK_IsVMware();
    }
}

测试软件界面:
HWiNFO-3
HWiNFO-4

Comments are closed.