![]() |
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 ![]() 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 |
AW: Seriennummer der Systemplatte...
Frage doch die Systemvariable "SystemRoot" ab.
|
AW: Seriennummer der Systemplatte...
Und weiter? Wie finde ich dann raus, auf welchem Gerät die Partition liegt?
MfG Z4ppy €dit: OK, ich habe ![]() €dit2: Ich habs hingekriegt... |
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 |
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; |
AW: Seriennummer der Systemplatte...
Mich würde der Quellcode auch interessieren. :wink:
:glaskugel: |
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; |
AW: Seriennummer der Systemplatte...
Ich danke herzlich für die CodeSpende(n)!
GLG, Joerginger |
AW: Seriennummer der Systemplatte...
google code search findet auch genau diese function:
![]() |
AW: Seriennummer der Systemplatte...
Zitat:
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 23:16 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