Skip to content

Commit

Permalink
feat: 机器信息MachineInfo增加Vendor供应商字段
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Aug 24, 2023
1 parent 2edda66 commit b90937f
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 30 deletions.
86 changes: 57 additions & 29 deletions NewLife.Core/Common/MachineInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,14 @@ public class MachineInfo
[DisplayName("系统版本")]
public String OSVersion { get; set; }

/// <summary>产品名称。制造商</summary>
/// <summary>产品名称</summary>
[DisplayName("产品名称")]
public String Product { get; set; }

/// <summary>制造商</summary>
[DisplayName("制造商")]
public String Vendor { get; set; }

/// <summary>处理器型号</summary>
[DisplayName("处理器型号")]
public String Processor { get; set; }
Expand Down Expand Up @@ -248,26 +252,49 @@ private void LoadWindowsInfo()
if (!str.IsNullOrEmpty()) Guid = str;

reg = Registry.LocalMachine.OpenSubKey(@"SYSTEM\HardwareConfig");
if (reg != null) str = (reg.GetValue("LastConfig") + "")?.Trim('{', '}').ToUpper();
if (reg != null)
{
str = (reg.GetValue("LastConfig") + "")?.Trim('{', '}').ToUpper();

// UUID取不到时返回 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
if (!str.IsNullOrEmpty() && !str.EqualIgnoreCase("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")) UUID = str;
// UUID取不到时返回 FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
if (!str.IsNullOrEmpty() && !str.EqualIgnoreCase("FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")) UUID = str;
}

reg = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\BIOS");
reg ??= Registry.LocalMachine.OpenSubKey(@"SYSTEM\HardwareConfig\Current");
if (reg != null) Product = reg.GetValue("SystemProductName") + "";
if (reg != null)
{
Product = (reg.GetValue("SystemProductName") + "").Replace("System Product Name", null);
if (Product.IsNullOrEmpty()) Product = reg.GetValue("BaseBoardProduct") + "";

Vendor = reg.GetValue("SystemManufacturer") + "";
if (Vendor.IsNullOrEmpty()) Vendor = reg.GetValue("ASUSTeK COMPUTER INC.") + "";
}

reg = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0");
if (reg != null) Processor = reg.GetValue("ProcessorNameString") + "";

// 旧版系统(如win2008)没有UUID的注册表项,需要用wmic查询。也可能因为过去的某个BUG,导致GUID跟UUID相等
if (UUID.IsNullOrEmpty() || UUID == Guid || Vendor.IsNullOrEmpty())
{
var csproduct = ReadWmic("csproduct", "Name", "UUID", "Vendor");
if (csproduct != null)
{
if (csproduct.TryGetValue("Name", out str) && !str.IsNullOrEmpty() && Product.IsNullOrEmpty()) Product = str;
if (csproduct.TryGetValue("UUID", out str) && !str.IsNullOrEmpty()) UUID = str;
if (csproduct.TryGetValue("Vendor", out str) && !str.IsNullOrEmpty()) Vendor = str;
}
}
#else
str = Execute("reg", @"query HKLM\SOFTWARE\Microsoft\Cryptography /v MachineGuid");
if (!str.IsNullOrEmpty() && str.Contains("REG_SZ")) Guid = str.Substring("REG_SZ", null).Trim();

var csproduct = ReadWmic("csproduct", "Name", "UUID");
var csproduct = ReadWmic("csproduct", "Name", "UUID", "Vendor");
if (csproduct != null)
{
if (csproduct.TryGetValue("Name", out str)) Product = str;
if (csproduct.TryGetValue("UUID", out str)) UUID = str;
if (csproduct.TryGetValue("Vendor", out str)) Vendor = str;
}
#endif
// 获取内存大小
Expand Down Expand Up @@ -386,11 +413,12 @@ private void LoadLinuxInfo()

if (device.TryGetValue("Product", out str))
Product = str;
else if (dic.TryGetValue("vendor_id", out str))
Product = str;
else if (dic.TryGetValue("Model", out str))
Product = str;

if (dic.TryGetValue("vendor_id", out str))
Vendor = str;

//if (device.TryGetValue("Fingerprint", out str) && !str.IsNullOrEmpty())
// CpuID = str;
//if (dic.TryGetValue("Serial", out str))
Expand Down Expand Up @@ -425,18 +453,21 @@ private void LoadLinuxInfo()
Product = product_name;

// 增加制造商。如 Tencent Cloud,它的产品名只有 CVM。阿里云产品名 Alibaba Cloud ECS
if (TryRead("/sys/class/dmi/id/sys_vendor", out var vendor) && !vendor.IsNullOrEmpty() && !product_name.Contains(vendor))
if (TryRead("/sys/class/dmi/id/sys_vendor", out var vendor) && !vendor.IsNullOrEmpty())
{
// 红帽KVM太流行,细化处理
if (product_name == "KVM" && vendor == "Red Hat" &&
TryRead("/sys/class/dmi/id/product_version", out var ver) && !ver.IsNullOrEmpty())
Vendor = vendor;

if (!product_name.Contains(vendor))
{
var p = ver.IndexOf('(');
if (p > 0) ver = ver[..p].Trim();
Product = ver;
// 红帽KVM太流行,细化处理
if (product_name == "KVM" && vendor == "Red Hat" &&
TryRead("/sys/class/dmi/id/product_version", out var ver) && !ver.IsNullOrEmpty())
{
var p = ver.IndexOf('(');
if (p > 0) ver = ver[..p].Trim();
Product = ver;
}
}
else
Product = $"{vendor} {product_name}";
}
}

Expand Down Expand Up @@ -809,11 +840,12 @@ private static String Execute(String cmd, String arguments = null)
/// <returns></returns>
public static IDictionary<String, String> ReadWmic(String type, params String[] keys)
{
var dic = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
var dic = new Dictionary<String, IList<String>>(StringComparer.OrdinalIgnoreCase);
var dic2 = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);

var args = $"{type} get {keys.Join(",")} /format:list";
var str = Execute("wmic", args)?.Trim();
if (str.IsNullOrEmpty()) return dic;
if (str.IsNullOrEmpty()) return dic2;

var ss = str.Split("\r\n");
foreach (var item in ss)
Expand All @@ -822,25 +854,21 @@ public static IDictionary<String, String> ReadWmic(String type, params String[]
if (ks != null && ks.Length >= 2)
{
var k = ks[0].Trim();
var v = ks[1].Trim();
var v = ks[1].Trim().TrimInvisible();
if (!k.IsNullOrEmpty() && !v.IsNullOrEmpty())
{
if (dic.TryGetValue(k, out var val))
dic[k] = val + "," + v;
else
dic[k] = v;
if (!dic.TryGetValue(k, out var list))
dic[k] = list = new List<String>();

list.Add(v);
}
}
}

// 排序,避免多个磁盘序列号时,顺序变动
var dic2 = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
foreach (var item in dic)
{
if (item.Value.Contains(','))
dic2[item.Key] = item.Value.Split(',').OrderBy(e => e.TrimInvisible()).Join();
else
dic2[item.Key] = item.Value.TrimInvisible();
dic2[item.Key] = item.Value.OrderBy(e => e).Join();
}

return dic2;
Expand Down
2 changes: 1 addition & 1 deletion NewLife.Core/Log/Logger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ protected static String GetHead()
{
sb.AppendFormat("#Memory: {0:n0}M/{1:n0}M\r\n", mi.AvailableMemory / 1024 / 1024, mi.Memory / 1024 / 1024);
sb.AppendFormat("#Processor: {0}\r\n", mi.Processor);
if (!mi.Product.IsNullOrEmpty()) sb.AppendFormat("#Product: {0}\r\n", mi.Product);
if (!mi.Product.IsNullOrEmpty()) sb.AppendFormat("#Product: {0} / {1}\r\n", mi.Product, mi.Vendor);
if (mi.Temperature > 0) sb.AppendFormat("#Temperature: {0}\r\n", mi.Temperature);
}
sb.AppendFormat("#GC: IsServerGC={0}, LatencyMode={1}\r\n", GCSettings.IsServerGC, GCSettings.LatencyMode);
Expand Down

0 comments on commit b90937f

Please sign in to comment.