开发者

How to get Machine's Serial Number

I want to fetch the machine's serial number key. Does any body help me on ho开发者_开发技巧w to fetch the machine's serial number?


There is no Cocoa API for this. You have to call into 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;
}

The above code comes from here


This is from 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);
        }
   }
}

I'd be careful though, it mentions some caveats about not making any assumptions about the S/N length or anything

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜