Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Seriennummer der Systemplatte... (https://www.delphipraxis.net/155119-seriennummer-der-systemplatte.html)

Z4ppy 9. Okt 2010 17:22

Seriennummer der Systemplatte...
 
Ich möchte gerne die Seriennummer derjenigen Festplatte auslesen, auf der das Windoof installiert ist.
Allerdings die echte (vom Hersteller vergebene) Seriennummer, da sich die beim Formatieren ja nicht ändert. Also bitte kein Hinweis auf Themen wie dieses ;)

Ich bin nun auf WMI gestossen und schaffe es auch, darüber (mit der Query 'SELECT Model,SerialNumber FROM Win32_DiskDrive') Modell und Seriennummer auszulesen.
Aber wie finde ich nun herraus, auf welchem der zurückgegebenen Geräte Windoof installiert ist?

MfG Z4ppy

RWarnecke 9. Okt 2010 17:29

AW: Seriennummer der Systemplatte...
 
Frage doch die Systemvariable "SystemRoot" ab.

Z4ppy 9. Okt 2010 17:36

AW: Seriennummer der Systemplatte...
 
Und weiter? Wie finde ich dann raus, auf welchem Gerät die Partition liegt?

MfG Z4ppy

€dit: OK, ich habe hier einen entsprechenden Weg gefunden. Nun hab ich versucht, das in Delphi umzusetzen, allerdings bekomme ich bei der zweiten Query ('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="'+strDeviceID+'"} WHERE AssocClass = Win32_DiskDriveToDiskPartition') den Fehler "Ungültiger Objektpfad" :S

€dit2: Ich habs hingekriegt...

Joerginger 7. Mär 2011 08:30

AW: Seriennummer der Systemplatte...
 
@Z4ppy: würdest Du uns an Deinem Erfolg teilhaben lassen? Ich täte nämlich so eine Routine suchen... Wenn ich mir das von Dir verlinkte VBScript auf dem TechNet Blog ansehe verzweifle ich jetzt schon...

GLG, Joerginger

hathor 7. Mär 2011 09:17

AW: Seriennummer der Systemplatte...
 
Frage:
Aber wie finde ich nun herraus, auf welchem der zurückgegebenen Geräte Windoof installiert ist?

Antwort:
Bei Win32_SystemOperatingSystem - PartComponent stehen die Infos.

Delphi-Quellcode:
uses OleServer, WbemScripting_TLB;
procedure TForm1.Button6Click(Sender: TObject);
resourcestring
  cWQL = 'SELECT PartComponent ' + 'FROM Win32_SystemOperatingSystem';
var
FLocator : ISWbemLocator;
  aSrv : ISWbemServices;
  aObjSet : ISWbemObjectSet;
  pEnum : IEnumVARIANT;
  vOut : OleVariant;
  dwRetrieved : LongWord;
  st : String;
const Computer : String = 'SUPER'; // dein computername
begin
FLocator := CoSWbemLocator.CreateRemote(Computer);
    if FLocator <> nil then
    begin
      aSrv := FLocator.ConnectServer('','','','','','',0,nil);
      aObjSet := aSrv.ExecQuery(cWQL, 'WQL', 0, nil);
      pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
      pEnum.Next(1, vOut, dwRetrieved);
  end;
 st:= VarToStr(vOut.PartComponent);
 Memo1.lines.add(' PartComponent : '+ st);
 Memo1.lines.add(' HardDisk : '+ Copy(st,Pos('Device\\',st)+8,9));
 Memo1.lines.add(' Partition : '+ Copy(st,Pos('Device\\',st)+19,10));
end;

DelphiSecurity 7. Mär 2011 09:25

AW: Seriennummer der Systemplatte...
 
Mich würde der Quellcode auch interessieren. :wink:

:glaskugel:

hathor 7. Mär 2011 10:37

AW: Seriennummer der Systemplatte...
 
Delphi-Quellcode:
function GetIdeHddSn: string;
const
    IDENTIFY_BUFFER_SIZE = 512;
type
    TIDERegs = packed record
        bFeaturesReg: BYTE;     // Used for specifying SMART "commands".
        bSectorCountReg: BYTE;  // IDE sector count register
        bSectorNumberReg: BYTE; // IDE sector number register
        bCylLowReg: BYTE;       // IDE low order cylinder value
        bCylHighReg: BYTE;      // IDE high order cylinder value
        bDriveHeadReg: BYTE;    // IDE drive/head register
        bCommandReg: BYTE;      // Actual IDE command.
        bReserved: BYTE;        // reserved for future use. Must be zero.
    end;
    TSendCmdInParams = packed record
        cBufferSize: DWORD;     // Buffer size in bytes
        irDriveRegs: TIDERegs;  // Structure with drive register values.
        bDriveNumber: BYTE;     // Physical drive number to send command to (0,1,2,3).
        bReserved: array [0..2] of Byte;
        dwReserved: array [0..3] of DWORD;
        bBuffer: array [0..0] of Byte; // Input buffer.
    end;
    TIdSector = packed record
        wGenConfig: Word;
        wNumCyls: Word;
        wReserved: Word;
        wNumHeads: Word;
        wBytesPerTrack: Word;
        wBytesPerSector: Word;
        wSectorsPerTrack: Word;
        wVendorUnique: array [0..2] of Word;
        sSerialNumber: array [0..19] of CHAR;
        wBufferType: Word;
        wBufferSize: Word;
        wECCSize: Word;
        sFirmwareRev: array [0..7] of Char;
        sModelNumber: array [0..39] of Char;
        wMoreVendorUnique: Word;
        wDoubleWordIO: Word;
        wCapabilities: Word;
        wReserved1: Word;
        wPIOTiming: Word;
        wDMATiming: Word;
        wBS: Word;
        wNumCurrentCyls: Word;
        wNumCurrentHeads: Word;
        wNumCurrentSectorsPerTrack: Word;
        ulCurrentSectorCapacity: DWORD;
        wMultSectorStuff: Word;
        ulTotalAddressableSectors: DWORD;
        wSingleWordDMA: Word;
        wMultiWordDMA: Word;
        bReserved: array [0..127] of BYTE;
    end;
    PIdSector = ^TIdSector;
    TDriverStatus = packed record
        bDriverError: Byte;
        bIDEStatus: Byte;    // IDE SMART_IDE_ERROR
        bReserved: array [0..1] of Byte;
        dwReserved: array [0..1] of DWORD;
    end;
    TSendCmdOutParams = packed record
        cBufferSize: DWORD;          // bBuffer
        DriverStatus: TDriverStatus;                      
        bBuffer: array [0..0] of BYTE;
    end;

var
    hDevice             : THandle;
    cbBytesReturned     : DWORD;
    SCIP                : TSendCmdInParams;
    aIdOutCmd           : array [0..( SizeOf( TSendCmdOutParams ) +
        IDENTIFY_BUFFER_SIZE -
        1 ) - 1] of Byte;
    IdOutCmd            : TSendCmdOutParams absolute aIdOutCmd;

    procedure ChangeByteOrder( var Data; Size: Integer );
    var
        ptr             : PChar;
        i               : Integer;
        c               : Char;
    begin
        ptr := @Data;
        for i := 0 to ( Size shr 1 ) - 1 do
        begin
            c := ptr^;
            ptr^ := ( ptr + 1 )^;
            ( ptr + 1 )^ := c;
            Inc( ptr, 2 );
        end;
    end;

begin
    Result := '';                                          
    if SysUtils.Win32Platform = VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
    begin
        // '\\.\PhysicalDrive1\'
        hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or
            GENERIC_WRITE,
            FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
    end
    else // Version Windows 95 OSR2, Windows 98
        hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
    if hDevice = INVALID_HANDLE_VALUE then
        Exit;
    try
        FillChar( SCIP, SizeOf( TSendCmdInParams ) - 1, #0 );
        FillChar( aIdOutCmd, SizeOf( aIdOutCmd ), #0 );
        cbBytesReturned := 0;
        // Set up data structures for IDENTIFY command.
        with SCIP do
        begin
            cBufferSize := IDENTIFY_BUFFER_SIZE; // bDriveNumber := 0;
            with irDriveRegs do
            begin
                bSectorCountReg := 1;
                bSectorNumberReg := 1;
                // if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
                // else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
                bDriveHeadReg := $A0;
                bCommandReg := $EC;
            end;
        end;
        if not DeviceIoControl( hDevice, $0007C088, @SCIP, SizeOf(
            TSendCmdInParams ) - 1,
            @aIdOutCmd, SizeOf( aIdOutCmd ), cbBytesReturned, nil ) then
            Exit;
    finally
        CloseHandle( hDevice );
    end;
    with PIdSector( @IdOutCmd.bBuffer )^ do
    begin
        ChangeByteOrder( sSerialNumber, SizeOf( sSerialNumber ) );
        ( PChar( @sSerialNumber ) + SizeOf( sSerialNumber ) )^ := #0;
        Result := PChar( @sSerialNumber );
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption:= GetIdeHddSn;
end;

Joerginger 7. Mär 2011 12:00

AW: Seriennummer der Systemplatte...
 
Ich danke herzlich für die CodeSpende(n)!

GLG, Joerginger

user0815 7. Mär 2011 12:25

AW: Seriennummer der Systemplatte...
 
google code search findet auch genau diese function: http://www.google.com/codesearch?as_...ense=&as_case=

hathor 7. Mär 2011 16:42

AW: Seriennummer der Systemplatte...
 
Zitat:

Zitat von Z4ppy (Beitrag 1054704)
Ich bin nun auf WMI gestossen und schaffe es auch, darüber (mit der Query 'SELECT Model,SerialNumber FROM Win32_DiskDrive') Modell und Seriennummer auszulesen.
MfG Z4ppy

SerialNumber
Data type: string
Access type: Read-only
Number allocated by the manufacturer to identify the physical media.
Example: WD-WM3493798728
Windows Server 2003, Windows XP, Windows 2000, and Windows NT 4.0:
This property is not available.


Deshalb function GetIdeHddSn - Siehe oben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:18 Uhr.
Seite 1 von 3  1 23      

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