代码之家  ›  专栏  ›  技术社区  ›  Gerald

Mac OS X中唯一的硬件ID

  •  27
  • Gerald  · 技术社区  · 15 年前

    MacOSX的开发对我来说是一种全新的东西,我正在移植一些软件。对于软件许可和注册,我需要能够生成某种类型的硬件ID。它不需要任何花哨的东西;以太网MAC地址、硬盘驱动器串行、CPU串行等等。

    我把它装在窗户上了,但我对麦克一无所知。任何关于我需要做什么,或者我可以去哪里获取信息的想法都是很好的!

    编辑:

    对于任何其他对此感兴趣的人,这是我最后使用qt的qprocess类的代码:

    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++。

    8 回复  |  直到 7 年前
        1
  •  14
  •   Community rohancragg    13 年前

    尝试此终端命令:

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

    here

    下面是用可可包起来的命令(可能会更干净一点):

    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];
    
        2
  •  34
  •   yairchu    14 年前

    对于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);    
    }
    
        3
  •  8
  •   cf-    10 年前

    为什么不试试 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);
    

    描述:

    函数的作用是:返回一个由id指定的16字节的uuid,它唯一地标识当前机器。请注意,gethostuid()用于生成uuid的硬件标识符本身可以修改。

    wait参数是指向指定等待结果的最长时间的结构timespec的指针。将“TV-SEC”和“TV-NSEC”字段设置为零意味着无限期地等待,直到完成为止。

    返回值:

    函数的作用是:成功时返回零,错误时返回-1。

    错误

    如果出现以下情况,gethostuid()函数将失败:

     [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.
    
        4
  •  8
  •   Shebuka    10 年前

    如果你告诉我们你用的是什么语言,这会更容易回答。通过系统配置框架,不需要任何shell命令就可以获得信息,如果您想让自己的手变得很脏,还可以通过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];
    }
    
        5
  •  5
  •   Nitinkumar Ambekar    11 年前
    /*
    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;
    }
    
        6
  •  1
  •   kbyrd    15 年前

    运行:

    system_profiler | grep 'Serial Number (system)'
    

    在终端中,返回一个可能唯一的ID。在我的10.5框中,我不确定在其他版本的OS X中正确的字符串是什么。

        7
  •  1
  •   Brock Woolf    15 年前

    正如上面的一些人所暗示的,您可以使用终端命令来获取硬件ID。

    不过,我假设您希望在代码中这样做,所以我将查看cocoa中的nstask类。它基本上允许您在应用程序内部运行终端命令。

    此代码是如何在Cocoa中使用nstask的示例。它设置环境来执行“killall”命令。它通过了争论“发现者”。

    这就相当于在命令行上运行“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];
    
        8
  •  0
  •   Singletoned    15 年前

    系统探查器(在应用程序-实用程序中)包含大多数此类信息。它有您的序列号和您的MAC地址(与MAC无关)。所有计算机都有一个MAC地址,这对于每个网卡来说都是非常独特的)。

    推荐文章