「Xamarin.MacでMac本体のシリアル番号を取得する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「Xamarin.MacでSMCKitを使いたくてその大元となるIOKitの使い方を調べていたら拾った。 最終的には「IOConnectCallStructMethod」を使いた...」)
 
imported>Administrator
 
(2人の利用者による、間の5版が非表示)
1行目: 1行目:
Xamarin.MacでSMCKitを使いたくてその大元となるIOKitの使い方を調べていたら拾った。
+
[[Xamarin.Mac]]で[[SMCKit]]を使いたくてその大元となる[[IOKit]]の使い方を調べていたら拾った。
 
最終的には「IOConnectCallStructMethod」を使いたいわけだが、そこまでたどりつけないので途中経過で得たものをメモしておく。
 
最終的には「IOConnectCallStructMethod」を使いたいわけだが、そこまでたどりつけないので途中経過で得たものをメモしておく。
  
 
== 実装 ==
 
== 実装 ==
リンゴマークの「このMacについて」で表示される「シリアル番号」がコンソールに表示されるだけのサンプル。
+
リンゴマークの「このMacについて」で表示される「シリアル番号」がコンソールに表示されるだけのサンプル。一般人にはとくに役に立つものではない。会社や学校なんかで数百台のMacがある場合にはこれを応用して管理すると便利だよ。
  
 
<source lang="csharp">
 
<source lang="csharp">
73行目: 73行目:
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[Xamarin.Mac/ディスプレイのスリープを解除する]]
 
* [[Xamarin.Mac/ディスプレイのスリープを解除する]]
 +
* [[Xamarin.Mac/アプリのメモリ使用量を取得する]]
 +
* [[macOS/シリアル番号を取得する]]
  
 
== 参考文献 ==
 
== 参考文献 ==
78行目: 80行目:
  
 
{{stub}}
 
{{stub}}
 +
 +
[[category: Xamarin.Mac]]

2018年7月18日 (水) 10:57時点における最新版

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

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]