Seriennummer des USB Sticks auf dem sich die Software befindet

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Seriennummer des USB Sticks auf dem sich die Software befindet

    Hi,

    ich habe folgednes Problem. Ich brauche die Hardware Seriennummer des USB Sticks auf dem sich meine Software befindet.
    Ich bekomme die Seriennummer heraus mit

    kr = IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceNameMatching("AppleUSBEHCI"), &io_objects);

    Dann über die io_objects iterieren mit

    kr = IORegistryEntryCreateCFProperties(io_service, &service_properties, kCFAllocatorDefault, kNilOptions);

    und dann über die services tierieren mit

    kr = IORegistryEntryCreateCFProperties(child, &child_props, kCFAllocatorDefault, kNilOptions );


    Also Ausgabe erhalte ich dann z.B. bei den services:

    Quellcode

    1. Service: {
    2. 64bit = 1;
    3. CFBundleIdentifier = "com.apple.driver.AppleUSBEHCI";
    4. "Card Type" = "Built-in";
    5. Errata = 71303168;
    6. IOClass = AppleUSBEHCI;
    7. IOMatchCategory = IODefaultMatchCategory;
    8. IOPCIClassMatch = 0x0c032000;
    9. IOPCIPauseCompatible = 1;
    10. IOPCITunnelCompatible = 1;
    11. IOPowerManagement = {
    12. ChildrenPowerState = 3;
    13. CurrentPowerState = 3;
    14. DevicePowerState = 3;
    15. DriverPowerState = 3;
    16. MaxPowerState = 4;
    17. };
    18. IOProbeScore = 0;
    19. IOProviderClass = IOPCIDevice;
    20. IOUserClientClass = IOUSBControllerUserClient;
    21. Statistics = {
    22. "Access Count" = 18;
    23. Bytes = 8920;
    24. "Bytes (New)" = 0;
    25. "Bytes (New)/ms" = 0;
    26. ControlBulkTxOut = 0;
    27. "Debug Flags" = 0;
    28. "Errors (New)" = 0;
    29. "Errors (Total)" = 0;
    30. Resets = 1;
    31. "Resets (New)" = 0;
    32. Timeouts = 0;
    33. "Timeouts (New)" = 0;
    34. "ms (Current)" = 71378014;
    35. "ms (since last read)" = 121265;
    36. };
    37. UpdatedSleepPropertiesExists = 1;
    38. }
    Alles anzeigen


    und bei den properties dann

    Quellcode

    1. Child props: {
    2. "Bus Power Available" = 50;
    3. "Device Speed" = 2;
    4. IOCFPlugInTypes = {
    5. "9dc7b780-9ec0-11d4-a54f-000a27052861" = "IOUSBFamily.kext/Contents/PlugIns/IOUSBLib.bundle";
    6. };
    7. IOGeneralInterest = "IOCommand is not serializable";
    8. IOUserClientClass = IOUSBDeviceUserClientV2;
    9. "Low Power Displayed" = 0;
    10. PortNum = 3;
    11. PortUsingExtraPowerForWake = 0;
    12. "Requested Power" = 1;
    13. "USB Address" = 6;
    14. "USB Product Name" = "STORE N GO";
    15. "USB Serial Number" = 140220100010F9;
    16. "USB Vendor Name" = Verbatim;
    17. bDeviceClass = 0;
    18. bDeviceProtocol = 0;
    19. bDeviceSubClass = 0;
    20. bMaxPacketSize0 = 64;
    21. bNumConfigurations = 1;
    22. bcdDevice = 256;
    23. iManufacturer = 1;
    24. iProduct = 2;
    25. iSerialNumber = 3;
    26. idProduct = 579;
    27. idVendor = 6309;
    28. kHasMSCInterface = 1;
    29. locationID = 487665664;
    30. sessionID = 70782030048014;
    31. uid = "USB:18A502430220100010F9";
    32. }
    Alles anzeigen


    Im Prinzip also die Infos die ich brauche. Aber wie bekomme ich jetzt heraus welches der devices das ist auf dem sich meine Software befindet. Wenn ich von diesen ausgelesenen Infos irgendwie auf den Pfad oder den Volume namen oder sowas rückschließen könnte dann wäre es ok.

    Hat jemand eine Idee?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Scheint wohl nicht so einfach zu sein - aber unter oroboro.com/usb-serial-number-osx/ hat wohl schonmal jemand das Problem gelöst (nicht ausprobiert, nur zufällig gefunden)...

    (edit) Nach einigem Ausprobieren und einer Reihe Änderungen und Ergänzungen tut der Code irgendwas, aber er reagiert nicht auf Ein-/Ausstecken von USB-Geräten. Dafür werden beim Start die USB-Geräte aufgezählt...

    (edit2) Der Callback funktioniert immer noch nicht, aber jetzt wird beim Starten die Seriennummer meines USB-Sticks (identisch zur Angabe im System Profiler) ausgegeben. Der Code prüft aktuell den USB-Gerätenamen ("Super Disk Brand" oder "Trans-It Drive"), für den die Seriennummer ermittelt wird. Vielleicht hilft's ja...

    Ich habe den funktionierenden Code mal unter multicores.org/USBSerialNumber.cc hochgeladen, compilieren funktioniert mit

    Quellcode

    1. ​c++ -o USBSerialNumber USBSerialNumber.cc -framework IOKit -framework Foundation -framework DiskArbitration

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von cuby ()

  • cuby schrieb:

    Scheint wohl nicht so einfach zu sein - aber unter oroboro.com/usb-serial-number-osx/ hat wohl schonmal jemand das Problem gelöst (nicht ausprobiert, nur zufällig gefunden)...

    (edit) Nach einigem Ausprobieren und einer Reihe Änderungen und Ergänzungen tut der Code irgendwas, aber er reagiert nicht auf Ein-/Ausstecken von USB-Geräten. Dafür werden beim Start die USB-Geräte aufgezählt...


    Egal ich schau mir das morgen mal in Ruhe an. Vielleicht kann man was davon verwenden. Das Finden der Sticks habe ich ja schon zuverläßig implementiert. Es geht ja nur darum das ich meine Ergebnisse keinem Volume oder Path zuordnen kann.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    Quellcode

    1. ​IORegistryEntrySearchCFProperty(
    2. usbDevice,
    3. kIOServicePlane,
    4. CFSTR( kIOBSDNameKey ),
    5. kCFAllocatorDefault,
    6. kIORegistryIterateRecursively );


    Könntest Du mir bitte etwas genauer erläutern was Du damit meinst? Ich bekomme dabei immer disk2 raus egal welcher Stick.

    Danke

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    Quellcode

    1. IORegistryEntrySearchCFProperty(
    2. usbDevice,
    3. kIOServicePlane,
    4. CFSTR( kIOBSDNameKey ),
    5. kCFAllocatorDefault,
    6. kIORegistryIterateRecursively );


    Könntest Du mir bitte etwas genauer erläutern was Du damit meinst? Ich bekomme dabei immer disk2 raus egal welcher Stick.

    Danke

    Claus


    aber doch hoffentlich nicht wenn du die verschiedenen dinger gleichzeitig angestopselt hast ;)
    vom BSD name kommst du ja auf den mount point bzw umgekehrt.
    der "mount" command zeigt ja zb so an:
    /dev/disk3s1 on /Volumes/GRITSCH (msdos, local, nodev, nosuid, noowners)


    edit: an die info kommst du auch mittels diskutil list und diskutil info (und auch per code)
  • gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Quellcode

    1. IORegistryEntrySearchCFProperty(
    2. usbDevice,
    3. kIOServicePlane,
    4. CFSTR( kIOBSDNameKey ),
    5. kCFAllocatorDefault,
    6. kIORegistryIterateRecursively );


    Könntest Du mir bitte etwas genauer erläutern was Du damit meinst? Ich bekomme dabei immer disk2 raus egal welcher Stick.

    Danke

    Claus


    aber doch hoffentlich nicht wenn du die verschiedenen dinger gleichzeitig angestopselt hast ;)


    Doch leider. Alle USB sticks liefern mir dann disk2 zurück....


    edit: an die info kommst du auch mittels diskutil list und diskutil info (und auch per code)


    Ja aber dann habe ich ja wieder keine Zusammenhang zu meiner Seriennummer...

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    Quellcode

    1. IORegistryEntrySearchCFProperty(
    2. usbDevice,
    3. kIOServicePlane,
    4. CFSTR( kIOBSDNameKey ),
    5. kCFAllocatorDefault,
    6. kIORegistryIterateRecursively );


    Könntest Du mir bitte etwas genauer erläutern was Du damit meinst? Ich bekomme dabei immer disk2 raus egal welcher Stick.

    Danke

    Claus


    aber doch hoffentlich nicht wenn du die verschiedenen dinger gleichzeitig angestopselt hast ;)


    Doch leider. Alle USB sticks liefern mir dann disk2 zurück....


    edit: an die info kommst du auch mittels diskutil list und diskutil info (und auch per code)


    Ja aber dann habe ich ja wieder keine Zusammenhang zu meiner Seriennummer...

    Gruß

    Claus


    dann übergibst du der funktion IORegistryEntrySearchCFProperty() das falsche device.
    klar, wenn du den korrekten BSD-namen bekommst, kannst du davon den mount point holen und schon siehst du auf welchem USB-gerät (mit welcher SN) deine app läuft. (in deinem fall gehts eben den anderen weg: app-path -> mount point -> BSD-name -> alle durchiterieren und dann SN holen.
  • Hm,

    warum bekomme ich wohl disk2, disk3 etc zurück die Dinger heissen im /dev/ aber disk2s1, disk3s1? Kann ich das s1 einfach selber hinzufügen ist das irgendwie definiert?

    Und gibt es eine einfache Möglichkeit den Volume Namen zu ermitteln ausser die Ausgabe von mount oder df zu parsen?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Hm,

    warum bekomme ich wohl disk2, disk3 etc zurück die Dinger heissen im /dev/ aber disk2s1, disk3s1? Kann ich das s1 einfach selber hinzufügen ist das irgendwie definiert?

    Und gibt es eine einfache Möglichkeit den Volume Namen zu ermitteln ausser die Ausgabe von mount oder df zu parsen?

    Gruß

    Claus


    das sind doch nur die partitionen.
    du gehst ja eh den umgekehrten weg also vom mount-point zum bsd-namen dann musst du nix anhängen.

    vom mount-point auf den BSD-namen zu kommen sollte nicht allzuschwer sein.
    hab ich nie benötigt aber vielleicht gehts schon mit statfs o.ä. ;)

    ansonsten tiefer im system gibts sicher eine API...
  • /dev/disk# ist das Gerät.
    /dev/disk#s? ist die Partition bzw. das Volume.

    Das Gerät beginnt bei dem Zähler 0, die Partition beim Zähler 1.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ok,

    hiermit gebe ich offiziell zu, dass ich nicht UNIX tauglich bin.

    Ich schaffe es einfach nicht auf einfachem Wege von diesem dsik2, dsik3 etc auf einen Path zu schließen mit dem ich testen kann ob sich eine bestimmte Date auf dem Stick befindet.

    Wer mir hilft bekommt auf der Macoun einen Abend Freibier bis zum abwinken :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)