Macos 如何从Mac硬盘获取序列号?
有没有一种简单的方法可以使用API获取Mac中所有硬盘的序列号 基本上,我在寻找硬盘的唯一标识符,通过它我可以判断我的应用程序是否使用(或引用)了硬盘 如果还有其他解决方案,请告诉我 注意:对于10.4及以上版本,我需要此解决方案。我不确定“AppleUSBEHCI”是否适合查找,但您可以使用IOKit框架检索此类数据:Macos 如何从Mac硬盘获取序列号?,macos,cocoa,Macos,Cocoa,有没有一种简单的方法可以使用API获取Mac中所有硬盘的序列号 基本上,我在寻找硬盘的唯一标识符,通过它我可以判断我的应用程序是否使用(或引用)了硬盘 如果还有其他解决方案,请告诉我 注意:对于10.4及以上版本,我需要此解决方案。我不确定“AppleUSBEHCI”是否适合查找,但您可以使用IOKit框架检索此类数据: #include <IOKit/IOKitLib.h> #include <Cocoa/Cocoa.h> kern_return_t kr; io
#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);
#包括
#包括
kern_return_t kr;
io_迭代器\u t io_对象;
输入输出服务输入输出服务;
kr=IOServiceGetMatchingServices(kIOMasterPortDefault,
IOServiceNameMatching(“AppleUSBEHCI”)、&io_对象);
if(kr!=KERN_SUCCESS)
出口(1);
而((io_服务=IOIteratorNext(io_对象)))
{
kr=IORegistryEntryCreateCProperties(io_服务和服务_属性、kCFAllocatorDefault、kNilOptions);
if(kr==KERN_SUCCESS)
{
NSDictionary*m=(NSDictionary*)服务_属性;
NSLog(@“%@”,m);
CFRelease(服务和财产);
}
io迭代器iter;
//处理kr错误
kr=IORegistryEntryGetChildIterator(io_服务、kIOServicePlane和iter);
io\u注册表\u条目\u t子项;
while((child=IOIteratorNext(iter)))
{
kr=IORegistryEntryCreateCProperties(儿童和儿童道具、kCFAllocatorDefault、骑士);
NSLog(@“儿童道具:%@”,儿童道具);
//释放儿童道具
}
IOObjectRelease(io_服务);
}
IOObjectRelease(io_对象);
也许你可以将一个隐藏文件放在你的应用程序使用过的硬盘上?这就是苹果的时间机器的工作原理。看看
您的Mac电脑上有两个方便的工具可用于了解其可能性:
- ioreg,一个命令行工具
- IORegistryExplorer,与GUI相同
dadiskcreatefromsdname
创建DADiskRef
,使用DADiskCopyDescription
获取信息字典,并查找键kdadiskdescriptionmediauidkey
。有关安装点等的信息可通过以下方式获得
也就是说,使用选项-plist
调用命令行实用程序以获取plist格式的信息可能更容易
示例代码还可以指导如何获取有关磁盘的更多信息。可以从iRegistry检索驱动器ID,如下所示:
- 内部驱动器:IOAHCIBlockStorageDevice
property“串行 编号“内部”设备特征,例如:(WD-WCAV5D1345)string
- USB驱动器:iUSB设备
属性“USB序列号”,例如: (57434156545645561373734)字符串
- FireWire驱动器:IOReducedBlockServices
property“GUID”位于“协议特征”内,例如: (407345709348650)number
- 霹雳驱动:
ioreg-rd1-w0-c AppleAHCIDiskDriver | grep Serial
这将为您提供内置硬盘的序列号。以下将列出SATA总线上的序列号。您不知道它是哪个设备,但您可以通过一些脚本/解析来完成。我已使用“sed”删除所有空格,并使用“awk”仅隔离序列,以防您不熟悉:
$ system_profiler SPSerialATADataType -detailLevel medium | grep Serial | sed -e 's/[\<\>\"\ ]//g' | -F':' '{print $2}'
$system\u profiler spserialatatype-detailLevel medium | grep Serial | sed-e的//[\\\“\]//g'.-F':''{print$2}'
AppleAHCIDiskDriver-连接的硬盘不是USB。通过查看系统档案器,USB HD使用的是“主机控制器驱动程序:AppleUSBEHCI”“因此,我尝试使用AppleUSBEHCI代替AppleAHCIDiskDriver,但没有得到任何结果。我不确定我遗漏了什么。在继续IOKit路径之前,你可能想试试mouviciel的答案。对于连接到USB的设备,请执行IOServiceNameMatching(“AppleUSBEHCI”),然后使用IORegistryEntryGetChildIterator(io_服务、kIOServicePlane和iter)遍历其所有子项。我感谢您的帮助。我使用了mouviciel解决方案,但不起作用。当我尝试使用IORegistryEntryGetChildIterator时,它返回错误(268435459),我只是在IOServiceGetMatchingServices之后调用它,不确定我缺少了什么。您可能在迭代器上调用了IORegistryEntryGetChildIterator,这没有意义。我已经编辑了我的答案,以演示如何迭代ioregistryentry的子项。请注意,我已经用U盘进行了测试-HDD可能以相同的方式出现,也可能不以相同的方式出现。在编写生产代码之前,您需要先阅读一下IOKit。它成功了,您是对的,我在迭代器上被称为IORegistryEntryGetChildIterator。我会考虑你在去生产前读IOKit的建议。谢谢你的帮助。谢谢你提供的宝贵信息。据我所知,UUID是在系统中生成的,不确定它是否是唯一的。在我的系统中,我无法看到设备的UUID。UUID是通用唯一ID的首字母缩写,它是唯一的。例如,它用于控制在/etc/fstab
中装载什么。你看不到UUID也很奇怪。diskutil info/dev/disk0s2
在您的机器上返回什么?您没有看到列表中的条目Volume UUID
?您可能需要将上面的/disk0s2
更改为您实际拥有的内容。首先使用diskutil list
检查。卷ID在概念上与驱动器ID不同,原因有很多,一个驱动器可以有多个卷,驱动器的卷不一定要有