AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

USB-Seriennummer auslesen

Ein Thema von Schorschi5566 · begonnen am 22. Jan 2012 · letzter Beitrag vom 20. Mär 2021
Antwort Antwort
Seite 2 von 2     12   
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#11

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 12:59
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
walharth

Registriert seit: 12. Nov 2006
13 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 13:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 13:41
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?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
walharth

Registriert seit: 12. Nov 2006
13 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 14:01
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
  Mit Zitat antworten Zitat
mmw

Registriert seit: 10. Sep 2019
Ort: OWL
335 Beiträge
 
Delphi 12 Athens
 
#15

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 14:36
hallo,
vielleicht hilft das

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

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 14:41
Ich grübel gerade ob man über HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet die gewünschte Information erhält....
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
walharth

Registriert seit: 12. Nov 2006
13 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 15:20
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!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 15:54
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
walharth

Registriert seit: 12. Nov 2006
13 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 16:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 16:26
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 Uhr.
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