Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何从Mac硬盘获取序列号?_Macos_Cocoa - Fatal编程技术网

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

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

有没有一种简单的方法可以使用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);
#包括
#包括
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相同

我认为最好获取卷UUID(例如,它出现在磁盘实用程序中) UUID可以使用该框架获得,该框架略高于IOKit,并且更易于使用。 使用
dadiskcreatefromsdname
创建
DADiskRef
,使用
DADiskCopyDescription
获取信息字典,并查找键
kdadiskdescriptionmediauidkey
。有关安装点等的信息可通过以下方式获得

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


示例代码还可以指导如何获取有关磁盘的更多信息。

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

  • 内部驱动器:IOAHCIBlockStorageDevice
    string
    property“串行 编号“内部”设备特征,例如:(WD-WCAV5D1345)

  • USB驱动器:iUSB设备
    字符串
    属性“USB序列号”,例如: (57434156545645561373734)

  • FireWire驱动器:IOReducedBlockServices
    number
    property“GUID”位于“协议特征”内,例如: (407345709348650)

  • 霹雳驱动:

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

从命令行:

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不同,原因有很多,一个驱动器可以有多个卷,驱动器的卷不一定要有