Zugriff auf USB Device SerialNo. ohne Root-Rechte?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

Zugriff auf USB Device SerialNo. ohne Root-Rechte?

Beitrag von alex0801 » 16.08.2010 13:15:39

Hallo zusammen,

für ein kleines Softareprojekt möchte ich die Seriennummer eines USB-Sticks auslesen. Nach einigem googeln bin ich auf libusb gekommen. Hierzu gabs folgendes Codesample:

Code: Alles auswählen

/* testlibusb.c */ 

#include <stdio.h>
#include <usb.h>


void print_endpoint(struct usb_endpoint_descriptor *endpoint) 
{ 
	printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); 
	printf(" bmAttributes: %02xh\n", endpoint->bmAttributes); 
	printf(" wMaxPacketSize: %d\n", endpoint->wMaxPacketSize); 
	printf(" bInterval: %d\n", endpoint->bInterval); 
	printf(" bRefresh: %d\n", endpoint->bRefresh); 
	printf(" bSynchAddress: %d\n", endpoint->bSynchAddress); 
} 


void print_altsetting(struct usb_interface_descriptor *interface) 
{ 
	int i; 

	printf(" bInterfaceNumber: %d\n", interface->bInterfaceNumber); 
	printf(" bAlternateSetting: %d\n", interface->bAlternateSetting); 
	printf(" bNumEndpoints: %d\n", interface->bNumEndpoints); 
	printf(" bInterfaceClass: %d\n", interface->bInterfaceClass); 
	printf(" bInterfaceSubClass: %d\n", interface->bInterfaceSubClass); 
	printf(" bInterfaceProtocol: %d\n", interface->bInterfaceProtocol); 
	printf(" iInterface: %d\n", interface->iInterface); 

	for (i = 0; i < interface->bNumEndpoints; i++) 
		print_endpoint(&interface->endpoint[i]); 
} 


void print_interface(struct usb_interface *interface) 
{ 
	int i; 

	for (i = 0; i < interface->num_altsetting; i++) 
		print_altsetting(&interface->altsetting[i]); 
} 


void print_configuration(struct usb_config_descriptor *config) 
{ 
	int i; 

	printf(" wTotalLength: %d\n", config->wTotalLength); 
	printf(" bNumInterfaces: %d\n", config->bNumInterfaces); 
	printf(" bConfigurationValue: %d\n", config->bConfigurationValue); 
	printf(" iConfiguration: %d\n", config->iConfiguration); 
	printf(" bmAttributes: %02xh\n", config->bmAttributes); 
	printf(" MaxPower: %d\n", config->MaxPower); 

	for (i = 0; i < config->bNumInterfaces; i++) 
		print_interface(&config->interface[i]); 
} 


int main(void) 
{ 
	struct usb_bus *bus; 
	struct usb_device *dev; 

	usb_init(); 
	usb_find_busses(); 
	usb_find_devices(); 

	printf("bus/device idVendor/idProduct\n"); 

	for (bus = usb_busses; bus; bus = bus->next) { 

		for (dev = bus->devices; dev; dev = dev->next) { 

			int ret, i; 
			char string[256]; 
			usb_dev_handle *udev; 

			printf("%s/%s %04X/%04X\n", bus->dirname, dev->filename, dev->descriptor.idVendor, dev->descriptor.idProduct); 

			udev = usb_open(dev); 
			if (udev) { 

				if (dev->descriptor.iManufacturer) { 
					ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string)); 
					if (ret > 0) 
						printf("- Manufacturer : %s\n", string); 
					else 
						printf("- Unable to fetch manufacturer string\n"); 
				} 

				if (dev->descriptor.iProduct) { 
					ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string)); 
				
					if (ret > 0) 
						printf("- Product : %s\n", string); 
					else 
						printf("- Unable to fetch product string\n"); 
				} 

				if (dev->descriptor.iSerialNumber) { 
					ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string)); 
					if (ret > 0) 
						printf("- Serial Number: %s\n", string); 
					else 
						printf("- Unable to fetch serial number string\n"); 
				} 

				usb_close (udev); 
			} 

			if (!dev->config) { 
				printf(" Couldn't retrieve descriptors\n"); 
				continue; 
			} 

			for (i = 0; i < dev->descriptor.bNumConfigurations; i++) 
				print_configuration(&dev->config[i]); 
		} 
	} 

	return 0; 
}
Übersetzt hab ich wie folgt:
gcc -o usbdevice_details testlibusb.c -I/usr/local/include -L. -lnsl -lm -lc -L/usr/local/lib -lusb
Als Ergebnis ohne root-rechte bekomme ich beim ausführen:
....
001/002 0EA0/2168
- Unable to fetch manufacturer string.
- Unable to fetch product string.
- Unable to fetch serial number string.
wTotalLength: 39
bNumInterfaces: 1
bConfigurationValue: 1
iConfiguration: 0
bmAttributes: 80h
MaxPower: 100
bInterfaceNumber: 0
bAlternateSetting: 0
bNumEndpoints: 3
bInterfaceClass: 8
bInterfaceSubClass: 6
bInterfaceProtocol: 80
iInterface: 0
bEndpointAddress: 81h
bmAttributes: 02h
wMaxPacketSize: 512
bInterval: 0
bRefresh: 0
bSynchAddress: 0
bEndpointAddress: 02h
bmAttributes: 02h
wMaxPacketSize: 512
bInterval: 0
bRefresh: 0
bSynchAddress: 0
bEndpointAddress: 83h
bmAttributes: 03h
wMaxPacketSize: 2
bInterval: 1
bRefresh: 0
bSynchAddress: 0
....


Führe ich das Progrämmchen mit root-Rechten aus, klappts:
001/002 0EA0/2168
- Manufacturer : USB
- Product : Flash Disk
- Serial Number: 28821C41C1203D3C

wTotalLength: 39
bNumInterfaces: 1
bConfigurationValue: 1
iConfiguration: 0
bmAttributes: 80h
MaxPower: 100
bInterfaceNumber: 0
bAlternateSetting: 0
bNumEndpoints: 3
bInterfaceClass: 8
bInterfaceSubClass: 6
bInterfaceProtocol: 80
iInterface: 0
bEndpointAddress: 81h
bmAttributes: 02h
wMaxPacketSize: 512
bInterval: 0
bRefresh: 0
bSynchAddress: 0
bEndpointAddress: 02h
bmAttributes: 02h
wMaxPacketSize: 512
bInterval: 0
bRefresh: 0
bSynchAddress: 0
bEndpointAddress: 83h
bmAttributes: 03h
wMaxPacketSize: 2
bInterval: 1
bRefresh: 0
bSynchAddress: 0

Das ist jetzt etwas verzwickt:

Zum einen möchte ich meine Anwendung später nicht mit root-rechten laufen lassen, und zum anderen schafft es "hwinfo --usb" die Info ohne Root-Rechte auszulesen.
"hwinfo" ist aber wohl auf einem 0815 Standardsystem scheinbar nicht vorinstalliert (im Gegensatz zu libusb), und außerdem möchte ich keinen Output eines Consolenprogramms parsen.

Kann mir jemand nen Tipp geben wie ich ohne Root-Rechte mit eigenem Code an die oben fett-markierten Infos eines USB-Sticks ran komme?
Zuletzt geändert von alex0801 am 16.08.2010 14:21:46, insgesamt 1-mal geändert.

alex0801
Beiträge: 208
Registriert: 16.10.2005 19:46:48
Wohnort: Rhein-Neckar-Kreis

Re: Zugriff auf USB Device SerialNo. ohne Root-Rechte?

Beitrag von alex0801 » 16.08.2010 14:21:32

So, bin ein kleinwenig weiter.

Ich weiß nun, dass in /sys so ziemlich alles aufgeführt ist was im System steckt.

Stöpsel ich nun einen USB-Stick an, so taucht in /sys/bus/usb/devices ein neuer Eintrag auf. Wechselt man in das Verzeichnis, so gibts da Infos zur Seriennummer, Vendor-ID und Product-ID .. Prima.

Was mir nun noch fehlt ist irgendwie die zuordnung zum Block-Device... Sprich: Wie und wo ist der Stick eingehängt?

In /sys/block/ ist zwar ein neues Verzeichnis namens "sdb" aufgetaucht, aber wenn ich zwei Sticks nahezu zeitgleich einstöpsle, dann weiß ich ja nicht welcher welches Blockdevice erhalten hat.

Hat jmd. nen tipp für mich wie ich die Zuordnung USB-Device <-> Block-Device hinbekomme?

- Alex

Benutzeravatar
schorsch_76
Beiträge: 2612
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Zugriff auf USB Device SerialNo. ohne Root-Rechte?

Beitrag von schorsch_76 » 16.08.2010 15:59:15

Kuck dir doch den source zu hwinfo an.

Code: Alles auswählen

apt-get source hwinfo
Gruß

schorsch

Antworten