ID du matériel unique dans Mac OS X
Mac OS X développement est un animal assez nouveau pour moi, et je suis en train de transférer sur certains logiciels. Pour la licence de logiciel et l'enregistrement je dois être en mesure de générer une sorte de matériel ID. Il n'a pas besoin d'être quelque chose de fantaisiste; adresse MAC Ethernet, disque dur en série, CPU en série, quelque chose comme ça.
Je l'ai couvert sur les fenêtres, mais je n'ai pas une idée sur Mac. Toute idée de ce que je dois faire, où je peux aller pour plus d'informations sur ce serait génial!
Edit:
pour quiconque est intéressé par ceci, c'est le code que J'ai fini par utiliser avec la classe QProcess de Qt:
QProcess proc;
QStringList args;
args << "-c" << "ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { print ; }'";
proc.start( "/bin/bash", args );
proc.waitForFinished();
QString uID = proc.readAll();
Note: j'utilise C++.
8 réponses
essayez cette commande de Terminal:
ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split(, line, "\""); printf("%s\n", line[4]); }'
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(, 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];
Pour 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);
}
Pourquoi ne pas essayer gethostuuid()
? Voici la documentation du manuel Mac OS X System Calls:
nom:
gethostuuid -- return a unique identifier for the current machine
SYNOPSIS:
#include <unistd.h>
int gethostuuid(uuid_t id, const struct timespec *wait);
DESCRIPTION:
la fonction gethostuuid() renvoie un uuid_t de 16 octets spécifié par id, qui identifie uniquement la machine actuelle. Sachez que les identificateurs matériels que gethostuuid() utilise pour générer L'UUID peuvent eux-mêmes être modifiés.
l'argument de l'attente est un pointer vers une structure timespec qui spécifie le temps maximum pour attendre le résultat. Mettre les champs tv_sec et tv_nsec à zéro signifie attendre indéfiniment jusqu'à ce qu'ils soient terminés.
RETURN VALUES:
la fonction gethostuuid() renvoie zéro en cas de succès ou -1 en cas d'erreur.
erreurs
Le gethostuuid fonctions() échoue 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.
ce serait plus facile de répondre si vous nous disiez quelle langue vous utilisez. L'information peut être obtenue sans aucune commande shell via le framework de configuration du système, et aussi via IOKit si vous voulez vous salir les mains.
- (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 <iostream>
#include <IOKit/IOKitLib.h>
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;
}
Fonctionnement:
system_profiler | grep 'Serial Number (system)'
dans un terminal renvoie ce qui est probablement un id unique. Cela fonctionne sur ma boîte 10.5, Je ne suis pas sûr de ce que sera la chaîne correcte dans les autres versions D'OS X.
comme certaines personnes ci-dessus l'ont laissé entendre, vous pouvez utiliser une commande de Terminal pour obtenir un ID matériel.
je suppose que vous voulez faire cela en code cependant donc je voudrais jeter un oeil à la classe NSTask dans le cacao. Il vous permet essentiellement d'exécuter des commandes de terminal à l'intérieur de votre application.
ce code est un exemple d'utilisation de NSTask dans le cacao. Il configure l'environnement pour exécuter la commande "killall". Il passe l'arguement "Finder".
c'est l'équivalent de courir "killall Finder" sur la ligne de commande, ce qui tuera le Finder évidemment.
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 (dans Applications - Utilities) contient la plupart de ce type d'information. Il a votre numéro de série et votre adresse mac (aucun lien avec Mac. Tous les ordinateurs ont une adresse mac qui est assez unique à chaque carte réseau).