Уникальный аппаратный идентификатор в Mac OS X

Вам необходимо предоставить доступ не только к таблицам в схеме, но и к самой схеме.

Из руководства :

По умолчанию пользователи не могут получить доступ к любым объектам в схемах, которые им не принадлежат. Для этого владелец схемы должен предоставить привилегию USAGE для схемы.

Так что либо сделайте созданного пользователя владельцем схемы, либо предоставьте пользователю USAGE для этой схемы.

27
задан Peter Mortensen 2 August 2010 в 22:57
поделиться

6 ответов

Попробуйте эту команду Терминала:

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];
16
ответ дан 28 November 2019 в 04:28
поделиться

Выполняется:

system_profiler | grep 'Serial Number (system)'

в терминале возвращает, вероятно, уникальный идентификатор. Это работает на моем компьютере 10.5, я не уверен, какая правильная строка будет в других версиях OS X.

1
ответ дан 28 November 2019 в 04:28
поделиться

Как некоторые люди выше намекали, вы можете использовать команду Терминала для получения идентификатора оборудования.

Я предполагаю, что вы хотите сделать это в коде, однако я бы взглянул на Класс NSTask в Какао. По сути, он позволяет вам запускать команды терминала внутри вашего приложения.

Этот код является примером того, как использовать NSTask в Какао. Он настраивает среду для выполнения команды killall. Он передает ему аргумент «Finder».

Это эквивалент запуска «killall Finder» в командной строке, который, очевидно, убивает 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];
1
ответ дан 28 November 2019 в 04:28
поделиться

Профилировщик системы (в Приложениях - Утилиты) содержит большую часть подобной информации. Он содержит ваш серийный номер и ваш Mac-адрес (не имеет отношения к Mac. Все компьютеры имеют MAC-адрес, который в значительной степени уникален для каждой сетевой карты).

0
ответ дан 28 November 2019 в 04:28
поделиться

На этот вопрос было бы легче ответить, если бы вы сказали нам, какой язык вы используете. Информацию можно получить без каких-либо команд оболочки через структуру 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];
}
8
ответ дан 28 November 2019 в 04:28
поделиться

Для 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);    
}
35
ответ дан 28 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: