Xamarin.MacでMac本体のシリアル番号を取得する
ナビゲーションに移動
検索に移動
Xamarin.MacでSMCKitを使いたくてその大元となる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());
}
}
}