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
walharth

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

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 11:19
Hallo zusammen,

ich verwende in meinem Programm den WMIService, um die angeschlossenen Laufwerke, vor allem die USB-Sticks zu erkennen. Dabei benötige ich die Variable FWbemObject.PNPDeviceID.

Leider habe ich nun bei einigen Usern festgestellt, dass das

FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive WHERE InterfaceType = "USB"');

bei einigen Tablet-Computern leer bleibt (u.a. auf dem Microsoft Surface Tablet mit Windows 10).

Ich suche nun nach einer 2. Möglichkeit, auf die ich zugreifen kann und hatte mir folgendes vorgestellt:

Falls das FWbemObjectSet nach dem Query-Befehl leer ist, könnte das Programm auf eine Alternative (evtl. eine kleine EXE in C++, ...) zurückgreifen, die aus meinem Delphi Programm heraus starte um die Laufwerke in eine Liste einzulesen (z.B. eine Textdatei). Leider bin ich mit C++ nicht vertraut.

Ich habe hier einen Link gefunden: https://stackoverflow.com/questions/...om-wmi-using-c


Wer könnte mir dabei weiterhelfen? Ich wäre für Eure Hilfe sehr dankbar!
  Mit Zitat antworten Zitat
Andreas13

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

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 11: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
 
#3

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 12: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
 
#4

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 12: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
 
#5

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 13: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
(Gast)

n/a Beiträge
 
#6

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 13: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
 
#7

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 13: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
 
#8

AW: USB-Seriennummer auslesen

  Alt 20. Mär 2021, 14: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
Antwort Antwort


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 19:57 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