使用C#(Mono)在Mac上获取唯一系统ID

时间:2015-07-30 03:59:44

标签: c# .net macos mono hardware-id

我使用Mono移植了一个适用于Mac的Windows应用程序。我无法在Mac中使用DPAPI,我认为在Mac中为用户级程序获取主板/ CPU ID是有限制的。所以在Windows中有类似DPAPI的东西我可以使用使用Mono获得一个不会改变的唯一系统ID。

1 个答案:

答案 0 :(得分:2)

首先,远离使用MAC地址,因为那些可以改变(欺骗或硬件改变)并且不是非常Mac,即从10.3 / 4以来的方式?...从那以后" I / O Kit注册表"是获取系统ID的首选方法。放入cmd行和man ioreg以获取相同的详细信息。

所以,不确定你是否使用Xamarin.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-plat的DPAPI加密apis。