如何使用 .Net Core 识别 Linux/Mac 机器的硬件详细信息

9

如何使用.Net Core识别Linux/Mac机器的硬件详细信息。

对于Windows机器,我们可以使用System.Management和WMI查询。

那么有没有类似的方法来识别Linux和Mac机器的硬件详细信息(比如RAM,处理器,显示器,摄像头等)?

对于Windows,我正在使用:

ManagementObjectSearcher searcher = 
    new ManagementObjectSearcher("select * from Win32_Processor");

我制作了一个跨平台库:https://github.com/Jinjinov/Hardware.Info - Jinjinov
2个回答

4

以下是一段在 .NET Core 中编写 Bash Linux 命令的代码:

using System;
using System.Diagnostics;
    public static class ShellHelper
    {
        public static string Bash(this string cmd)
        {
            var escapedArgs = cmd.Replace("\"", "\\\"");

            var process = new Process()
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "/bin/bash",
                    Arguments = $"-c \"{escapedArgs}\"",
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                }
            };
            process.Start();
            string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return result;
        }
    }

这是一个扩展方法,使用方法如下:

var output = "ps aux".Bash();

关于命令,可以参考VITUX上的文章Get Linux System and Hardware Details on the Command Line,其中列出了大多数用于收集Linux系统信息的命令,以帮助您编写命令。


对于MAC:

System.Management.ManagementClass mc = default(System.Management.ManagementClass);
ManagementObject mo = default(ManagementObject);
mc = new ManagementClass("Win32_NetworkAdapterConfiguration");

ManagementObjectCollection moc = mc.GetInstances();
    foreach (var mo in moc) {
        if (mo.Item("IPEnabled") == true) {
              Adapter.Items.Add("MAC " + mo.Item("MacAddress").ToString());
         }
     }

谢谢。这个在Linux机器上有用。那么Mac机器怎么做呢?请分享一些在Mac上识别的方法。 - Pascal Jackson
已更新,适用于Mac :) - Barr J

4

我已经实现了一种方法来根据平台获取硬件信息。对于 Windows,我使用了旧的系统管理类的方式,对于 Linux,我使用了不同的 Bash 命令来获取处理器 ID、型号、型号版本和机器 ID。以下是我使用的一些 Linux 命令:

1. "LinuxModel": "cat /sys/class/dmi/id/product_name"
2. "LinuxModelVersion": "cat /sys/class/dmi/id/product_version"
3. "LinuxProcessorId": "dmidecode -t processor | grep -E ID | sed 's/.*: //' | head -n 1"
4. "LinuxFirmwareVersion": "cat /sys/class/dmi/id/bios_version",
5. "LinuxMachineId": "cat /var/lib/dbus/machine-id"

期望.Net Core框架能尽快提供一些支持。

我的Github帖子地址是https://github.com/dotnet/corefx/issues/22660

我还使用了类似的扩展方法,并对bash命令进行了一些优化。

public static string Bash(this string cmd)
        {
            string result = String.Empty;

            try
            {
                var escapedArgs = cmd.Replace("\"", "\\\"");

                using (Process process = new Process())
                {
                    process.StartInfo = new ProcessStartInfo
                    {
                        FileName = "/bin/bash",
                        Arguments = $"-c \"{escapedArgs}\"",
                        RedirectStandardOutput = true,
                        UseShellExecute = false,
                        CreateNoWindow = true,
                    };

                    process.Start();
                    result = process.StandardOutput.ReadToEnd();
                    process.WaitForExit(1500);
                    process.Kill();
                };
            }
            catch (Exception ex)
            {
                //Logger.ErrorFormat(ex.Message, ex);
            }
            return result;
        }

1
你不需要使用bash来读取文本文件。你可以使用以下方法:File.ReadAllText("/sys/class/dmi/id/product_name") - Soonts
感谢更新,@Soonts。之前不知道这个。这是不是意味着除了以/sys开头的命令应该使用cat,而以/sys开头的命令应该使用File.ReadAllText(...)? - Kamran Shahid
这适用于使用 cat 读取完整文件的命令。我会在 bash 中保留此命令:dmidecode -t processor | grep -E ID | sed 's/.*: //' | head -n 1。从技术上讲,将其移植到 C# 也是可能的,但是 bash 更简单,足以胜任工作。 - Soonts
感谢@Soonts,我很想看到相应的C#代码。目前cat命令正在工作,所以我让它保持原样。但是如果我得到所有可转换的命令,一定会将代码移植到C#。 - Kamran Shahid
1
C# 中 cat 命令的等效方法是单个方法调用 File.ReadAllText。如果你想移植 dmidecode 命令,那就需要更多的工作:启动进程(二进制文件通常位于 /usr/sbin/dmidecode),然后不要使用 StandardOutput.ReadToEnd() 读取输出,而是逐行查找包含 "ID" 的第一行,然后替换 sed 正在替换的内容(我对 Linux 的经验有限,不确定它是什么),并返回该值。 - Soonts
谢谢Kosta。我会做的。 - Kamran Shahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接