如何通过 .NETCore 获取 Linux,Mac 的硬件信息?

咨询区

  • Pascal Jackson

请问我如何通过 .NET Core 去识别 Linux/Mac 电脑上的硬件信息?在 windows 上我可以通过 System.Management 下 WMI Query 很容易获取,比如下面的代码:

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

回答区

  • Barr J

其实很简单,你可以用 .net core 与它们的 shell 工具交互就可以了。

  1. Linux 机器

可以先看看如果用 bash 命令获取 Process IdMachine id, version 等等,比如下面这些。

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"

接下来写一个 扩展方法 来搞定。

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

然后你就可以这样使用。

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

  1. Mac 机器

你可以借助 ManagementClass 类去获取,参考如下代码:

        public static void Main(string[] args)
        {
            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 上可以和 bash 交互,在 Windows 上也可以同 cmd,powershell 交互,想获取什么信息就获取信息,学习了。

Guess you like

Origin blog.csdn.net/mzl87/article/details/121404886