Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   USB-Seriennummer auslesen (https://www.delphipraxis.net/165926-usb-seriennummer-auslesen.html)

Andreas13 20. Mär 2021 11:59

AW: USB-Seriennummer auslesen
 
Eine recht zuverlässige Routine, die auch bei USB-Laufwerken finktioniert, ist:
Delphi-Quellcode:
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}
{---------------}
Gruß, Andreas

walharth 20. Mär 2021 12:30

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.

KodeZwerg 20. Mär 2021 12:41

AW: USB-Seriennummer auslesen
 
RRUZ

Delphi-Quellcode:
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.
Hilft das?

walharth 20. Mär 2021 13:01

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

mmw 20. Mär 2021 13:36

AW: USB-Seriennummer auslesen
 
hallo,
vielleicht hilft das

https://github.com/RRUZ/delphi-wmi-c..._PnPEntity.pas

Gruß

KodeZwerg 20. Mär 2021 13:41

AW: USB-Seriennummer auslesen
 
Ich grübel gerade ob man über HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet die gewünschte Information erhält....

walharth 20. Mär 2021 14:20

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!

KodeZwerg 20. Mär 2021 14:54

AW: USB-Seriennummer auslesen
 
Zitat:

Zitat von walharth (Beitrag 1485616)
Tablet-PC mit Windows 10

Das verstehe ich selbst gerade noch nicht so ganz.
Auf MSDN steht halt:
Zitat:

Minimum supported client = Windows Vista
Minimum supported server = Windows Server 2008
Dann ist ein Tablet ein anderer client/server typ? Seltsam. Habe leider kein Tablet um das nachzuvollziehen.

Frage: Was hast Du denn mit der PnP-Id vor, vielleicht gibt es da ja möglichkeiten.

walharth 20. Mär 2021 15:01

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.

KodeZwerg 20. Mär 2021 15:26

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 07:30 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz