在Mac上使用c# (Mono)获得唯一系统ID

本文关键字:唯一 ID 系统 Mono Mac | 更新日期: 2023-09-27 18:05:32

我正在用Mono为Mac移植一个windows应用程序。我不能在Mac中使用DPAPI,我认为在Mac中获得用户级程序的主板/CPU id有限制。所以有一些像DPAPI在窗口,我可以使用使用Mono来获得一个唯一的系统id,不会改变。

在Mac上使用c# (Mono)获得唯一系统ID

首先,不要使用MAC地址,因为这些地址可能会改变(欺骗或硬件改变),并且自10.3/4以来不是一个非常MAC的方式…从那时起,"I/O Kit注册表"是获得系统id的首选方法。拖到cmd行和man ioreg以获取相同的详细信息。

所以,不确定你是否在使用Xamarin。Mac或非Mac,所以如果你你可以绑定IOKit IORegistryEntryFromPath/IORegistryEntryCreateCFProperty api因为我不相信这些目前在c#包装器中,但我使用的快速方法是:

using System;
using System.Diagnostics;
using System.Text;
namespace uuidmac
{
    class MainClass
    {
        static string MacUUID ()
        {
            var startInfo = new ProcessStartInfo () {
                FileName = "sh",
                Arguments = "-c '"ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/''"",
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                RedirectStandardInput = true,
                UserName = Environment.UserName
            };
            var builder = new StringBuilder ();
            using (Process process = Process.Start (startInfo)) {
                process.WaitForExit ();
                builder.Append (process.StandardOutput.ReadToEnd ());
            }
            return builder.ToString ();
        }
        public static int Main (string[] args)
        {
            Console.WriteLine (MacUUID ());
            return 0;
        }
    }
}

示例输出:

 "IOPlatformUUID" = "9E134619-9999-9999-9999-90DC147C61A9"

你也可以解析出"IOPlatformSerialNumber"而不是"IOPlatformUUID",如果你想要一些人类可读的东西,有人可以在"关于这台Mac"的主对话框中找到技术支持电话…

现在,如果你正在考虑在MS DPAPI中存储和保护信息,KeyChain是这样做的地方(OSX/iOS)。Mono确实有一些基于x平台的DPAPI加密api。