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++.

26
demandé sur Peter Mortensen 2009-06-01 07:32:36

8 réponses

essayez cette commande de Terminal:

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

ici

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];
14
répondu xyz 2011-07-08 07:49:44

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);    
}
32
répondu yairchu 2010-05-02 18:56:51

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.
7
répondu zhanglin 2014-04-02 03:11:41

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];
}
7
répondu Azeem.Butt 2015-01-26 15:27:37
/*
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;
}
5
répondu Nitinkumar Ambekar 2013-12-20 14:52:06

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.

1
répondu kbyrd 2009-06-01 03:43:55

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];
1
répondu Brock Woolf 2009-10-17 06:16:20

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).

0
répondu Singletoned 2009-06-03 10:30:52