2013-03-16 7 views
3

Comment trouver le numéro de série Mac OSX.Trouver le numéro de série Mac OSX

Parfois, il est nécessaire d'obtenir le numéro de série d'un mac, et vous validez cela.

J'avais besoin de la même chose, il y a quelques années, quand j'ai développé un plugin pour OsiriX. On m'a demandé de le publier d'une telle manière, seulement quelques systèmes peuvent utiliser ce plugin.

Si nous obtenons une meilleure solution que celle-ci, ce sera très utile pour nous tous.

Répondre

15

Le code suivant est principalement copié à partir Technical Note TN1103, avec de petites modifications pour retourner un NSString et qu'il compile avec l'ARC:

#include <IOKit/IOKitLib.h> 

- (NSString *)getSerialNumber 
{ 
    NSString *serial = nil; 
    io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, 
            IOServiceMatching("IOPlatformExpertDevice")); 
    if (platformExpert) { 
     CFTypeRef serialNumberAsCFString = 
     IORegistryEntryCreateCFProperty(platformExpert, 
             CFSTR(kIOPlatformSerialNumberKey), 
             kCFAllocatorDefault, 0); 
     if (serialNumberAsCFString) { 
      serial = CFBridgingRelease(serialNumberAsCFString); 
     } 

     IOObjectRelease(platformExpert); 
    } 
    return serial; 
} 

Vous devez ajouter le IOKit.framework à vos paramètres de construction.

+0

Après avoir écrit cette réponse que je fait une recherche pour SO 'kIOPlatformSerialNumberKey' qui a montré qu'il existe déjà de nombreuses réponses contenant le code de TN1103. –

+0

Oui, je le savais :) Je voulais seulement vérifier si mon chemin était bon ou pas. Et si vous, Arpad et duskwuff dit .... J'ai eu mon point :) –

+0

Ceci est également utile pour le cryptage des clés d'enregistrement dans le cadre d'un mot de passe. – Volomike

1

Ceci est la version rapide de la solution:

var serialNumber: String? { 
    let platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")) 

    guard platformExpert > 0 else { 
    return nil 
    } 

    guard let serialNumber = (IORegistryEntryCreateCFProperty(platformExpert, kIOPlatformSerialNumberKey as CFString, kCFAllocatorDefault, 0).takeUnretainedValue() as? String) else { 
    return nil 
    } 


    IOObjectRelease(platformExpert) 

    return serialNumber 
}