如何获得机器的序列号

问题描述 投票:2回答:2

我想获取机器的序列号密钥。有没有人帮我了解如何获取机器的序列号?

objective-c macos
2个回答
3
投票

没有Cocoa API。你必须打电话给Carbon。

#import <Carbon/Carbon.h>
#import<IOKit/IOKitLib.h>
#import <mach/mach.h>

NSString*   UKSystemSerialNumber()
{
    mach_port_t             masterPort;
    kern_return_t           kr = noErr;
    io_registry_entry_t     entry;
    CFTypeRef               prop;
    CFTypeID                propID;
    NSString*               str = nil;

    kr = IOMasterPort(MACH_PORT_NULL, &masterPort);
    if( kr != noErr )
        goto cleanup;
    entry = IORegistryGetRootEntry( masterPort );
    if( entry == MACH_PORT_NULL )
        goto cleanup;
    prop = IORegistryEntrySearchCFProperty(entry, kIODeviceTreePlane, CFSTR("serial-number"), nil, kIORegistryIterateRecursively);
    if( prop == nil )
        goto cleanup;
    propID = CFGetTypeID( prop );
    if( propID != CFDataGetTypeID() )
        goto cleanup;

    const char* buf = [(NSData*)prop bytes];
    int         len = [(NSData*)prop length],
                 x;

    char    secondPart[256];
    char    firstPart[256];
    char*   currStr = secondPart; // Version number starts with second part, then NULLs, then first part.
    int     y = 0;

    for( x = 0; x < len; x++ )
    {
        if( buf[x] > 0 && (y < 255) )
            currStr[y++] = buf[x];
        else if( currStr == secondPart )
        {
            currStr[y] = 0;     // Terminate string.
            currStr = firstPart;
            y = 0;
        }
    }
    currStr[y] = 0; // Terminate string.

    str = [NSString stringWithFormat: @"%s%s", firstPart, secondPart];

cleanup:
    mach_port_deallocate( mach_task_self(), masterPort );

    return str;
}

以上代码来自here


3
投票

这是来自Technical Note TN1103

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

// Returns the serial number as a CFString.
// It is the caller's responsibility to release the returned CFString when done with it.
void CopySerialNumber(CFStringRef *serialNumber)
{
    if (serialNumber != NULL) {
        *serialNumber = NULL;

        io_service_t    platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
                                       IOServiceMatching("IOPlatformExpertDevice"));

        if (platformExpert) {
            CFTypeRef serialNumberAsCFString =
                IORegistryEntryCreateCFProperty(platformExpert,
                                            CFSTR(kIOPlatformSerialNumberKey),
                                            kCFAllocatorDefault, 0);
            if (serialNumberAsCFString) {
                *serialNumber = serialNumberAsCFString;
            }

            IOObjectRelease(platformExpert);
        }
   }
}

不过我会小心,它提到了一些关于不对S / N长度做任何假设的警告

© www.soinside.com 2019 - 2024. All rights reserved.