230 lines
4.9 KiB
C#
230 lines
4.9 KiB
C#
using System;
|
|||
|
|
using System.Globalization;
|
||
|
|
using System.Management;
|
||
|
|
using System.Runtime.InteropServices;
|
||
|
|
using System.Text;
|
||
|
|
using Microsoft.Win32;
|
||
|
|
|
||
|
|
namespace Crysome.Client.SystemInfo;
|
||
|
|
|
||
|
|
public class SystemInformation
|
||
|
|
{
|
||
|
|
private struct OSVERSIONINFOEX
|
||
|
|
{
|
||
|
|
public uint dwOSVersionInfoSize;
|
||
|
|
|
||
|
|
public uint dwMajorVersion;
|
||
|
|
|
||
|
|
public uint dwMinorVersion;
|
||
|
|
|
||
|
|
public uint dwBuildNumber;
|
||
|
|
|
||
|
|
public uint dwPlatformId;
|
||
|
|
|
||
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||
|
|
public string szCSDVersion;
|
||
|
|
|
||
|
|
public ushort wServicePackMajor;
|
||
|
|
|
||
|
|
public ushort wServicePackMinor;
|
||
|
|
|
||
|
|
public ushort wSuiteMask;
|
||
|
|
|
||
|
|
public byte wProductType;
|
||
|
|
|
||
|
|
public byte wReserved;
|
||
|
|
}
|
||
|
|
|
||
|
|
public string UserName { get; set; }
|
||
|
|
|
||
|
|
public string ComputerName { get; set; }
|
||
|
|
|
||
|
|
public string OperatingSystem { get; set; }
|
||
|
|
|
||
|
|
public string ActiveWindowTitle { get; set; }
|
||
|
|
|
||
|
|
public string Uptime { get; set; }
|
||
|
|
|
||
|
|
public string CountryCode { get; set; }
|
||
|
|
|
||
|
|
public string GPU { get; set; }
|
||
|
|
|
||
|
|
[DllImport("user32.dll")]
|
||
|
|
private static extern IntPtr GetForegroundWindow();
|
||
|
|
|
||
|
|
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
|
||
|
|
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
|
||
|
|
|
||
|
|
[DllImport("ntdll.dll")]
|
||
|
|
private static extern int RtlGetVersion(ref OSVERSIONINFOEX versionInfo);
|
||
|
|
|
||
|
|
public static SystemInformation Get()
|
||
|
|
{
|
||
|
|
return new SystemInformation
|
||
|
|
{
|
||
|
|
UserName = Environment.UserName,
|
||
|
|
ComputerName = Environment.MachineName,
|
||
|
|
OperatingSystem = GetOSVersion(),
|
||
|
|
ActiveWindowTitle = GetActiveWindow(),
|
||
|
|
Uptime = GetUptime(),
|
||
|
|
CountryCode = GetCountryCode(),
|
||
|
|
GPU = GetGPU()
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetGPU()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
using ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
|
||
|
|
using ManagementObjectCollection.ManagementObjectEnumerator managementObjectEnumerator = managementObjectSearcher.Get().GetEnumerator();
|
||
|
|
if (managementObjectEnumerator.MoveNext())
|
||
|
|
{
|
||
|
|
return ((ManagementObject)managementObjectEnumerator.Current)["Name"]?.ToString() ?? "N/A";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
}
|
||
|
|
return "N/A";
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetActiveWindow()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
IntPtr foregroundWindow = GetForegroundWindow();
|
||
|
|
if (foregroundWindow == IntPtr.Zero)
|
||
|
|
{
|
||
|
|
return "N/A";
|
||
|
|
}
|
||
|
|
StringBuilder stringBuilder = new StringBuilder(256);
|
||
|
|
GetWindowText(foregroundWindow, stringBuilder, 256);
|
||
|
|
string text = stringBuilder.ToString();
|
||
|
|
return string.IsNullOrEmpty(text) ? "N/A" : text;
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
return "N/A";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetUptime()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
TimeSpan timeSpan = TimeSpan.FromMilliseconds(Environment.TickCount & 0x7FFFFFFF);
|
||
|
|
return $"{(int)timeSpan.TotalDays}d {timeSpan.Hours}h {timeSpan.Minutes}m {timeSpan.Seconds}s";
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
return "N/A";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetCountryCode()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
return RegionInfo.CurrentRegion.TwoLetterISORegionName;
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
return "US";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetOSVersion()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
OSVERSIONINFOEX versionInfo = new OSVERSIONINFOEX
|
||
|
|
{
|
||
|
|
dwOSVersionInfoSize = (uint)Marshal.SizeOf(typeof(OSVERSIONINFOEX))
|
||
|
|
};
|
||
|
|
if (RtlGetVersion(ref versionInfo) == 0)
|
||
|
|
{
|
||
|
|
string text = BuildToOSName(versionInfo.dwBuildNumber);
|
||
|
|
if (!string.IsNullOrEmpty(text))
|
||
|
|
{
|
||
|
|
string displayVersion = GetDisplayVersion();
|
||
|
|
if (!string.IsNullOrEmpty(displayVersion))
|
||
|
|
{
|
||
|
|
text = text + " " + displayVersion;
|
||
|
|
}
|
||
|
|
return text;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
}
|
||
|
|
try
|
||
|
|
{
|
||
|
|
using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
|
||
|
|
if (registryKey != null)
|
||
|
|
{
|
||
|
|
string text2 = registryKey.GetValue("ProductName", "")?.ToString() ?? "";
|
||
|
|
if (int.TryParse(registryKey.GetValue("CurrentBuildNumber", "")?.ToString() ?? "", out var result) && result >= 22000 && text2.Contains("Windows 10"))
|
||
|
|
{
|
||
|
|
text2 = text2.Replace("Windows 10", "Windows 11");
|
||
|
|
}
|
||
|
|
if (!string.IsNullOrEmpty(text2))
|
||
|
|
{
|
||
|
|
return text2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
}
|
||
|
|
return "Windows";
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string GetDisplayVersion()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
|
||
|
|
return registryKey?.GetValue("DisplayVersion", "")?.ToString() ?? "";
|
||
|
|
}
|
||
|
|
catch
|
||
|
|
{
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private static string BuildToOSName(uint build)
|
||
|
|
{
|
||
|
|
if (build >= 22000)
|
||
|
|
{
|
||
|
|
return "Windows 11";
|
||
|
|
}
|
||
|
|
if (build >= 10240)
|
||
|
|
{
|
||
|
|
return "Windows 10";
|
||
|
|
}
|
||
|
|
if (build >= 9600)
|
||
|
|
{
|
||
|
|
return "Windows 8.1";
|
||
|
|
}
|
||
|
|
if (build >= 9200)
|
||
|
|
{
|
||
|
|
return "Windows 8";
|
||
|
|
}
|
||
|
|
if (build >= 7600)
|
||
|
|
{
|
||
|
|
return "Windows 7";
|
||
|
|
}
|
||
|
|
if (build >= 6000)
|
||
|
|
{
|
||
|
|
return "Windows Vista";
|
||
|
|
}
|
||
|
|
if (build >= 2600)
|
||
|
|
{
|
||
|
|
return "Windows XP";
|
||
|
|
}
|
||
|
|
return "";
|
||
|
|
}
|
||
|
|
}
|