咨询区
Pascal Jackson:
请问我如何通过 .NET Core 去识别 Linux/Mac
电脑上的硬件信息?在 windows 上我可以通过 System.Management
下 WMI Query 很容易获取,比如下面的代码:
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_Processor");
回答区
Barr J:
其实很简单,你可以用 .net core
与它们的 shell 工具交互就可以了。
Linux 机器
可以先看看如果用 bash 命令获取 Process Id
, Machine 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();
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 交互,想获取什么信息就获取信息,学习了。