ID de hardware único en Mac OS X

El desarrollo de Mac OS X es un animal bastante nuevo para mí, y estoy en el proceso de migrar a través de algún software. Para la licencia de software y el registro, debo ser capaz de generar algún tipo de identificación de hardware. No tiene que ser nada sofisticado; Dirección MAC de Ethernet, serie de disco duro, serie de CPU, algo así.

Lo tengo cubierto en Windows, pero no tengo ni idea de Mac. ¡Cualquier idea de lo que tengo que hacer, o dónde puedo obtener información sobre esto sería genial!

Editar:

Para cualquiera que esté interesado en esto, este es el código que terminé usando con la clase QProcess de Qt:

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(); 

Nota: estoy usando C ++.

Pruebe este comando de Terminal:

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

De aquí

Aquí está el comando envuelto en Cocoa (que probablemente podría estar un poco más limpio):

 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]; 

Para C / C ++:

 void get_platform_uuid(char * buf, int bufSize) { io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/"); CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0); IOObjectRelease(ioRegistryRoot); CFStringGetCString(uuidCf, buf, bufSize, kCFStringEncodingMacRoman); CFRelease(uuidCf); } 

¿Por qué no probar gethostuuid() ? Aquí está la documentación del Manual de llamadas del sistema Mac OS X:

NOMBRE:

  gethostuuid -- return a unique identifier for the current machine 

SINOPSIS:

  #include  int gethostuuid(uuid_t id, const struct timespec *wait); 

DESCRIPCIÓN:

La función gethostuuid () devuelve un uuid_t de 16 bytes especificado por id, que identifica de manera única a la máquina actual. Tenga en cuenta que los identificadores de hardware que gethostuuid () usa para generar el UUID pueden modificarse ellos mismos.

El argumento de espera es un puntero a una struct timespec que especifica el tiempo máximo para esperar el resultado. Establecer los campos tv_sec y tv_nsec en cero significa esperar indefinidamente hasta que se complete.

VALORES DEVUELTOS:

La función gethostuuid () devuelve cero en caso de éxito o -1 en error.

ERRORES

La función gethostuuid () falla si:

  [EFAULT] wait points to memory that is not a valid part of the process address space. [EWOULDBLOCK] The wait timeout expired before the UUID could be obtained. 

Esto sería más fácil de responder si nos dijera qué idioma estaba usando. La información se puede obtener sin comandos de shell a través del marco de trabajo SystemConfiguration, y también a través de IOKit si quiere ensuciarse las manos.

 - (NSString*) getMACAddress: (BOOL)stripColons { NSMutableString *macAddress = nil; NSArray *allInterfaces = (NSArray*)SCNetworkInterfaceCopyAll(); NSEnumerator *interfaceWalker = [allInterfaces objectEnumerator]; SCNetworkInterfaceRef curInterface = nil; while ( curInterface = (SCNetworkInterfaceRef)[interfaceWalker nextObject] ) { if ( [(NSString*)SCNetworkInterfaceGetBSDName(curInterface) isEqualToString:@"en0"] ) { macAddress = [[(NSString*)SCNetworkInterfaceGetHardwareAddressString(curInterface) mutableCopy] autorelease]; if ( stripColons == YES ) { [macAddress replaceOccurrencesOfString: @":" withString: @"" options: NSLiteralSearch range: NSMakeRange(0, [macAddress length])]; } break; } } return [[macAddress copy] autorelease]; } 
 /* g++ mac_uuid.cpp -framework CoreFoundation -lIOKit */ #include  #include  using namespace std; void get_platform_uuid(char * buf, int bufSize) { io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/"); CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0); IOObjectRelease(ioRegistryRoot); CFStringGetCString(uuidCf, buf, bufSize, kCFStringEncodingMacRoman); CFRelease(uuidCf); } int main() { char buf[512] = ""; get_platform_uuid(buf, sizeof(buf)); cout < < buf << endl; } 

Corriendo:

 system_profiler | grep 'Serial Number (system)' 

en un terminal devuelve lo que probablemente sea una identificación única. Eso funciona en mi caja 10.5, no estoy seguro de cuál será la cadena correcta en otras versiones de OS X.

Como han insinuado algunas personas de arriba, puede usar un comando de Terminal para obtener una ID de hardware.

Supongo que quieres hacer esto en el código, así que echaría un vistazo a la clase NSTask en Cocoa. Básicamente, le permite ejecutar comandos de terminal dentro de su aplicación.

Este código es un ejemplo de cómo usar NSTask en Cocoa. Configura el entorno para ejecutar el comando “killall”. Lo pasa el argumento “Buscador”.

Es el equivalente de ejecutar “killall Finder” en la línea de comando, lo que matará obviamente al buscador.

 NSTask *aTask = [[NSTask alloc] init]; NSMutableArray *args = [NSMutableArray array]; [aTask setLaunchPath: @"/usr/bin/killall"]; [args addObject:[@"/Applications/Finder" lastPathComponent]]; [aTask setArguments:args]; [aTask launch]; [aTask release]; 

System Profiler (en Aplicaciones – Utilidades) contiene la mayor parte de este tipo de información. Tiene su número de serie y su dirección MAC (sin relación con Mac. Todas las computadoras tienen una dirección MAC que es prácticamente única para cada tarjeta de red).