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

问题描述 投票:0回答:8

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

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

如果还有其他解决方案请告诉我。

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

macos cocoa
8个回答
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);

9
投票

从命令行:

ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial

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


6
投票

我认为最好获取卷 UUID(例如,它出现在“磁盘工具”中。) UUID可以使用Disk Arbitration框架获取,该框架比IOKit级别稍高,并且更易于使用。 使用

DADiskRef
创建
DADiskCreateFromBSDName
,并使用
DADiskCopyDescription
获取信息字典,并查找键
kDADiskDescriptionMediaUUIDKey
。挂载点等信息可以通过statfs获取。

也就是说,使用选项 -plist 调用命令行实用程序

diskutil
来获取 plist 格式的信息可能会更容易。

示例代码 FSMegaInfo 也可能对如何获取有关磁盘的更多信息有启发。


3
投票

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

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

2
投票

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

  • 内部驱动器:IOAHCIBlockStorageDevice

    string
    属性“串行 “设备特性”内的“编号”,例如:(WD-WCAV5D1345345)

  • USB 驱动器:IOUSBDevice

    string
    属性“USB 序列号”,例如: (5743415654564561373734)

  • FireWire 驱动器:IOReducedBlockServices

    number
    “协议特征”内的属性“GUID”,例如: (407345709348650)

  • Thunderbolt 驱动器:??

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


1
投票

看看IOKit

Mac 上有两个方便的工具可以帮助您了解它的可能性:

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

0
投票

这是一个非常古老的线程,也是第一个搜索结果,所以我将添加另一个依赖于安装自制程序和smartmontools

的有用方法

安装homebrew,然后...

brew install smartmontools

然后就可以运行了

smartctl -x disk0s3 | grep "Serial Number"

您将需要使用

diskutil list
命令来查找磁盘 ID


-1
投票

也许您可以将隐藏文件放在您的应用程序使用过的硬盘上?那是例如苹果的时间机器是如何做到的。

© www.soinside.com 2019 - 2024. All rights reserved.