Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem beim auslesen der Festplatten Seriennummer (https://www.delphipraxis.net/79323-problem-beim-auslesen-der-festplatten-seriennummer.html)

Muetze1 23. Okt 2006 21:33

Re: Problem beim auslesen der Festplatten Seriennummer
 
Zitat:

Zitat von dbdeath74
Ich denke es muss über S.M.A.R.T. gehen.

Ich kann dir versichern, dass S.M.A.R.T. die gleichen Rechte braucht, da es genauso ein Handle für das PhysicalDrive braucht.

negaH 24. Okt 2006 09:18

Re: Problem beim auslesen der Festplatten Seriennummer
 
Auch die anderen Tools, die den "dritten Weg" benutzen, benötigen Admin Rechte. Allerdings nur während des Setups der Anwendung wenn ein Treiber installiert wird. Ein Treiber wie GiveIO.sys oder ähnlichem. Denn der "dritte Weg" greift auf die IDE direkt und physikalisch auf die Ports der Laufwerke zu. Wurde also einmalig dieser Treiber installiert (nur unter NT nötig) dann kann später als normaler Benutzer die Funktionalität dieses Treibers benutzt werden, und ergo direkt auf die HD zugegriffen werden und finally somit direkt die HD Register ausgelsen werden, inklusive physikalsicher Serial Nummer.

Der "vierte Weg" für Dummies ist einfach in der Registry nachzuschauen. Am besten mal in der Registry die HD Serialnummer manuell ändern und du wirst sehen das viele der sogenannten "Hardware-Utilities" sich die Daten nur aus der Registry holen ;)

Gruß Hagen

Muetze1 24. Okt 2006 10:55

Re: Problem beim auslesen der Festplatten Seriennummer
 
Die nutzen einen Porttreiber bei IDE? Oh, das wäre doch mehr als kreuz-gefährlich, weil wie wollen sie anstehende bzw. gerade aktive Zugriffe des OS auf die Festplatte mitbekommen? Auch müssen sie sich die nötigen Zugriffe und Informationen für den PIC und DMA Controller holen bzw. über eine API ansprechen. Damit funken diese doch aber ganz schön Windows dazwischen. Das würde die Datensicherheit und Stabilität doch deutlich reduzieren - der Weg wäre mir als Firma/Entwickler einer Info-Software viel zu heikel...

dbdeath74 24. Okt 2006 11:53

Re: Problem beim auslesen der Festplatten Seriennummer
 
Hallo,

danke für eure Antworten :)

Die Methode die ich oben benutze ist ja über die S.M.A.R.T. features der Festplatte (und brauch leider admin rechte).

Die nächste Methode ist über WMI, geht ganz einfach, 5 Zeilen Code ... aber leider erst ab WinXP :(

Die dritte Methode die auch KEINE Admin rechte brauch geht direkt auf die Win API, soviel konnte ich herausfinden.
Aber ich habe leider nicht den Ansatz eines Codeschnippsels gefunden :(

@negaH:

Also HD-Tune braucht definitiv keine Admin rechte und wird nicht installiert. Probier es aus (HD Tune)
Und in der registry steht meines wissens nicht die wirkliche HDD Seriennummer, sondern nur die der logischen Laufwerke.
Ich lasse mich aber gerne eines besseren belehren, registry wäre optimal für mich da ich ja keinen kopierschutz bauen will und es nicht mit böswilligen Usern zu tun habe.

Aber vielleicht kommt ja noch ein WinAPI Guru vorbei der mir sagen kann wie man mit Hilfe der WinAPI vielleicht da ran kommen könnte.

Gruß Oliver

Muetze1 24. Okt 2006 12:56

Re: Problem beim auslesen der Festplatten Seriennummer
 
Zitat:

Zitat von dbdeath74
Und in der registry steht meines wissens nicht die wirkliche HDD Seriennummer, sondern nur die der logischen Laufwerke.

Nein, die Hardwaredaten werden dort mit abgelegt - u.a. auch die wichtigsten Daten des DEVICE INQUIRY bei den Laufwerken.

Vllt. könnte negaH nettwerweise einen kleinen Codeschnipsel posten um die Keys zu erreichen.

Luckie 24. Okt 2006 13:08

Re: Problem beim auslesen der Festplatten Seriennummer
 
Es würde reichen die Schlüssel zu nennen. ;)

dbdeath74 24. Okt 2006 15:16

Re: Problem beim auslesen der Festplatten Seriennummer
 
Zitat:

Zitat von Luckie
Es würde reichen die Schlüssel zu nennen. ;)

ja das würde reichen :)
ich habe die registry schon einmal nach meiner HDD Seriennummer durchsucht, also im Reintext hab ich sie nicht gefunden.

Gruß Oliver

TKC 24. Okt 2006 16:02

Re: Problem beim auslesen der Festplatten Seriennummer
 
schau mal hier

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\I DE

Muetze1 24. Okt 2006 16:26

Re: Problem beim auslesen der Festplatten Seriennummer
 
Zitat:

Zitat von ACE-ppc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\I DE

Die hatte ich so halb auch im Sinn, habe sie aber nicht gepostet, da dort keine Seriennummer zu finden ist.

dbdeath74 26. Okt 2006 12:47

Re: Problem beim auslesen der Festplatten Seriennummer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe jetzt eine Möglichkeit gefunden. Naja so halb ... *g
Ich habe eine Möglichkeit in c++ gefunden die funktioniert und kämpfe mit der Übersetzung :wall:

Hab leider nur rudimentäre c++ kenntnisse :cry:

Also die c++ Lösung gibt es hier:

diskid32, ist freeware und darf weiterverwendet werden.

Es wird im Prinzip auch die S.M.A.R.T. Werte ausgelesen wie ich es schon mache, nur das man es über eine Backdoor als angebliches scsi laufwerk anspricht und so windows austrickst *so habe ich das verstanden*

Falls sich jemand berufen fühlt mir bei der Übersetzung zu helfen :dp:

Es hapert im Moment an der Übersetzung der
Delphi-Quellcode:
STORAGE_PROPERTY_QUERY query;
Das ist ein selbstdefiniertes struct von ihm weiter oben das auf eine(für mich nicht verständliche) Weise von IOCTL_STORAGE_BASE erbt. Oder so *g

Ich würde mich freuen wenn mir jemand helfen könnte :)
Ich hänge mal den c++ code als attachment an und hier ist die fragliche Funktion
Code:
int ReadPhysicalDriveInNTWithZeroRights (void)
{
   int done = FALSE;
   int drive = 0;

   for (drive = 0; drive < MAX_IDE_DRIVES; drive++)
   {
      HANDLE hPhysicalDriveIOCTL = 0;

         //  Try to get a handle to PhysicalDrive IOCTL, report failure
         //  and exit if can't.
      char driveName [256];

      sprintf (driveName, "\\\\.\\PhysicalDrive%d", drive);

         //  Windows NT, Windows 2000, Windows XP - admin rights not required
      hPhysicalDriveIOCTL = CreateFile (driveName, 0,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
      // if (hPhysicalDriveIOCTL == INVALID_HANDLE_VALUE)
      //    printf ("Unable to open physical drive %d, error code: 0x%lX\n",
      //            drive, GetLastError ());

      if (hPhysicalDriveIOCTL != INVALID_HANDLE_VALUE)
      {
       STORAGE_PROPERTY_QUERY query;
         DWORD cbBytesReturned = 0;
       char buffer [10000];

         memset ((void *) & query, 0, sizeof (query));
       query.PropertyId = StorageDeviceProperty;
       query.QueryType = PropertyStandardQuery;

       memset (buffer, 0, sizeof (buffer));

         if ( DeviceIoControl (hPhysicalDriveIOCTL, IOCTL_STORAGE_QUERY_PROPERTY,
                   & query,
                   sizeof (query),
               & buffer,
               sizeof (buffer),
                   & cbBytesReturned, NULL) )
         {         
          STORAGE_DEVICE_DESCRIPTOR * descrip = (STORAGE_DEVICE_DESCRIPTOR *) & buffer;
          char serialNumber [1000];
          char modelNumber [1000];

          strcpy (serialNumber,
                flipAndCodeBytes ( & buffer [descrip -> SerialNumberOffset]));
          strcpy (modelNumber, & buffer [descrip -> ProductIdOffset]);
          if (0 == HardDriveSerialNumber [0] &&
                  //  serial number must be alphanumeric
                     //  (but there can be leading spaces on IBM drives)
               (isalnum (serialNumber [0]) || isalnum (serialNumber [19])))
          {
            strcpy (HardDriveSerialNumber, serialNumber);
            strcpy (HardDriveModelNumber, modelNumber);
            done = TRUE;
          }
Gruß Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr.
Seite 2 von 4     12 34      

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