سؤال

تطوير Mac OS X حيوان جديد إلى حد ما بالنسبة لي، وأنا بصدد تشغيل بعض البرامج. للحصول على ترخيص البرامج والتسجيل، أحتاج إلى أن أكون قادرا على إنشاء نوع من معرف الجهاز. لا يجب أن يكون أي شيء يتوهم؛ عنوان إيثرنت MAC، محرك الأقراص الصلبة التسلسل، المسلسل وحدة المعالجة المركزية، شيء من هذا القبيل.

لقد حصلت عليها مغطاة في Windows، لكنني ليس لدي أدنى فكرة على ماك. أي فكرة عما أحتاج إليه، أو حيث يمكنني الذهاب للحصول على معلومات حول هذا سيكون رائعا!

يحرر:

بالنسبة لأي شخص آخر مهتم بهذا، هذا هو الرمز الذي انتهى بي الأمر باستخدام فئة QProcess 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();

ملاحظة: أنا أستخدم C ++.

هل كانت مفيدة؟

المحلول

جرب الأمر المحطة الطرفية:

ioreg -rd1 -c IOPlatformExpertDevice | awk '/IOPlatformUUID/ { split($0, 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($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];

نصائح أخرى

ل 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);    
}

لماذا لا تحاول gethostuuid()ب إليك الوثائق من دليل مكالمات نظام Mac OS X:

اسم:

 gethostuuid -- return a unique identifier for the current machine

ملخص:

 #include <unistd.h>

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

وصف:

تقوم الدالة GetHostuaD () بإرجاع uuid_t 16 بايت محددة بواسطة المعرف، والتي تحدد بشكل فريد الجهاز الحالي. أن تدرك أن معرفات الأجهزة التي تستخدمها Gethoostuuid () لتوليد Uuid يمكن تعديلها.

تتمثل حجة الانتظار مؤشرا إلى TimeSpec بنية تحدد الحد الأقصى للوقت لانتظار النتيجة. يعد إعداد حقول TV_SEC و TV_NSEC إلى الصفر للانتظار إلى أجل غير مسمى حتى يكمله.

قيم العودة:

تقوم الدالة GetHoostuaid () بإرجاع الصفر على النجاح أو -1 عند الخطأ.

أخطاء

فشل وظائف GetHoostUID () إذا:

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

سيكون هذا أسهل في الإجابة إذا أخبرتنا عن اللغة التي كنت تستخدمها. يمكن الحصول على المعلومات دون أي أوامر Shell من خلال إطار SystemConfiguration، وكذلك من خلال Iokit إذا كنت ترغب في الحصول على يديك قذرة حقا.

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

ادارة:

system_profiler | grep 'Serial Number (system)'

في محطة إرجاع ما من المحتمل أن يكون معرف فريد. التي تعمل على صندوقي 10.5، لست متأكدا مما ستكون السلسلة الصحيحة في إصدارات أخرى من نظام التشغيل X.

كما لمح بعض الأشخاص أعلاه، يمكنك استخدام أمر محطة للحصول على معرف الأجهزة.

أفترض أنك تريد القيام بذلك في التعليمات البرمجية، لكنني سألقي نظرة على فئة NSTASK في الكاكاو. يتيح لك أساسا تشغيل أوامر الطرفية داخل التطبيق الخاص بك.

هذا الرمز هو مثال على كيفية استخدام NSTASK في الكاكاو. يقوم بإعداد البيئة لتنفيذ أمر "Killall". يمره "الباحث" الجان.

إنها متساوية من تشغيل "Killall Finder" في سطر الأوامر، مما سيقتل الباحث بوضوح.

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

يحتوي نظام Profiler (في التطبيقات - المرافق) على معظم هذا النوع من المعلومات. يحتوي على رقمك التسلسلي وعنوان MAC الخاص بك (لا علاقة بنك. تحتوي جميع أجهزة الكمبيوتر على عنوان MAC الذي هو فريد من نوعه إلى حد كبير لكل بطاقة شبكة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top