有没有一种简单的方法可以使用 API 获取 Mac 中所有硬盘的序列号?
基本上,我正在寻找硬盘的唯一标识符,通过它我可以确定该硬盘是否已被我的应用程序使用(或引用)。
如果还有其他解决方案请告诉我。
注意:我需要 10.4 及以上版本的解决方案。
我不确定“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);
从命令行:
ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial
这将为您提供内置硬盘的序列号。
我认为最好获取卷 UUID(例如,它出现在“磁盘工具”中。) UUID可以使用Disk Arbitration框架获取,该框架比IOKit级别稍高,并且更易于使用。 使用
DADiskRef
创建DADiskCreateFromBSDName
,并使用DADiskCopyDescription
获取信息字典,并查找键kDADiskDescriptionMediaUUIDKey
。挂载点等信息可以通过statfs获取。
也就是说,使用选项 -plist
调用命令行实用程序
diskutil来获取 plist 格式的信息可能会更容易。
示例代码 FSMegaInfo 也可能对如何获取有关磁盘的更多信息有启发。
下面将列出 SATA 总线上的序列号。您不知道它是哪个设备,但您可以通过一些脚本/解析来做到这一点。我使用“sed”删除所有空格,使用“awk”仅隔离序列号,以防您不熟悉:
$ system_profiler SPSerialATADataType -detailLevel medium | grep Serial | sed -e 's/[\<\>\"\ ]//g' | -F':' '{print $2}'
可以从 IORegistry 检索驱动器 ID,如下所示:
内部驱动器:IOAHCIBlockStorageDevice
string
属性“串行
“设备特性”内的“编号”,例如:(WD-WCAV5D1345345)USB 驱动器:IOUSBDevice
string
属性“USB 序列号”,例如:
(5743415654564561373734)FireWire 驱动器:IOReducedBlockServices
number
“协议特征”内的属性“GUID”,例如:
(407345709348650)Thunderbolt 驱动器:??
这些 ID 是持久的,这意味着连接到不同机器的相同外部驱动器将显示相同的 ID。
这是一个非常古老的线程,也是第一个搜索结果,所以我将添加另一个依赖于安装自制程序和smartmontools
的有用方法安装homebrew,然后...
brew install smartmontools
然后就可以运行了
smartctl -x disk0s3 | grep "Serial Number"
您将需要使用
diskutil list
命令来查找磁盘 ID
也许您可以将隐藏文件放在您的应用程序使用过的硬盘上?那是例如苹果的时间机器是如何做到的。