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();
if (recordLog)
{
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();
Trace.WriteLine(txt);
return txt;
}
return "";
}
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
{
return Environment.OSVersion.VersionString;
}
}
///
/// 获取当前进程的CPU使用率
///
///
public static float GetCpuUsageForProcess()
{
using var process = Process.GetCurrentProcess();
var currentProcessName = process.ProcessName;
using var cpuCounter = new PerformanceCounter("Process", "% Processor Time", currentProcessName);
cpuCounter.NextValue();
return cpuCounter.NextValue();
}
///
/// 获取进程的CPU使用率
///
/// 进程名字
///
public static float GetCpuUsageForProcess(string processName)
{
using var cpuCounter = new PerformanceCounter("Process", "% Processor Time", processName);
cpuCounter.NextValue();
return cpuCounter.NextValue();
}
}
///
/// 服务器信息
///
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
using var mc = new ManagementClass("Win32_DiskDrive");
using var moc = mc.GetInstances();
foreach (ManagementObject o in moc)
{
using (o)
{
return (string)o.Properties["Model"].Value;
}
}
return Empty;
}
catch
{
return "unknow ";
}
}
///
/// 操作系统的登录用户名
///
///
private string GetUserName()
{
try
{
using var mc = new ManagementClass("Win32_ComputerSystem");
using var moc = mc.GetInstances();
foreach (ManagementObject o in moc)
{
using (o)
{
return o["UserName"].ToString();
}
}
return Empty;
}
catch
{
return "unknow ";
}
}
private string GetSystemType()
{
try
{
using var mc = new ManagementClass("Win32_ComputerSystem");
using var moc = mc.GetInstances();
foreach (ManagementObject o in moc)
{
using (o)
{
return o["SystemType"].ToString();
}
}
return Empty;
}
catch
{
return "unknow ";
}
}
private string GetTotalPhysicalMemory()
{
try
{
using var mc = new ManagementClass("Win32_ComputerSystem");
using var moc = mc.GetInstances();
foreach (ManagementObject o in moc)
{
using (o)
{
return o["TotalPhysicalMemory"].ToString();
}
}
return Empty;
}
catch
{
return "unknow ";
}
}
private string GetComputerName()
{
try
{
return Environment.GetEnvironmentVariable("ComputerName");
}
catch
{
return "unknow ";
}
}
}
}