Frage

Mac OS X Entwicklung ist ein ziemlich neues Tier für mich, und ich bin in den Prozess einige Software portieren über. Für Software-Lizenzierung und Registrierung muss ich in der Lage sein, eine Art von Hardware-ID zu erzeugen. Es muss nicht alles sein Phantasie; Ethernet-MAC-Adresse, Festplatten-Serie, CPU-Serien, so ähnlich.

Ich habe es unter Windows bedeckt, aber ich habe keine Ahnung, auf dem Mac. Jede Idee, was ich tun muss, oder wo ich Informationen gehen auf das wäre toll!

Edit:

Für alle anderen, die daran interessiert ist, das ist der Code, den ich mit Qt QProcess Klasse am Ende mit:

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

. Hinweis: Ich verwende C ++

War es hilfreich?

Lösung

Versuchen Sie, diesen Terminal-Befehl:

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

hier

Hier ist dieser Befehl eingewickelt in Cocoa (was wahrscheinlich ein wenig sauberer gemacht werden könnte):

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

Andere Tipps

Für 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);    
}

Warum nicht versuchen gethostuuid()? Hier ist die Dokumentation aus dem Mac OS X-Systemaufrufe Handbuch:

NAME:

 gethostuuid -- return a unique identifier for the current machine

SYNOPSIS:

 #include <unistd.h>

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

Beschreibung:

  

Die gethostuuid () Funktion gibt einen 16-Byte-uuid_t nach ID angegeben ist, die eindeutig die aktuelle Maschine identifiziert. Beachten Sie, dass die Hardware-IDs, die gethostuuid () verwendet die UUID zu erzeugen, können sich verändert werden.

     

Das Warten Argument ist ein Zeiger auf eine Struktur timespec, die die maximale Zeit für das Ergebnis zu warten, angibt. Einstellen der tv_sec und tv_nsec Felder auf Null bedeutet, auf unbestimmte Zeit zu warten, bis es abgeschlossen ist.

Rückgabewerte:

  

Die gethostuuid () gibt Null auf Erfolg oder -1 bei einem Fehler.

FEHLER

  

Die gethostuuid () Funktionen schlägt fehl, wenn:

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

Dies wäre leichter zu beantworten, wenn Sie uns gesagt, welche Sprache Sie verwendet haben. Die Informationen sind erhältlich ohne Shell-Befehle durch den Systemconfiguration Rahmen, und auch durch IOKit, wenn Sie Ihre Hände wirklich schmutzig zu machen.

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

Beim Laufen:

system_profiler | grep 'Serial Number (system)'

in einem Terminal zurückgibt, was es wahrscheinlich eine eindeutige ID. Das funktioniert auf meiner 10.5 Box, ich bin mir nicht sicher, was die richtige Zeichenfolge in anderen Versionen von OS X sein wird.

Wie einige Leute oben angedeutet haben, können Sie einen Terminal-Befehl verwenden, um eine Hardware-ID zu erhalten.

Ich nehme an, Sie wollen dies jedoch in Code tun, damit ich einen Blick auf die NSTask Klasse in Cocoa nehmen würde. Es läßt Sie im Allgemeinen Terminal-Befehle in Ihrer Anwendung ausgeführt werden.

Dieser Code ist ein Beispiel dafür, wie NSTask in Cocoa zu verwenden. Es richtet die Umgebung, um den „killall“ Befehl auszuführen. Es gibt sie den arguement "Finder".

Es ist die equivilent des Laufens „killall Finder“ auf der Kommandozeile, die die Finder tötet offensichtlich.

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 (in Anwendungen - Dienstprogramme) enthält die meisten dieser Art von Informationen. Es hat Ihre Seriennummer und MAC-Adresse (nicht verwandt mit dem Mac. Alle Computern verfügen über eine MAC-Adresse, das jede Netzwerkkarte so ziemlich einzigartig ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top