如何获取虚拟机所在物理服务器的真实硬件信息

如何获取虚拟机所在物理服务器的真实硬件信息,第1张

你的想法很难实现。

首先你必须验证程序在虚拟机之中才行,

如果能从虚拟机获取物理机的硬件信息,那么虚拟机的安全性就无法保障。

就我所知,VM系列虚拟机,通过安装vmtools工具,

同时直接给予vix函数系统特权时,这是虚拟机可以获取物理机的硬件信息。

不过VM Esx版本默认都禁止这个功能。

现在,国内的像仙剑五之类的游戏,都可以通过虚拟机非法复制许可证。

一般的游戏,为避免外|挂,采用虚拟机检测技术。

即这些程序默认禁止在虚拟机中允许。

很多通过虚拟机硬件仿真代码,都可以避开硬件的检测。

总的来说 FRAMEWORK 好像不提供这些功能,如果你想调用的话,就得C#内调 USR32DLL 这些系统内部的DLL文件

下面是我以前复制来的,总的道理就是 调用USER32DLL 然后用它里面的函数初始化C#结构,里面有各种硬件信息

using System;

using SystemCollectionsGeneric;

using SystemDiagnostics;

using SystemThreading;

using SystemIO;

using SystemText;

using SystemManagement;

using SystemRuntimeInteropServices;

namespace LemonySystemInfo

{

///

/// 系统信息类 - 获取CPU、内存、磁盘、进程信息

///

public class SystemInfo

{

private int m_ProcessorCount = 0; //CPU个数

private PerformanceCounter pcCpuLoad; //CPU计数器

private long m_PhysicalMemory = 0; //物理内存

private const int GW_HWNDFIRST = 0;

private const int GW_HWNDNEXT = 2;

private const int GWL_STYLE = (-16);

private const int WS_VISIBLE = 268435456;

private const int WS_BORDER = 8388608;

#region AIP声明

[DllImport("IpHlpApidll")]

extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);

[DllImport("User32")]

private extern static int GetWindow(int hWnd, int wCmd);

[DllImport("User32")]

private extern static int GetWindowLongA(int hWnd, int wIndx);

[DllImport("user32dll")]

private static extern bool GetWindowText(int hWnd, StringBuilder title, int maxBufSize);

[DllImport("user32", CharSet = CharSetAuto)]

private extern static int GetWindowTextLength(IntPtr hWnd);

#endregion

#region 构造函数

///

/// 构造函数,初始化计数器等

///

public SystemInfo()

{

//初始化CPU计数器

pcCpuLoad = new PerformanceCounter("Processor", "% Processor Time", "_Total");

pcCpuLoadMachineName = "";

pcCpuLoadNextValue();

//CPU个数

m_ProcessorCount = EnvironmentProcessorCount;

//获得物理内存

ManagementClass mc = new ManagementClass("Win32_ComputerSystem");

ManagementObjectCollection moc = mcGetInstances();

foreach (ManagementObject mo in moc)

{

if (mo["TotalPhysicalMemory"] != null)

{

m_PhysicalMemory = longParse(mo["TotalPhysicalMemory"]ToString());

}

}

}

#endregion

#region CPU个数

///

/// 获取CPU个数

///

public int ProcessorCount

{

get

{

return m_ProcessorCount;

}

}

#endregion

#region CPU占用率

///

/// 获取CPU占用率

///

public float CpuLoad

{

get

{

return pcCpuLoadNextValue();

}

}

#endregion

#region 可用内存

///

/// 获取可用内存

///

public long MemoryAvailable

{

get

{

long availablebytes = 0;

//ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT FROM Win32_PerfRawData_PerfOS_Memory");

//foreach (ManagementObject mo in mosGet())

//{

// availablebytes = longParse(mo["Availablebytes"]ToString());

//}

ManagementClass mos = new ManagementClass("Win32_OperatingSystem");

foreach (ManagementObject mo in mosGetInstances())

{

if (mo["FreePhysicalMemory"] != null)

{

availablebytes = 1024 longParse(mo["FreePhysicalMemory"]ToString());

}

}

return availablebytes;

}

}

#endregion

#region 物理内存

///

/// 获取物理内存

///

public long PhysicalMemory

{

get

{

return m_PhysicalMemory;

}

}

#endregion

#region 获得分区信息

///

/// 获取分区信息

///

public List GetLogicalDrives()

{

List drives = new List();

ManagementClass diskClass = new ManagementClass("Win32_LogicalDisk");

ManagementObjectCollection disks = diskClassGetInstances();

foreach (ManagementObject disk in disks)

{

// DriveTypeFixed 为固定磁盘(硬盘)

if (intParse(disk["DriveType"]ToString()) == (int)DriveTypeFixed)

{

drivesAdd(new DiskInfo(disk["Name"]ToString(), longParse(disk["Size"]ToString()), longParse(disk["FreeSpace"]ToString())));

}

}

return drives;

}

///

/// 获取特定分区信息

///

/// 盘符

public List GetLogicalDrives(char DriverID)

{

List drives = new List();

WqlObjectQuery wmiquery = new WqlObjectQuery("SELECT FROM Win32_LogicalDisk WHERE DeviceID = ’" + DriverID + ":’");

ManagementObjectSearcher wmifind = new ManagementObjectSearcher(wmiquery);

foreach (ManagementObject disk in wmifindGet())

{

if (intParse(disk["DriveType"]ToString()) == (int)DriveTypeFixed)

{

drivesAdd(new DiskInfo(disk["Name"]ToString(), longParse(disk["Size"]ToString()), longParse(disk["FreeSpace"]ToString())));

}

}

return drives;

}

#endregion

#region 获得进程列表

///

/// 获得进程列表

///

public List GetProcessInfo()

{

List pInfo = new List();

Process[] processes = ProcessGetProcesses();

foreach (Process instance in processes)

{

try

{

pInfoAdd(new ProcessInfo(instanceId,

instanceProcessName,

instanceTotalProcessorTimeTotalMilliseconds,

instanceWorkingSet64,

instanceMainModuleFileName));

}

catch { }

}

return pInfo;

}

///

/// 获得特定进程信息

///

/// 进程名称

public List GetProcessInfo(string ProcessName)

{

List pInfo = new List();

Process[] processes = ProcessGetProcessesByName(ProcessName);

foreach (Process instance in processes)

{

try

{

pInfoAdd(new ProcessInfo(instanceId,

instanceProcessName,

instanceTotalProcessorTimeTotalMilliseconds,

instanceWorkingSet64,

instanceMainModuleFileName));

}

catch { }

}

return pInfo;

}

#endregion

#region 结束指定进程

///

/// 结束指定进程

///

/// 进程的 Process ID

public static void EndProcess(int pid)

{

try

{

Process process = ProcessGetProcessById(pid);

processKill();

}

catch { }

}

#endregion

#region 查找所有应用程序标题

///

/// 查找所有应用程序标题

///

/// 应用程序标题范型

public static List FindAllApps(int Handle)

{

List Apps = new List();

int hwCurr;

hwCurr = GetWindow(Handle, GW_HWNDFIRST);

while (hwCurr > 0)

{

int IsTask = (WS_VISIBLE | WS_BORDER);

int lngStyle = GetWindowLongA(hwCurr, GWL_STYLE);

bool TaskWindow = ((lngStyle & IsTask) == IsTask);

if (TaskWindow)

{

int length = GetWindowTextLength(new IntPtr(hwCurr));

StringBuilder sb = new StringBuilder(2 length + 1);

GetWindowText(hwCurr, sb, sbCapacity);

string strTitle = sbToString();

if (!stringIsNullOrEmpty(strTitle))

{

AppsAdd(strTitle);

}

}

hwCurr = GetWindow(hwCurr, GW_HWNDNEXT);

}

return Apps;

}

#endregion

}

}

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何获取虚拟机所在物理服务器的真实硬件信息

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情