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

提供: MonoBook
移動: 案内検索

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());
        }
    }
}

関連項目[編集]

参考文献[編集]