32

Mac OS X の開発は、私にとってかなり新しい動物であり、いくつかのソフトウェアを移植している最中です。ソフトウェアのライセンスと登録のために、ある種のハードウェア ID を生成できる必要があります。派手なものである必要はありません。イーサネット MAC アドレス、ハード ドライブ シリアル、CPU シリアルなど。

Windows については説明しましたが、Mac についてはわかりません。私が何をする必要があるか、またはこれに関する情報をどこで入手できるかについてのアイデアは素晴らしいでしょう!

編集:

これに興味のある他の人のために、これは私が最終的に 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++ を使用しています。

4

8 に答える 8

42

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);    
}
于 2010-05-02T18:56:51.973 に答える
19

このターミナルコマンドを試してください:

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

ここから

これは、Cocoa でラップされたコマンドです (おそらくもう少しきれいにすることができます)。

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];
于 2009-06-03T10:44:50.810 に答える
12

試してみませんgethostuuid()か?Mac OS X System Calls Manual のドキュメントは次のとおりです。

名前:

 gethostuuid -- return a unique identifier for the current machine

あらすじ:

 #include <unistd.h>

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

説明:

gethostuuid() 関数は、現在のマシンを一意に識別する id で指定された 16 バイトの uuid_t を返します。gethostuuid() が UUID を生成するために使用するハードウェア識別子自体が変更される可能性があることに注意してください。

wait 引数は、結果を待つ最大時間を指定する struct timespec へのポインタです。tv_sec フィールドと tv_nsec フィールドをゼロに設定すると、完了するまで無期限に待機することになります。

戻り値:

gethostuuid() 関数は、成功するとゼロを返し、エラーの場合は -1 を返します。

エラー

次の場合、gethostuuid() 関数は失敗します。

 [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.
于 2014-04-02T02:47:57.187 に答える
9

使用している言語を教えていただけると、より簡単にお答えできます。この情報は、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];
}
于 2009-10-17T17:54:58.353 に答える
6
/*
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;
}
于 2013-12-20T14:52:06.810 に答える
1

上記の一部の人々が示唆したように、端末コマンドを使用してハードウェア ID を取得できます。

ただし、コードでこれを行いたいと思うので、Cocoa の NSTask クラスを見てみましょう。基本的に、アプリケーション内で端末コマンドを実行できます。

このコードは、Cocoa で 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];
于 2009-06-03T10:50:22.170 に答える
1

ランニング:

system_profiler | grep 'Serial Number (system)'

端末では、一意の ID である可能性が高いものを返します。それは私の 10.5 ボックスで動作しますが、OS X の他のバージョンでは正しい文字列がどうなるかわかりません。

于 2009-06-01T03:43:55.363 に答える
0

システム プロファイラー (アプリケーション - ユーティリティ内) には、この種の情報のほとんどが含まれています。シリアル番号と MAC アドレスがあります (Mac とは関係ありません。すべてのコンピュータには、すべてのネットワーク カードにほぼ固有の MAC アドレスがあります)。

于 2009-06-03T10:30:52.040 に答える