![]() |
AW: USB-Seriennummer auslesen
Eine recht zuverlässige Routine, die auch bei USB-Laufwerken finktioniert, ist:
Delphi-Quellcode:
Gruß, Andreas
Function LWSerialID(CONST Drive: Char): String;
// Doberenz & Kowalski: Delphi 7 Kochbuch (2003) S. 822 VAR ID, dwx, dwy : DWord; Begin IF GetVolumeInformation(pChar(Drive + ':\'), Nil, 0, @ID, dwx, dwy, Nil, 0) Then Result := IntToStr(ID) Else Result := 'Error' End; {LWSerialID} {---------------} |
AW: USB-Seriennummer auslesen
Hallo Andreas13,
vielen Dank für die schnelle Antwort. Ich habe die Funktion getestet. Die gibt mir aber leider nur die Seriennummer des Laufwerks. Ich benötige die PnPDeviceID. |
AW: USB-Seriennummer auslesen
![]()
Delphi-Quellcode:
Hilft das?
program GetWMI_USBConnectedInfo;
{$APPTYPE CONSOLE} uses Windows, Classes, ActiveX, Variants, SysUtils, WbemScripting_TLB; procedure GetUSBDiskDriveInfo; var WMIServices : ISWbemServices; Root,a,b : ISWbemObjectSet; Item,Item2 : Variant; i,ii,iii,iiii: Integer; start,stop,freq:Int64; begin QueryPerformanceFrequency(freq); QueryPerformanceCounter(start); WMIServices := CoSWbemLocator.Create.ConnectServer('.', 'root\cimv2','', '', '', '', 0, nil); Root := WMIServices.ExecQuery('Select * From Win32_DiskDrive','WQL', 0, nil); for i := 0 to Root.Count - 1 do begin Item := Root.ItemIndex(i); for ii := VarArrayLowBound(Item.Capabilities, 1) to VarArrayHighBound(Item.Capabilities, 1) do if (Item.Capabilities[ii] = 7) then begin Writeln('Caption '+VarToStr(Item.Caption)); Writeln('Name '+VarToStr(Item.Name)); Writeln('DeviceID '+VarToStr(Item.DeviceID)); Writeln('Partitions '+VarToStr(Item.Partitions)); Writeln('PNPDeviceID '+VarToStr(Item.PNPDeviceID)); Writeln('SerialNumber '+VarToStr(Item.SerialNumber)); Writeln('Signature '+VarToStr(Item.Signature)); a := WMIServices.ExecQuery('ASSOCIATORS OF {Win32_DiskDrive.DeviceID=''' + VarToStr(Item.DeviceID) + '''} WHERE AssocClass = Win32_DiskDriveToDiskPartition','WQL', 0, nil); for iiii := 0 to a.Count - 1 do begin b := WMIServices.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID=''' + VarToStr(Variant(a.ItemIndex(iiii)).DeviceID) + '''} WHERE AssocClass = Win32_LogicalDiskToPartition','WQL', 0, nil); for iii := 0 to b.Count - 1 do begin Item2 := b.ItemIndex(iii); Writeln('Drive = ' + Item2.Caption); end; end; Writeln; Writeln; end; end; QueryPerformanceCounter(stop); if (freq > 0) then Writeln('Time took: ' + FloatToStr((stop-start) / freq)) else Writeln('Unable to measure time!'); end; begin try CoInitialize(nil); GetUSBDiskDriveInfo; Readln; CoUninitialize; except on E:Exception do Begin CoUninitialize; Writeln(E.Classname, ': ', E.Message); Readln; End; end; end. |
AW: USB-Seriennummer auslesen
Hallo KodeZwerg,
vielen Dank, aber leider liefert die Query "Root := WMIServices.ExecQuery('Select * From Win32_DiskDrive','WQL', 0, nil);" auf einigen Windows Tablets eine leere Liste. Ich bräuchte für diesen Fall eine Alternative ohne WMI. Gruß Walter |
AW: USB-Seriennummer auslesen
|
AW: USB-Seriennummer auslesen
Ich grübel gerade ob man über HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet die gewünschte Information erhält....
|
AW: USB-Seriennummer auslesen
Hallo,
wie bereits erwähnt, habe ich die Routine welche mittels WMIService die am PC eingesteckten USB-Laufwerke ermittelt und anhand dieser Liste suche ich den USB-Stick, der die gewünschte PnPDeviceID enthält. Ich habe aber einige User meines Programms, die ein Tablet-PC mit Windows 10 haben. Kurioserweise erkennt das System den USB Stick, jedoch liefert der WMIService eine leere Liste mit Laufwerksinfos (keine HDD oder SD, kein USB). Nur für diesen speziellen Fall müsste eine Altnativroutine oder eine externe EXE im Hintergrund aufgerufen werden, welche die PnPDeviceID der USB Laufwerke OHNE WMI liefert. Danke nochmals für eure Hilfe! |
AW: USB-Seriennummer auslesen
Zitat:
Auf ![]() Zitat:
Frage: Was hast Du denn mit der PnP-Id vor, vielleicht gibt es da ja möglichkeiten. |
AW: USB-Seriennummer auslesen
Hallo KodeZwerg,
Ich benötige die PnPDeviceID für die eindeutige Identifkation des USB-Sticks. Diese wird mit einer verschüsselten Version auf dem Stick verglichen. Die normale Seriennummer genügt leider nicht, da diese bei einigen Sticks nicht ermittelt werden kann, bez. gar nicht da ist. |
AW: USB-Seriennummer auslesen
Ahh! Dafür gibt es auch andere Mittel und Wege, ich würde mir über DeviceIoControl selbst was einzigartiges er"hash"en. (Kombination aus verschiedenen Informationen zusammenfassen und dann einen Hash wert generieren)
Schau mal bei Msdn rein, da sind dutzende Informationen zu finden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz