c++macosuniquehardware-id

Unique hardware ID in Mac OS X


Mac OS X development is a fairly new animal for me, and I'm in the process of porting over some software. For software licensing and registration I need to be able to generate some kind of hardware ID. It doesn't have to be anything fancy; Ethernet MAC address, hard drive serial, CPU serial, something like that.

I've got it covered on Windows, but I haven't a clue on Mac. Any idea of what I need to do, or where I can go for information on this would be great!

Edit:

For anybody else that is interested in this, this is the code I ended up using with Qt's QProcess class:

QProcess proc;

QStringList args;
args << "-c" << "ioreg -rd1 -c IOPlatformExpertDevice |  awk '/IOPlatformUUID/ { print $3; }'";
proc.start( "/bin/bash", args );
proc.waitForFinished();

QString uID = proc.readAll();

Note: I'm using C++.


Solution

  • Try this Terminal command:

    ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, line, "\""); printf("%s\n", line[4]); }'
    

    From here

    Here is that command wrapped in Cocoa (which could probably be made a bit cleaner):

    NSArray * args = [NSArray arrayWithObjects:@"-rd1", @"-c", @"IOPlatformExpertDevice", @"|", @"grep", @"model", nil];
    NSTask * task = [NSTask new];
    [task setLaunchPath:@"/usr/sbin/ioreg"];
    [task setArguments:args];
    
    NSPipe * pipe = [NSPipe new];
    [task setStandardOutput:pipe];
    [task launch];
    
    NSArray * args2 = [NSArray arrayWithObjects:@"/IOPlatformUUID/ { split($0, line, \"\\\"\"); printf(\"%s\\n\", line[4]); }", nil];
    NSTask * task2 = [NSTask new];
    [task2 setLaunchPath:@"/usr/bin/awk"];
    [task2 setArguments:args2];
    
    NSPipe * pipe2 = [NSPipe new];
    [task2 setStandardInput:pipe];
    [task2 setStandardOutput:pipe2];
    NSFileHandle * fileHandle2 = [pipe2 fileHandleForReading];
    [task2 launch];
    
    NSData * data = [fileHandle2 readDataToEndOfFile];
    NSString * uuid = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];