Xamarin.MacでMac本体のシリアル番号を取得する

提供: MonoBook
2018年7月18日 (水) 10:55時点におけるimported>Administratorによる版 (Administrator がページ「Xamarin.Mac/本体のシリアル番号を取得する」を「Xamarin.MacでMac本体のシリアル番号を取得する」に移動しました)
ナビゲーションに移動 検索に移動

Xamarin.MacSMCKitを使いたくてその大元となるIOKitの使い方を調べていたら拾った。 最終的には「IOConnectCallStructMethod」を使いたいわけだが、そこまでたどりつけないので途中経過で得たものをメモしておく。

実装

リンゴマークの「このMacについて」で表示される「シリアル番号」がコンソールに表示されるだけのサンプル。 とくに役に立つものではない。

using Foundation;
using AppKit;

namespace SMCKitSample
{
    static class MainClass
    {
        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        static extern uint IOServiceGetMatchingService(IOMasterPort masterPort, IntPtr matching);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        static extern IntPtr IOServiceMatching(string s);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        static extern IntPtr IORegistryEntryCreateCFProperty(uint entry, IntPtr key, IntPtr allocator, uint options);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        static extern int IOObjectRelease(uint o);

        public enum IOMasterPort : uint
        {
            Default = 0,
        };

        public static string GetSerialNumber()
        {
            string serialNumber = string.Empty;
            uint service = 0;

            try
            {
                IntPtr matching = IOServiceMatching("IOPlatformExpertDevice");
                service = IOServiceGetMatchingService(IOMasterPort.Default, matching);
                if (service == 0)
                {
                    return string.Empty;
                }

                NSString key = (NSString)"IOPlatformSerialNumber";
                IntPtr serialHandle = IORegistryEntryCreateCFProperty(service, key.Handle, IntPtr.Zero, 0);
                if (serialHandle != IntPtr.Zero)
                {
                    serialNumber = NSString.FromHandle(serialHandle);
                }
            }
            finally
            {
                if (service != 0)
                {
                    IOObjectRelease(service);
                }
            }

            return serialNumber;
        }

        public static void Main(string[] args)
        {
            NSApplication.Init();
            Console.WriteLine(GetSerialNumber());
        }
    }
}

関連項目

参考文献