2013-03-16 115 views
3

如何查找Mac OSX序列号。查找Mac OSX序列号

有时需要获取一个mac的序列号,然后您对此进行验证。

几年前,当我为OsiriX开发插件时,我需要同样的东西。我被要求以这种方式释放它,只有少数系统可以使用该插件。

如果我们得到比这更好的解决方案,那对我们所有人都会有帮助。

回答

15

下面的代码主要是从Technical Note TN1103, 复制与小的修改,以返回NSString,并使其与ARC编译:

#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添加到您的构建设置。

+0

写这个答案我做了一个SO搜索'kIOPlatformSerialNumberKey'这表明已经有含TN1103代码很多答案之后。 – 2013-03-16 16:10:58

+0

是的,我知道:)我只想检查我的方式是否好。如果你,Arpad和duskwuff说....我明白了我的观点:) – 2013-03-16 16:27:25

+0

这对于作为密码一部分的注册密钥的加密也很有用。 – Volomike 2016-01-16 21:13:36

1

这是解决方案的斯威夫特版本:

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 
}