Вам необходимо предоставить доступ не только к таблицам в схеме, но и к самой схеме.
По умолчанию пользователи не могут получить доступ к любым объектам в схемах, которые им не принадлежат. Для этого владелец схемы должен предоставить привилегию USAGE для схемы.
Так что либо сделайте созданного пользователя владельцем схемы, либо предоставьте пользователю USAGE для этой схемы.
Попробуйте эту команду Терминала:
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];
Выполняется:
system_profiler | grep 'Serial Number (system)'
в терминале возвращает, вероятно, уникальный идентификатор. Это работает на моем компьютере 10.5, я не уверен, какая правильная строка будет в других версиях OS X.
Как некоторые люди выше намекали, вы можете использовать команду Терминала для получения идентификатора оборудования.
Я предполагаю, что вы хотите сделать это в коде, однако я бы взглянул на Класс 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];
Профилировщик системы (в Приложениях - Утилиты) содержит большую часть подобной информации. Он содержит ваш серийный номер и ваш Mac-адрес (не имеет отношения к Mac. Все компьютеры имеют MAC-адрес, который в значительной степени уникален для каждой сетевой карты).
На этот вопрос было бы легче ответить, если бы вы сказали нам, какой язык вы используете. Информацию можно получить без каких-либо команд оболочки через структуру 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];
}
Для 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);
}