C# 通过VMI接口获取硬件ID

使用C#语言实现通过VMI(虚拟机监控器)接口来获取硬件ID的过程。VMI是一种用于虚拟化环境的接口,用于管理虚拟机和宿主机之间的通信和资源共享。具体实现中,需要通过添加System.Management命名空间的引用来访问VMI接口,然后使用其中的类和方法来获取硬件ID。此外,需要借助一些系统API来处理数据,如使用ManagementObjectSearcher类和ManagementObjectCollection类获取系统信息并对其进行过滤。

实现代码:

class HardWareInfo
{
	/// <summary>
	/// 获取 CPUID , 更多 cpu 信息参考
	/// </summary>
	/// <returns> cpuid </returns>
	public static string GetCpuId()
	{
		string cpuid = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Processor");
			foreach (ManagementObject mo in searcher.Get())
			{
				cpuid = mo.Properties["ProcessorId"].Value.ToString();
 
				break;
			}
		}
		catch
		{
 
		}
 
		return cpuid;
	}
 
	/// <summary>
	/// 获取硬盘序列号
	/// </summary>
	/// <returns> 硬盘序列号 </returns>
	public static string GetDiskSerialNumber()
	{
		string HDid = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_DiskDrive");
			foreach (ManagementObject mo in searcher.Get())
			{
				HDid = (string)mo.Properties["SerialNumber"].Value;
 
				break;
			}
		}
		catch
		{
 
		}
 
		return HDid;
	}
	
	/// <summary>
	/// 获取硬盘产品型号
	/// </summary>
	/// <returns>硬盘产品型号</returns>
	public static string GetDiskModelNumber()
	{
		string HDid = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_DiskDrive");
			foreach (ManagementObject mo in searcher.Get())
			{
				HDid = (string)mo.Properties["Model"].Value;
 
				break;
			}
		}
		catch
		{
 
		}
		
		return HDid;
	}
 
	/// <summary>
	/// 获取 Mac 地址 ,更多网卡信息参考 :
	/// </summary>
	/// <returns> Mac 地址 </returns>
	public static string GetMacAddress()
	{
		string mac = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration");
			foreach (ManagementObject mo in searcher.Get())
			{
				if ((bool)mo["IPEnabled"] == true)
				{
					mac = mo["MacAddress"].ToString();
 
					break;
				}
			}
		}
		catch
		{
 
		}
		
		return mac;
	}
 
	/// <summary>
	/// 获取 ip 地址
	/// </summary>
	/// <returns> ip 地址 </returns>
	public static string GetIpAddress()
	{
		string st = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_NetworkAdapterConfiguration");
			foreach (ManagementObject mo in searcher.Get())
			{
				if ((bool)mo["IPEnabled"] == true)
				{
					System.Array ar;
					ar = (System.Array)(mo.Properties["IpAddress"].Value);
					st = ar.GetValue(0).ToString();
 
					break;
				}
			}
		}
		catch
		{
 
		}
		
		return st;
	}
 
	/// <summary>
	/// 获取主板序列号
	/// </summary>
	/// <returns> 主板序列号 </returns>
	public static string GetBIOSSerialNumber()
	{
		string sBIOSSerialNumber = "";
 
		try
		{
			ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_BIOS");
			foreach (ManagementObject mo in searcher.Get())
			{
				sBIOSSerialNumber = mo.GetPropertyValue("SerialNumber").ToString().Trim();
 
				break;
			}
		}
		catch
		{
 
		}
 
		return sBIOSSerialNumber;
	}
 
}
posted @   lyshark  阅读(773)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-08-08 Web文件上传靶场 - 通关笔记
2018-08-08 植物大战僵尸:辅助制作高级技巧

8951790 | 6896846
博客园 - 开发者的网上家园

点击右上角即可分享
微信分享提示