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
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

AW: USB-Seriennummer auslesen

  Alt 23. Jan 2012, 09:29
Ich hab's aber "so rum" gebraucht.Aber es ist ja kein 1000-Zeiler. Das kriegst Du schon hin, oder?
Ich selbst brauche die Funktion z.Zt. nicht, sondern ich hab nur versucht dich in die richtige Richtung zu schubsen.
In der Überschrift steht "Seriennummer auslesen", in Wirklichkeit wird aber geprüft ob eine Seriennummer in einer Liste vorhanden ist.
Auch der Name "FindUsbSerialNumber()" passt nicht zu dem was die Funktion tut; sie müsste eher "CheckUsbSerialNumbers()" heissen.
Für die Code-Library wäre das Auslesen aller USB Seriennummern deutlich nützlicher als eine Funktion die nur prüft ob die erste gefundene USB Seriennummer in einer Stringliste enthalten ist.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: USB-Seriennummer auslesen

  Alt 23. Jan 2012, 09:46
Es ist auf jeden Fall - schon wegen der Wiederverwendbarkeit - sinnvoller die einzelnen Funktionsteile auseinander zu ziehen.

Möglich wäre folgende Implementierung:
Delphi-Quellcode:
unit USBSerialNumber;

interface

uses
  Classes;

function GetUSBSerialNumbers( AList : TStrings ) : Boolean;

function CheckUSBSerialNumbers( ASerialList : TStrings ) : Boolean; overload;
function CheckUSBSerialNumbers( ASerial : string ) : Boolean; overload;

implementation

uses
  SetupAPI;

function GetUSBSerialNumbers( AList : TStrings ) : Boolean;
// Hier die Original-Routine, die aber nur die Liste mit den ausgelesenen Seriennummern liefert

function CheckUSBSerialNumbers( ASerialList : TStrings ) : Boolean; overload;
var
  AList : TStrings;
begin
  Result := False;
  AList := TStringList.Create;
  try
    if GetUSBSerialNumbers( AList ) then
    // hier jetzt die Seriennummern vergleichen
  finally
    AList.Free;
  end;
end;

function CheckUSBSerialNumbers( ASerial : string ) : Boolean; overload;
var
  AList : TStrings;
begin
  AList := TStringList.Create;
  try
    AList.Add( ASerial );
    Result := CheckUSBSerialNumbers( AList );
  finally
    AList.Free;
  end;
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: USB-Seriennummer auslesen

  Alt 3. Feb 2012, 21:21
Hallo zusammen,

wie man das Ganze verwendet, ist ja doch sehr von der Anwendung abhängig. Es geht nicht darum, wie und ob man TStringList verwendet.

Der Witz ist eigentlich, dass man GUID_DEVINTERFACE_USB_DEVICE verwendet und nicht die vielen anderen Deskriptoren (zum Beispiel Volume oder Hid), die zwar teilweise auch zum Ziel führen, aber unschöne Sonderbehandlungen für WinXP/Vista/Win7 zur Folge haben.

Wenn man per Google oder hier sucht, findet man relativ alte Beiträge, die selten bis gar nicht auf Win7 eingehen und eben nicht GUID_DEVINTERFACE_USB_DEVICE verwenden.

Wer sich mit der Seriennummerproblematik beschäftigt, findet meinen Ansatz vielleicht interessant, der aber nichts weiter ist als eine Umwandlung der vorhandenen Ansätze. Wie und ob das Ganze "codelibwürdig" ist, ist mir eigentlich nicht sonderlich wichtig.

Grüße,
Uwe

P.S.: Das Problem mit USB-Sticks, die alle dieselbe Seriennummer haben, ist mir schon bekannt, war aber für meinen Anforderungsfall nicht von Belang. Es ging darum eine Anwendung nur dann zu starten, wenn ein USB-Stick aus einer Menge von zugelassenen USB-Sticks am Rechner steckt. Billig-USB-Sticks mit "Unseriennummern" wurden einfach nicht zugelassen.
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
neo4a

Registriert seit: 22. Jan 2007
Ort: Ingolstadt
362 Beiträge
 
Delphi XE2 Architect
 
#4

AW: USB-Seriennummer auslesen

  Alt 4. Feb 2012, 07:57
Hier noch als Ergänzung ein Code-Fragment über den WMI-Ansatz:

Delphi-Quellcode:
var
  objWMIService: OLEVariant;
  colItems: OLEVariant;
  colItem: OLEVariant;
  oEnum: IEnumvariant;
  i: Integer;

  aUSBSerial : string;
  aRegexpr : TArray<string>;
  aDeviceID : string;

begin
  try
    objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2');
    colItems := objWMIService.ExecQuery('Select * From Win32_DiskDrive Where InterfaceType="USB"', 'WQL', 0);
    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;
    for i := 0 to colItems.Count - 1 do
      if oEnum.Next(1, colItem, iValue) = 0 then
      begin
        // Get the first part:
        aRegexpr := TRegEx.Split(colItem.PNPDeviceID, '\\');
        // Split with & and get the first part.
        aRegexpr := TRegEx.Split(aRegexpr[High(aRegexpr)], '&');
        aUSBSerial := aRegexpr[0];

        //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
        aDeviceID := StringReplace(VarStrNull(colItem.DeviceID),'\','\\',[rfReplaceAll]);
Beim Einsatz von zugelassenen USB-Sticks ist darauf zu achten, dass es für eine Reihe von OEM-Produkten (z.B. ChipsBank etc.) inoffizielle Software gibt, mit der man u.a. die Seriennr. und den Sticknamen setzen kann. Damit muss mein freundlicher Raubkopierer noch nicht mal mehr ein Hacker sein. AFAIK gibt es für einige Marken-Produkte (Sandisk) das - bislang - noch nicht. Wen es interessiert, der sucht einfach nach einer russischen Flashboot-Seite und erkundigt sich nach dem Stand der Dinge. Auf jeden Fall darf man sich mit der Abfrage einer zugelassenen Seriennr. allein auch nicht allzu sicher sein.
Andreas
  Mit Zitat antworten Zitat
Life
(Gast)

n/a Beiträge
 
#5

AW: USB-Seriennummer auslesen

  Alt 1. Mär 2012, 23:44
Nabend


hab mich durch eure code´s gearbeitet, (setupApi zwar zum download gefunden aber wie einbauen, bei dem anderen bekomme die Meldung das Form1 nicht deklariert wurde ...) bin in dem bereich noch absoluter Neuling.
..dennoch irgendwie bekomme es nicht wirklich gebacken das wenn einen bestimmten USB stick (snr Erkennung) anstecke sich dann eine bestimmte .exe (C:\magicn\menu.exe) öffnet....

Könnt Ihr mir da weiterhelfen?
  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:35 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