web-dev-qa-db-ja.com

Mac OSXの一意のハードウェアID

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++を使用しています。

27
Gerald

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

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

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
yairchu

gethostuuid()を試してみませんか? Mac OSXシステムコールマニュアルのドキュメントは次のとおりです。

名前:

 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引数は、結果を待機する最大時間を指定するstructtimespecへのポインターです。 tv_secフィールドとtv_nsecフィールドをゼロに設定すると、完了するまで無期限に待機することになります。

戻り値:

Gethostuuid()関数は、成功した場合は0を返し、エラーの場合は-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.
8
zhanglin

使用している言語を教えていただければ、答えが簡単になります。この情報は、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
Azeem.Butt
/*
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;
}
5

ランニング:

system_profiler | grep 'Serial Number (system)'

ターミナルでは、一意のIDである可能性が高いものを返します。これは私の10.5ボックスで機能しますが、他のバージョンのOSXで正しい文字列がどうなるかわかりません。

1
kbyrd

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

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

このコードは、CocoaでNSTaskを使用する方法の例です。 「killall」コマンドを実行するための環境をセットアップします。それはそれを議論「ファインダー」に渡します。

これは、コマンドラインで「killallFinder」を実行するのと同じで、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
Brock Woolf

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

0
Singletoned