Files
ww-jst/wmsjst/JSMachine.WMS.Infrastructure/SystemInfo.cs
T
2026-09-02 16:31:50 +08:00

141 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text.RegularExpressions;
using JSMachine.WMS.Infrastructure.Helper;
using Microsoft.Win32;
namespace JSMachine.DCS.Infrastructure
{
public static class SystemInfo
{
private const string ExtractionFailed = "<Extraction Failed>";
public static readonly string Caption;
public static readonly string CSName;
public static readonly string InstallDate;
public static readonly string OSArchitecture;
public static readonly string SerialNumber;
public static readonly string Version;
public static readonly long TotalVisibleMemorySize;
public static readonly string CPUName;
public static readonly DotNetFramework DotNetFrameworkVersion;
static SystemInfo()
{
var extractionRegex = new Regex("(\\w+?) ?= ?\"(.+?)\";", RegexOptions.Compiled | RegexOptions.Multiline);
var systemInfo = GetManagementInfo("SELECT * FROM Win32_OperatingSystem", extractionRegex);
var processorInfo = GetManagementInfo("SELECT * FROM Win32_Processor", extractionRegex);
Caption = systemInfo.GetValue("Caption");
CSName = systemInfo.GetValue("CSName");
InstallDate = systemInfo.GetValue("InstallDate");
OSArchitecture = systemInfo.GetValue("OSArchitecture");
SerialNumber = systemInfo.GetValue("SerialNumber");
Version = systemInfo.GetValue("Version");
TotalVisibleMemorySize = systemInfo.GetValue("TotalVisibleMemorySize").CastTo<long>();
CPUName = processorInfo.GetValue("Name");
DotNetFrameworkVersion = Get45PlusFromRegistry();
}
private static IReadOnlyDictionary<string, string> GetManagementInfo(string query, Regex regex)
{
try
{
var result = new ManagementObjectSearcher(new ObjectQuery(query));
var infoString = string.Empty;
using (var collection = result.Get())
{
foreach (var item in collection)
{
var managementObject = item as ManagementObject;
infoString = managementObject?.GetText(TextFormat.Mof);
if (!string.IsNullOrEmpty(infoString)) break;
}
}
if (string.IsNullOrEmpty(infoString)) return null;
return regex.Matches(infoString).OfType<Match>()
.Where(item => item.Success)
.ToDictionary(item => item.Groups[1].Value, item => item.Groups[2].Value);
}
catch (Exception e)
{
LogHelper.Error("An unexpected exception occured while getting management info. ", e);
return null;
}
}
private static string GetValue(this IReadOnlyDictionary<string, string> info, string key)
{
return info != null && info.TryGetValue(key, out var value) ? value : ExtractionFailed;
}
/*
* Refer to:
* Check Framework 45+: https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed#net_d;
*/
private static DotNetFramework Get45PlusFromRegistry()
{
const string subKey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (RegistryKey ndpKey = RegistryKey
.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
.OpenSubKey(subKey))
{
return ndpKey?.GetValue("Release") != null
? CheckFor45PlusVersion((int)ndpKey.GetValue("Release"))
: DotNetFramework.Unknown;
}
}
// Checking the version using >= will enable forward compatibility.
private static DotNetFramework CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 461808)
return DotNetFramework.V472OrLater;
if (releaseKey >= 461308)
return DotNetFramework.V471;
if (releaseKey >= 460798)
return DotNetFramework.V47;
if (releaseKey >= 394802)
return DotNetFramework.V462;
if (releaseKey >= 394254)
return DotNetFramework.V461;
if (releaseKey >= 393295)
return DotNetFramework.V46;
if (releaseKey >= 379893)
return DotNetFramework.V452;
if (releaseKey >= 378675)
return DotNetFramework.V451;
if (releaseKey >= 378389)
return DotNetFramework.V45;
// This code should never execute. A non-null release key should mean
// that 4.5 or later is installed.
return DotNetFramework.V472OrLater;
}
}
public enum DotNetFramework
{
Unknown,
V45,
V451,
V452,
V46,
V461,
V462,
V47,
V471,
V472OrLater
}
}