2012-04-27 63 views
3

我已经搜索stackoverflow.com和谷歌的答案,但找不到任何东西。获取USB硬盘的序列号(Mac OS)

我得到属于外部USB HDD(disk1)的分区(disk1s1)的bsdName。

我需要找出该外部硬盘的序列号。 我已经尝试了以下(寻找与BSD名称服务):

io_service_t io_service = IOServiceGetMatchingService(kIOMasterPortDefault,IOBSDNameMatching(kIOMasterPortDefault, 0, [@"disk1" cStringUsingEncoding:NSUTF8StringEncoding])); 

与存在的问题是:返回的服务类型是IOMedia其中有没有现场USB Serial Number。我结束了同一个问题,如果我使用DiskArbitration框架(这是IOMedia的abstraktion)

所以我想周围的其他方法:获取所有IOUSBDevice服务遍历他们只需按一下该IOUSBDevice的bsdName或分区。遗憾的是,IOUSBDevice中没有关于任何分区或bsd名称的信息。

任何人都可以帮我解决这个问题吗?

进一步的信息:

  • 的XCode 4.3.2
  • 的Mac OS X的狮子(10.7.3)

编辑: 这里是输出的最有趣的部分,如果我遍历所有IOUSBDevice或AppleUSBEHCI io_services:

Child props: { 
"Bus Power Available" = 250; 
"Device Speed" = 2; 
IOCFPlugInTypes =  { 
    "9dc7b780-9ec0-11d4-a54f-000a27052861" = "IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle"; 
}; 
IOGeneralInterest = "IOCommand is not serializable"; 
IOUserClientClass = IOUSBDeviceUserClientV2; 
"Low Power Displayed" = 0; 
PortNum = 3; 
"Requested Power" = 250; 
"USB Address" = 6; 
"USB Product Name" = "Mass Storage Device"; 
"USB Serial Number" = 09021000000000003740385375; 
"USB Vendor Name" = JetFlash; 
bDeviceClass = 0; 
bDeviceProtocol = 0; 
bDeviceSubClass = 0; 
bMaxPacketSize0 = 64; 
bNumConfigurations = 1; 
bcdDevice = 2560; 
iManufacturer = 1; 
iProduct = 2; 
iSerialNumber = 3; 
idProduct = 4096; 
idVendor = 34148; 
kHasMSCInterface = 1; 
locationID = "-99418112"; 
sessionID = 209792844564562; 
uid = "USB:85641000003740385375"; 

}

正如你所看到的,我得到了序列号,但是我没有可能告诉这个设备有哪个bsd名称。

+0

所以问题http://stackoverflow.com/questions/2019244/how-to-get-serial-number-from-mac-hard-disks – Deepesh 2012-04-27 09:43:23

+0

嗨elppa,谢谢您的回答但链接中的解决方案正是我已经尝试过的:遍历所有IOUSBDevices - 这是AppleUSBEHCI的子集。如果我尝试这种方法,我找不到任何有关bsd名称或分区的信息。也许我只是错过了一些东西。在那种情况下:请给我更多的信息吗? – 2012-04-27 10:25:18

+0

注意:这不是硬盘序列号。这是USB序列号,它们是两个不同的东西。 (这也是为什么你不看硬盘名称,也就是为什么,因为这只是一个USB接口,而不是硬盘接口)。 – chacham15 2013-04-26 23:14:10

回答

2

我有一个关于如何在C++中做到这一点的教程。给定一个io_service_t,这就是usbDevice在下面的代码片段,你会得到这样的bsdName:

 bsdName = (CFStringRef) IORegistryEntrySearchCFProperty( 
     usbDevice, 
     kIOServicePlane, 
     CFSTR(kIOBSDNameKey), 
     kCFAllocatorDefault, 
     kIORegistryIterateRecursively) 

这是代码来获取序列号关在C++ USB闪存盘,但大概可以适应你的目的:

http://oroboro.com/usb-serial-number-osx/

+0

只要不要忘记添加'#import ' – codingFriend1 2013-07-08 08:55:42