如何从Mac硬盘获取序列号?

时间:2010-01-07 09:15:25

标签: macos cocoa

是否有一种简单的方法可以使用API​​获取Mac中所有硬盘的序列号?

基本上,我正在寻找硬盘的唯一标识符,我可以用它来判断硬盘是否已被我的应用程序使用(或引用)。

如果有任何其他解决方案,请告诉我。

注意:我需要10.4及以上的解决方案。

7 个答案:

答案 0 :(得分:12)

我不确定“AppleUSBEHCI”是否适合查找,但您可以使用IOKit框架检索此类数据:

#include <IOKit/IOKitLib.h>
#include <Cocoa/Cocoa.h>

kern_return_t   kr;
io_iterator_t   io_objects;
io_service_t    io_service;

kr = IOServiceGetMatchingServices(kIOMasterPortDefault,
            IOServiceNameMatching("AppleUSBEHCI"), &io_objects);

if(kr != KERN_SUCCESS)
    exit(1);

while((io_service= IOIteratorNext(io_objects)))
{
    kr = IORegistryEntryCreateCFProperties(io_service, &service_properties, kCFAllocatorDefault, kNilOptions);
    if(kr == KERN_SUCCESS)
    {
        NSDictionary * m = (NSDictionary *)service_properties;
        NSLog(@"%@", m);
        CFRelease(service_properties);
    }

    io_iterator_t   iter;
    //handle kr error
    kr = IORegistryEntryGetChildIterator(io_service, kIOServicePlane, &iter);

    io_registry_entry_t     child;
    while( (child = IOIteratorNext( iter )))
    {
        kr = IORegistryEntryCreateCFProperties(child, &child_props,  kCFAllocatorDefault, kNilOptions );
        NSLog(@"Child props: %@", child_props);
        //release child_props
    }

    IOObjectRelease(io_service);
}

IOObjectRelease(io_objects);

答案 1 :(得分:8)

从命令行:

ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial

这将为您提供内置硬盘的序列号。

答案 2 :(得分:6)

我认为最好获得Volume UUID(例如,出现在“磁盘工具”中)。 可以使用Disk Arbitration框架获取UUID,该框架略高于IOKit并且更易于使用。 使用DADiskRef创建DADiskCreateFromBSDName,并使用DADiskCopyDescription获取信息字典,然后查找密钥kDADiskDescriptionMediaUUIDKey。有关挂载点等的信息可以通过statfs获得。

也就是说,使用选项-plist调用命令行实用程序diskutil以获取plist格式的信息可能更容易。

示例代码FSMegaInfo如何获取有关磁盘的更多信息也可能具有指导意义。

答案 3 :(得分:2)

可以从IORegistry检索驱动器ID,如下所示:

  • 内部驱动器:IOAHCIBlockStorageDevice string属性“Serial 数字“内部”设备特征“例如:(WD-WCAV5D1345345)

  • USB驱动器:IOUSBDevice string属性“USB序列号”例如: (5743415654564561373734)

  • FireWire驱动器:“协议特性”中的IOReducedBlockServices number属性“GUID”,例如: (407345709348650)

  • Thunderbolt驱动器:??

这些ID是持久性的,意味着连接到不同计算机的相同外部驱动器将显示相同的ID。

答案 4 :(得分:2)

以下将列出SATA总线上的序列号。你不知道它是哪个设备,但你可以通过一些脚本/解析来完成它。我使用“sed”删除所有空格,并使用“awk”来隔离序列,以防你不熟悉:

$ system_profiler SPSerialATADataType -detailLevel medium | grep Serial | sed -e 's/[\<\>\"\ ]//g' | -F':' '{print $2}'

答案 5 :(得分:1)

查看IOKit

Mac上有两个方便的工具可以找出它的可能性:

  • ioreg,一个命令行工具
  • IORegistryExplorer,与GUI相同。

答案 6 :(得分:0)

也许您可以将隐藏文件放在应用已使用的硬盘上?那是例如苹果的Time Machine是如何做到的。