是否有一种简单的方法可以使用API获取Mac中所有硬盘的序列号?
基本上,我正在寻找硬盘的唯一标识符,我可以用它来判断硬盘是否已被我的应用程序使用(或引用)。
如果有任何其他解决方案,请告诉我。
注意:我需要10.4及以上的解决方案。
答案 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)
答案 6 :(得分:0)
也许您可以将隐藏文件放在应用已使用的硬盘上?那是例如苹果的Time Machine是如何做到的。