2010-01-07 19 views
9

क्या एपीआई का उपयोग कर मैक में सभी हार्ड डिस्क की धारावाहिक संख्या प्राप्त करने का कोई आसान तरीका है?मैक हार्ड डिस्क से सीरियल नंबर कैसे प्राप्त करें?

असल में, मैं हार्ड डिस्क जिसके साथ मैं यह पता लगाने कर सकते हैं कि हार्ड डिस्क अपने आवेदन द्वारा या नहीं इस्तेमाल किया गया है (या कहा जाता है) के लिए एक अद्वितीय पहचानकर्ता के लिए देख रहा हूँ।

कृपया मुझे पता है, अगर वहाँ किसी भी अन्य समाधान करते हैं।

नोट: मैं 10.4 और इसके बाद के संस्करण के लिए इस समाधान की जरूरत है।

#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); 

उत्तर

10

मुझे यकीन है कि अगर "AppleUSBEHCI" उचित बात के लिए देखने के लिए है, लेकिन आप IOKit ढांचे का उपयोग कर डेटा की इस तरह प्राप्त कर सकते हैं नहीं कर रहा हूँ हार्ड डिस्क जो आपके ऐप ने उपयोग की है? यह उदाहरण है कैसे सेब की टाइम मशीन करता है।

+0

AppleAHCIDiskDriver - हार्ड डिस्क जो जुड़े हुए हैं जिसके परिणामस्वरूप नहीं यूएसबी कर रहे हैं। सिस्टम प्रोफाइलर में देखकर यूएसबी एचडी का उपयोग कर रहा था "होस्ट कंट्रोलर ड्राइवर: \t ऐप्पलसबीईएचसीआई" इसलिए मैंने AppleAHCIDiskDriver के बजाय AppleUSBEHCI का उपयोग करने का प्रयास किया लेकिन इसके परिणामस्वरूप कोई परिणाम नहीं मिला। यकीन नहीं है कि मुझे कुछ याद आ रही है। –

+0

IOKit पथ पर जारी रखने से पहले आप mouviciel के उत्तर को आजमा सकते हैं। यूएसबी से जुड़े उपकरणों के लिए, IOServiceNameMatching ("AppleUSBEHCI") करें और फिर IORegistryEntryGetChildIterator (io_service, kIOServicePlane, और iter) का उपयोग करके अपने सभी बच्चों के माध्यम से पुन: प्रयास करें। – diciu

+0

मैं आपकी मदद की सराहना करता हूं। मैंने mouviciel समाधान बंधे लेकिन काम नहीं किया। जब मैंने IORegistryEntryGetChildIterator का उपयोग करने का प्रयास किया - यह त्रुटि (268435459) लौटा, मैंने इसे IOServiceGetMatchingServices के बाद बुलाया, मुझे यकीन नहीं है कि मुझे क्या याद आ रही है। –

0

शायद तुम सिर्फ एक पर एक छिपा फ़ाइल जगह कर सकते हैं:

+0

अच्छे सुझाव हैं, मैं केवल इस समाधान पर विचार कर सकता हूं अगर हार्ड डिस्क से कुछ जानकारी प्राप्त हो। अगर फ़ाइल हटा दी जाती है, तो मैं इसे अपने ऐप में और पहचान नहीं सकता हूं। मूल्यवान जानकारी के लिए –

1

IOKit पर एक नज़र डालें।

वहाँ अपने मैक पर दो आसान टूल इसके बारे में संभावनाओं के बारे में पता लगाने के लिए कर रहे हैं:

  • ioreg, एक कमांड लाइन उपकरण
  • IORegistryExplorer, एक जीयूआई के साथ एक ही।
6

मुझे लगता है कि यह वॉल्यूम UUID प्राप्त करने के लिए बेहतर है (जो डिस्क उपयोगिता में प्रकट होता है, उदाहरण के लिए।) UUID Disk Arbitration ढांचा है, जो IOKit की तुलना में थोड़ा उच्च स्तर और उपयोग में आसान है का उपयोग कर प्राप्त किया जा सकता है। DADiskRefDADiskCreateFromBSDName का उपयोग कर बनाएँ, और DADiskCopyDescription का उपयोग जानकारी शब्दकोश पाने के लिए, और मुख्य kDADiskDescriptionMediaUUIDKey देखो। माउंट प्वाइंट आदि पर जानकारी statfs द्वारा प्राप्त की जा सकती है।

यह कहा गया है कि प्लस प्रारूप में जानकारी प्राप्त करने के लिए -plist विकल्प के साथ कमांड लाइन उपयोगिता diskutil को आमंत्रित करना आसान हो सकता है।

नमूना कोड FSMegaInfo भी शिक्षाप्रद कैसे एक डिस्क के बारे में और अधिक जानकारी प्राप्त हो सकता है।

+0

धन्यवाद। मेरी समझ के अनुसार यूयूआईडी प्रणाली में उत्पन्न होता है यह सुनिश्चित नहीं है कि इसे अद्वितीय माना जा सकता है। मेरे सिस्टम में मैं डिवाइस के लिए यूयूआईडी नहीं देख पा रहा हूं। –

+0

UUID सार्वभौमिक अद्वितीय आईडी के लिए एक संक्षिप्त शब्द है, और यह अद्वितीय है। इसका उपयोग उदाहरण के लिए '/ etc/fstab' में माउंट करने के लिए किया जाता है। यह भी अजीब है कि आप यूयूआईडी नहीं देखते हैं। आपकी मशीन पर 'diskutil जानकारी/dev/disk0s2' वापसी क्या करती है? क्या आप सूची में 'वॉल्यूम यूयूआईडी' प्रविष्टि नहीं देखते हैं? आपको वास्तव में '/ disk0s2' को आपके पास जो कुछ भी है उसे बदलने की आवश्यकता हो सकती है। पहले 'डिस्कुटिल सूची' के साथ जांचें। – Yuji

+0

एक वॉल्यूम आईडी कई कारणों से ड्राइव आईडी से अवधारणात्मक रूप से भिन्न है, एक ड्राइव में कई वॉल्यूम हो सकते हैं, ड्राइव के वॉल्यूम को घुमाने की आवश्यकता नहीं होती है, वॉल्यूम्स को जोड़ा जा सकता है और हटाया जा सकता है इसलिए ड्राइव बदलती है, भले ही ड्राइव बनी रहती है वही – valexa

2

ड्राइव आईडी IORegistry से प्राप्त किए जा सकें इस प्रकार है:

  • आंतरिक ड्राइव: IOAHCIBlockStorageDevice string संपत्ति "सीरियल संख्या" अंदर "डिवाइस लक्षण" उदाहरण के लिए: (WD-WCAV5D1345345)

  • यूएसबी ड्राइव: IOUSBDevice string संपत्ति "USB सीरियल नंबर" उदाहरण के लिए: (5743415654564561373734)

  • फायरवायर ड्राइव: IOReducedBlockServices number संपत्ति "GUID" अंदर "प्रोटोकॉल लक्षण" उदा .: (407345709348650)

  • थंडरबोल्ट ड्राइव: ??

ये आईडी लगातार अर्थ है कि अलग-अलग मशीनों से जुड़ी एक ही बाहरी ड्राइव एक ही आईडी दिखाएगी।

7

कमांड लाइन से:

ioreg -rd1 -w0 -c AppleAHCIDiskDriver | grep Serial

यह आपको हार्ड डिस्क में निर्मित के सीरियल नंबर देता है।

1

निम्नलिखित सैटा-बस पर सीरियल नंबर सूचीबद्ध करेगा। आपको यह नहीं पता कि यह कौन सा डिवाइस है, लेकिन आप इसे कुछ स्क्रिप्टिंग/पार्सिंग के साथ कर सकते हैं। मैं "sed" का उपयोग किया है के मामले में सिर्फ धारावाहिक को अलग करने के सभी रिक्त स्थान और "awk" दूर करने के लिए आप परिचित नहीं हैं:

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

मुझे लगता है कि आप यह भी उपयोगी पा सकते हैं: -> 'system_profiler SPSerialATADataType -detailLevel माध्यम | grep -e "सीरियल" -e "मॉडल" | awk -F ':' '{प्रिंट $ 2}' ' –

संबंधित मुद्दे