0

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

4

1 回答 1

3

首先,不要使用 MAC 地址,因为这些地址可能会发生变化(欺骗或硬件更改),并且自 10.3/4 以来就不是一种非常 Mac'ie 的方式?...从那时起,“I/O Kit 注册表”是首选方法获取系统ID。拖放到 cmd 行并man ioreg获取相同的详细信息。

所以,不确定您是否使用 Xamarin.Mac,所以如果您是,您可以绑定 IOKit IORegistryEntryFromPath/IORegistryEntryCreateCFProperty API,因为我不相信这些 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”...

现在,如果您正在考虑在 MS DPAPI 中存储和保护信息,那么 KeyChain 就是这样做的地方(OSX/iOS)。Mono 确实有一些基于 x-plat 的 DPAPI 加密 API。

于 2015-07-30T05:50:47.093 回答