查找Mac OSX序列号

6

如何查找Mac OSX序列号。

有时需要获取Mac的序列号,以便验证。

几年前,我为OsiriX开发插件时也需要这个信息。我被要求以这种方式发布它,只有少数系统可以使用该插件。

如果我们能找到比这更好的解决方案,那将对我们所有人都非常有帮助。

3个回答

19
以下代码主要是从技术笔记TN1103中复制而来,只作了少量修改以返回一个NSString并且使其能够编译通过:
#include <IOKit/IOKitLib.h>

- (NSString *)getSerialNumber
{
    NSString *serial = nil;
    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                     IOServiceMatching("IOPlatformExpertDevice"));
    if (platformExpert) {
        CFTypeRef serialNumberAsCFString =
        IORegistryEntryCreateCFProperty(platformExpert,
                                        CFSTR(kIOPlatformSerialNumberKey),
                                        kCFAllocatorDefault, 0);
        if (serialNumberAsCFString) {
            serial = CFBridgingRelease(serialNumberAsCFString);
        }

        IOObjectRelease(platformExpert);
    }
    return serial;
}

你需要将 IOKit.framework 添加到你的构建设置中。


在回答完这个问题后,我进行了一次SO搜索,搜索关键词为kIOPlatformSerialNumberKey,结果显示已经有很多答案包含了TN1103中的代码。 - Martin R
是的,我知道 :) 我只是想检查一下我的方法是否好用。如果你、Arpad和duskwuff都说可以……那我就明白了 :) - Anoop Vaidya
这对于将注册密钥作为密码的一部分进行加密也非常有用。 - Volomike

9
这是解决方案的Swift版本:
var serialNumber: String? {
  let platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice") )

  guard platformExpert > 0 else {
    return nil
  }

  guard let serialNumber = (IORegistryEntryCreateCFProperty(platformExpert, kIOPlatformSerialNumberKey as CFString, kCFAllocatorDefault, 0).takeUnretainedValue() as? String) else {
    return nil
  }


  IOObjectRelease(platformExpert)

  return serialNumber
}

3

这是基于Martin上面提到的TN1103的C++版本。

C++示例:

#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>

std::string example_class::getSerialNumber()
{
    CFStringRef serial;
    char buffer[64] = {0};
    std::string seriaNumber("");
    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                                          IOServiceMatching("IOPlatformExpertDevice"));
    if (platformExpert)
    {
        CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,
                                                                       CFSTR(kIOPlatformSerialNumberKey),
                                                                       kCFAllocatorDefault, 0);
        if (serialNumberAsCFString) {
            serial = (CFStringRef)serialNumberAsCFString;
        }
        if (CFStringGetCString(serial, buffer, 64, kCFStringEncodingUTF8)) {
            seriaNumber = buffer;
        }

        IOObjectRelease(platformExpert);
    }
    return seriaNumber;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接