如何查找 Mac OSX 序列号。
有时需要获取 mac 的序列号,然后您对其进行验证。
几年前,当我为OsiriX开发插件时,我也需要同样的东西。我被要求以这种方式发布它,只有少数系统可以使用该插件。
如果我们得到比这更好的解决方案,那对我们所有人都会有很大帮助。
如何查找 Mac OSX 序列号。
有时需要获取 mac 的序列号,然后您对其进行验证。
几年前,当我为OsiriX开发插件时,我也需要同样的东西。我被要求以这种方式发布它,只有少数系统可以使用该插件。
如果我们得到比这更好的解决方案,那对我们所有人都会有很大帮助。
以下代码主要是从Technical Note TN1103复制而来,稍作修改以返回 an 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 添加到您的构建设置中。
这是解决方案的 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
}
这是基于 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;
}