2010-01-07 16 views
9

¿Existe una manera fácil de obtener el número de serie de todos los discos duros en una Mac usando una API?¿Cómo obtener el número de serie de los discos duros de Mac?

Básicamente, estoy buscando un identificador único para el disco duro con el que pueda determinar si el disco duro ha sido utilizado (o referido) por mi aplicación o no.

Háganme saber si hay alguna otra solución.

Nota: Necesito esta solución para 10.4 y superior.

Respuesta

10

no estoy seguro de si "AppleUSBEHCI" es lo más apropiado para buscar pero se puede recuperar este tipo de datos utilizando el marco 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); 
+0

AppleAHCIDiskDriver - no resulta disco duro que están conectados son USB. Al buscar en el sistema Profiler USB HD estaba usando "controlador de host controlador: \t AppleUSBEHCI" así que traté de usar AppleUSBEHCI en su lugar AppleAHCIDiskDriver pero no se produjo ningún resultado. no estoy seguro de que me falta algo. –

+0

Es posible que desee probar la respuesta de mouviciel antes de continuar en la ruta IOKit. Para dispositivos conectados a USB, haga IOServiceNameMatching ("AppleUSBEHCI") y luego itere a través de todos sus elementos secundarios usando IORegistryEntryGetChildIterator (io_service, kIOServicePlane, & iter). – diciu

+0

Agradezco tu ayuda. Ataron la solución de mouviciel pero no funcionó. cuando traté de usar IORegistryEntryGetChildIterator - devuelve el error (268435459), acabo de llamar a esto después de IOServiceGetMatchingServices, no estoy seguro de lo que me estoy perdiendo. –

0

tal vez usted puede simplemente colocar un archivo oculto en una disco duro que su aplicación ha utilizado? Eso es, por ejemplo, cómo lo hace Time Machine de Apple

+0

buena sugerencia, puedo considerar esta solución solo si obtengo información del disco duro. Si el archivo se elimina, no puedo reconocerlo más en mi aplicación. –

1

Eche un vistazo a IOKit.

Hay dos herramientas útiles en su Mac para averiguar acerca de las posibilidades de que:

  • ioreg, una herramienta de línea de comandos
  • IORegistryExplorer, lo mismo con una interfaz gráfica de usuario.
6

creo que es mejor para obtener el UUID de volumen (que aparece en la utilidad de disco, por ejemplo.) UUID se puede obtener utilizando el marco Disk Arbitration, que es ligeramente más alto nivel de IOKit y más fácil de usar. Crea DADiskRef usando DADiskCreateFromBSDName, y usa DADiskCopyDescription para obtener el diccionario de información y busca la clave kDADiskDescriptionMediaUUIDKey. Se puede obtener información sobre el punto de montaje, etc., en statfs.

Dicho esto, podría ser más fácil simplemente invocar la utilidad de línea de comandos diskutil con la opción -plist para obtener la información en el formato plist.

El código de ejemplo FSMegaInfo también puede ser instructivo sobre cómo obtener mucha más información sobre un disco.

+0

gracias por la valiosa información. Según mi comprensión UUID se genera en el sistema no estoy seguro de que se puede considerar como único. En mi sistema no puedo ver el UUID para el dispositivo. –

+0

UUID es un acrónimo de Universally Unique ID, y es único. Se usa, por ejemplo, para controlar qué montar en '/ etc/fstab'. También es extraño que no vea el UUID. ¿Qué devuelve 'diskutil info/dev/disk0s2' en su máquina? ¿No ves la entrada 'Volume UUID' en la lista? Es posible que deba cambiar '/ disk0s2' arriba a lo que realmente tiene. Verifique primero con 'diskutil list'. – Yuji

+0

una ID de volumen es conceptualmente diferente de una ID de unidad por varias razones, una unidad puede tener varios volúmenes, no es necesario montar los volúmenes de una unidad, se pueden agregar y quitar volúmenes, cambiar su ID, aunque la unidad permanezca el mismo – valexa

2

La unidad de identificación se pueden recuperar de la IORegistry como sigue:

  • Las unidades internas: IOAHCIBlockStorageDevice string propiedad "Serial número" dentro "de las características del dispositivo", por ejemplo: (WD-WCAV5D1345345)

  • unidades USB: IOUSBDevice string propiedad "Número de serie USB", por ejemplo: (5743415654564561373734)

  • unidades FireWire: IOReducedBlockServices number propiedad "GUID" dentro "de las características del protocolo" ej .: (407345709348650)

  • rayo impulsa: ??

Estas identificaciones son persistentes, lo que significa que las mismas unidades externas conectadas a diferentes máquinas mostrarán la misma ID.

7

Desde la línea de comandos:

ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial

Esto le da el número de serie de la incorporada en el disco duro.

1

A continuación se enumerarán los números de serie en el bus SATA. No llega a saber qué dispositivo es tal como está, pero puede hacerlo con algunos scripts/análisis. He usado "sed" para eliminar todos los espacios y "awk" para aislar sólo la serie en caso de que no está familiarizado:

$ system_profiler SPSerialATADataType -detailLevel medium | grep Serial | sed -e 's/[\<\>\"\ ]//g' | -F':' '{print $2}' 
+0

Supongo que también puede encontrarlo útil: -> '$ system_profiler SPSerialATADataType -detailLevel medium | grep -e "Serie" -e "Modelo" | awk -F ':' '{print $ 2}' ' –

Cuestiones relacionadas