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 "; } } } }