Question

Le développement Mac OS X est un moi assez nouveau pour animaux, et je suis en train de porter sur certains logiciels. Pour les licences de logiciels et l'enregistrement que je dois être en mesure de générer une sorte d'ID de matériel. Il ne doit pas être quelque chose de fantaisie; Adresse MAC Ethernet, série du disque dur, série du processeur, quelque chose comme ça.

Je l'ai couvert sur Windows, mais je n'ai pas la moindre idée sur Mac. Toute idée de ce que je dois faire, ou où je peux trouver des informations sur ce serait génial!

Edit:

Pour quelqu'un d'autre qui est intéressé, c'est le code que je fini avec l'aide de la classe 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();

Note:. J'utilise C ++

Était-ce utile?

La solution

Essayez cette commande Terminal:

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

De

est que commande enveloppé dans Cocoa (qui pourrait probablement être fait un peu plus propre):

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

Autres conseils

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 système Mac OS X appels Manuel:

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 () retourne un uuid_t 16 octets spécifié par identifiant, identifiant de manière unique la machine courante. Sachez que les identifiants matériels qui gethostuuid () utilise pour générer l'UUID peut se modifier.

     

L'argument d'attente est un pointeur vers une struct timespec qui spécifie le délai maximum d'attente pour le résultat. Réglage de la tv_sec et les champs tv_nsec à zéro signifie d'attendre indéfiniment jusqu'à ce qu'il soit terminé.

Valeurs de retour:

  

La fonction gethostuuid () renvoie zéro en cas de succès ou -1 en cas d'erreur.

ERREURS

  

Les fonctions gethostuuid () é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 avez dit ce que la langue que vous utilisez. Les informations peut être obtenue sans aucune commande shell à travers le cadre de SystemConfiguration, et aussi par IOKit si vous voulez obtenir vos mains vraiment sale.

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

Course à pied:

system_profiler | grep 'Serial Number (system)'

dans un terminal retourne ce qu'il est probable un identifiant unique. Cela fonctionne sur ma boîte 10.5, je ne suis pas sûr de ce que la chaîne correcte sera dans d'autres versions de Mac OS X.

Comme certaines personnes ci-dessus ont laissé entendre, vous pouvez utiliser une commande Terminal pour obtenir un ID matériel.

Je suppose que vous voulez faire dans le code mais si je prendrais un coup d'œil à la classe NSTask à Cocoa. Il permet essentiellement d'exécuter les commandes du terminal dans votre application.

Ce code est un exemple de la façon d'utiliser NSTask à Cocoa. Elle met en place l'environnement pour exécuter la commande « killall ». Il passe le arguement "Finder".

Il est le equivilent de courir « killall Finder » sur la ligne de commande, ce qui va tuer 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];

Système (dans Applications - Utilitaires) contient plus de ce genre d'info. Il a le numéro de série et votre adresse MAC (sans relation avec Mac. Tous les ordinateurs ont une adresse MAC qui est à peu près unique à chaque carte réseau).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top