using Masuit.Tools.Hardware;
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using static System.String;
namespace Masuit.Tools.Win32
{
///
/// Windows系统的系列方法
///
public static class Windows
{
///
/// 跨平台调用C++的方法
///
/// 程序句柄
///
[DllImport("psapi.dll")]
private static extern int EmptyWorkingSet(IntPtr hwProc);
///
/// 清理系统内存,返回优化内存后的内存占用率
///
/// 优化内存后的内存占用率
public static double ClearMemory()
{
ClearMemorySilent();
Thread.Sleep(1000);
return SystemInfo.GetRamInfo().MemoryUsage;
}
///
/// 静默清理系统内存
///
public static void ClearMemorySilent()
{
GC.Collect();
GC.WaitForPendingFinalizers();
foreach (var p in Process.GetProcesses())
{
using (p)
{
if ((p.ProcessName.Equals("System")) && (p.ProcessName.Equals("Idle")))
{
//两个系统的关键进程,不整理
continue;
}
try
{
EmptyWorkingSet(p.Handle);
}
catch
{
// ignored
}
}
}
GC.Collect();
}
///
/// 运行一个控制台程序并返回其输出参数。
///
/// 程序名
/// 输入参数
/// 是否在控制台输出日志
///
public static string RunApp(string filename, string arguments, bool recordLog)
{
try
{
if (recordLog)
{
Trace.WriteLine(filename + " " + arguments);
}
using var proc = new Process
{
StartInfo =
{
FileName = filename,
CreateNoWindow = true,
Arguments = arguments,
RedirectStandardOutput = true,
UseShellExecute = false
}
};
proc.Start();
using var sr = new System.IO.StreamReader(proc.StandardOutput.BaseStream, Encoding.Default);
//上面标记的是原文,下面是我自己调试错误后自行修改的
Thread.Sleep(100); //貌似调用系统的nslookup还未返回数据或者数据未编码完成,程序就已经跳过直接执行
if (!proc.HasExited) //在无参数调用nslookup后,可以继续输入命令继续操作,如果进程未停止就直接执行
{
proc.Kill();
}
string txt = sr.ReadToEnd();
if (recordLog)
{
Trace.WriteLine(txt);
}
return txt;
}
catch (Exception ex)
{
Trace.WriteLine(ex);
return ex.Message;
}
}
///
/// 获取操作系统版本
///
///
public static string GetOsVersion()
{
try
{
return Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion")?.GetValue("ProductName").ToString();
}
catch (Exception)
{
return "未能获取到操作系统版本,可能是当前程序无管理员权限,如果是web应用程序,请将应用程序池的高级设置中的进程模型下的标识设置为:LocalSystem;如果是普通桌面应用程序,请提升管理员权限后再操作。";
}
}
}
///
/// 服务器信息
///
public class WindowsServer
{
///
/// CPUID
///
public string CpuId; //CPU的ID
///
/// CPU插槽数
///
public int CpuCount; //CPU的个数
///
/// CPU主频
///
public string[] CpuMhz; //CPU频率 单位:hz
///
/// mac地址
///
public string MacAddress; //计算机的MAC地址
///
/// 硬盘ID
///
public string DiskId; //硬盘的ID
///
/// 硬盘大小
///
public string DiskSize; //硬盘大小 单位:bytes
///
/// IP地址
///
public string IpAddress; //计算机的IP地址
///
/// 系统当前登录用户
///
public string LoginUserName; //操作系统登录用户名
///
/// 计算机名
///
public string ComputerName; //计算机名
///
/// 操作系统架构
///
public string SystemType; //系统类型
///
/// 物理内存,单位MB
///
public string TotalPhysicalMemory; //总共的内存 单位:M
private static WindowsServer _instance;
///
/// 获取实例
///
public static WindowsServer Instance => _instance ??= new WindowsServer();
///
/// 构造函数
///
public WindowsServer()
{
var cpuInfo = SystemInfo.GetCpuInfo();
CpuId = cpuInfo[0].DeviceID;
CpuCount = cpuInfo.Count;
CpuMhz = cpuInfo.Select(c => c.CurrentClockSpeed).ToArray();
MacAddress = SystemInfo.GetMacAddress()[0];
DiskId = GetDiskID();
DiskSize = GetSizeOfDisk();
IpAddress = SystemInfo.GetLocalUsedIP().ToString();
LoginUserName = GetUserName();
SystemType = GetSystemType();
TotalPhysicalMemory = GetTotalPhysicalMemory();
ComputerName = GetComputerName();
}
///
/// 获取磁盘大小
///
///
public static string GetSizeOfDisk()
{
using var mc = new ManagementClass("Win32_DiskDrive");
using var moc = mc.GetInstances();
foreach (var m in moc)
{
using (m)
{
return m.Properties["Size"].Value.ToString();
}
}
return "-1";
}
private string GetDiskID()
{
try
{
//获取硬盘ID
string hdid = Empty;
using var mc = new ManagementClass("Win32_DiskDrive");
foreach (ManagementObject mo in mc.GetInstances())
{
using (mo)
{
hdid = (string)mo.Properties["Model"].Value;
}
}
return hdid;
}
catch
{
return "unknow ";
}
}
///
/// 操作系统的登录用户名
///
///
private string GetUserName()
{
try
{
string st = Empty;
using var mc = new ManagementClass("Win32_ComputerSystem");
foreach (ManagementObject mo in mc.GetInstances())
{
using (mo)
{
st = mo["UserName"].ToString();
}
}
return st;
}
catch
{
return "unknow ";
}
}
private string GetSystemType()
{
try
{
string st = Empty;
using var mc = new ManagementClass("Win32_ComputerSystem");
foreach (var o in mc.GetInstances())
{
using (o)
{
var mo = (ManagementObject)o;
st = mo["SystemType"].ToString();
}
}
return st;
}
catch
{
return "unknow ";
}
}
private string GetTotalPhysicalMemory()
{
try
{
string st = Empty;
using var mc = new ManagementClass("Win32_ComputerSystem");
using var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject)o;
st = mo["TotalPhysicalMemory"].ToString();
}
return st;
}
catch
{
return "unknow ";
}
}
private string GetComputerName()
{
try
{
return Environment.GetEnvironmentVariable("ComputerName");
}
catch
{
return "unknow ";
}
}
}
}