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

提供: MonoBook
2018年7月18日 (水) 10:57時点におけるimported>Administratorによる版 (→‎実装)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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

実装

リンゴマークの「このMacについて」で表示される「シリアル番号」がコンソールに表示されるだけのサンプル。一般人にはとくに役に立つものではない。会社や学校なんかで数百台の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());
        }
    }
}

関連項目

参考文献