PDA

View Full Version : بدست آوردن شماره سریال اصلی هارد



bps20590
شنبه 26 اسفند 1385, 15:53 عصر
لطفا اگرکسی راه حل بدست آوردن شماره سریال اصلی هارد رامی داند بی زحمت به ما هم بگوید یاراهنمایی بکند

DAMAVAND
یک شنبه 27 اسفند 1385, 10:01 صبح
لطفا اگرکسی راه حل بدست آوردن شماره سریال اصلی هارد رامی داند بی زحمت به ما هم بگوید یاراهنمایی بکند


شماره سریال هارد :

shobair
دوشنبه 13 فروردین 1386, 23:19 عصر
شماره سریال هارد :

سلام

کد شما، شماره سریال درایو رو میده، نه شماره سریال هارد دیسک. باید از توابع WMI استفاده کنید.

شبیر

Saeid59_m
سه شنبه 14 فروردین 1386, 08:26 صبح
در این یونیت از GetIdeSerialNumber استفاده کن ولی فقط در ویندوز اکس پی جواب می ده

hossein taghi zadeh
سه شنبه 14 فروردین 1386, 11:17 صبح
با سلام

از تابع GetSystemCode یونیت زیر استفاده کنید.
این تابع مدل هارد رو بر می‌گردونه.

Mahdi_S_T
چهارشنبه 15 فروردین 1386, 13:26 عصر
می تونی از کامپوننت HDDInfo به همراه سورس استفاده کنی
یا کامپوننت MiTec

shm428
جمعه 21 اردیبهشت 1386, 15:44 عصر
همه این کد ها چیزی نیست که دوست ما خواسته
لطفا یه چیزی که خواب بده را بزارید
من هم خیلی نیاز دارم

Keramatifar
شنبه 22 اردیبهشت 1386, 13:04 عصر
یه کامپوننت سراغ دارم که شماره سریال اصلی و ... تمام قطعات سیستم رو میده ولی کامپوننتش تجاری است.
در صورتی که تمایل به تهیه اش داشتی برایم PM بذار تا راهنمائیت کنم چجوری تهیه کنی

greenway
شنبه 22 اردیبهشت 1386, 21:31 عصر
DiskID32 رو در گوگل جستجو کنید.
http://www.google.com/search?sourceid=navclient&ie=UTF-8&rlz=1T4RNWN_enIR217IR218&q=DiskID32

Valadi
یک شنبه 23 اردیبهشت 1386, 13:24 عصر
این هم :
unit hddinfo;

interface

uses Windows, SysUtils, Classes;

const
IOCTL_STORAGE_QUERY_PROPERTY = $2D1400;

type
THDDInfo = class (TObject)
private
FDriveNumber: Byte;
FFileHandle: Cardinal;
FInfoAvailable: Boolean;
FProductRevision: string;
FProductId: string;
FSerialNumber: string;
FVendorId: string;
procedure ReadInfo;
procedure SetDriveNumber(const Value: Byte);
public
constructor Create;
property DriveNumber: Byte read FDriveNumber write SetDriveNumber;
property VendorId: string read FVendorId;
property ProductId: string read FProductId;
property ProductRevision: string read FProductRevision;
property SerialNumber: string read FSerialNumber;
function SerialNumberInt: Cardinal;
function SerialNumberText: string;
function IsInfoAvailable: Boolean;
end;

implementation

type

STORAGE_PROPERTY_QUERY = packed record
PropertyId: DWORD;
QueryType: DWORD;
AdditionalParameters: array[0..3] of Byte;
end;

STORAGE_DEVICE_DESCRIPTOR = packed record
Version: ULONG;
Size: ULONG;
DeviceType: Byte;
DeviceTypeModifier: Byte;
RemovableMedia: Boolean;
CommandQueueing: Boolean;
VendorIdOffset: ULONG;
ProductIdOffset: ULONG;
ProductRevisionOffset: ULONG;
SerialNumberOffset: ULONG;
STORAGE_BUS_TYPE: DWORD;
RawPropertiesLength: ULONG;
RawDeviceProperties: array[0..511] of Byte;
end;

function ByteToChar(const B: Byte): Char;
begin
Result := Chr(B + $30)
end;

function SerialNumberToCardinal (SerNum: String): Cardinal;
begin
HexToBin(PChar(SerNum), PChar(@Result), SizeOf(Cardinal));
end;

function SerialNumberToString(SerNum: String): String;
var
I, StrLen: Integer;
Pair: string;
B: Byte;
Ch: Char absolute B;

begin
Result := '';
StrLen := Length(SerNum);

if Odd(StrLen) then Exit;

I := 1;

while I < StrLen do
begin
Pair := Copy (SerNum, I, 2);
HexToBin(PChar(Pair), PChar(@B), 1);
Result := Result + Chr(B);
Inc(I, 2);
end;

I := 1;

while I < Length(Result) do
begin
Ch := Result[I];
Result[I] := Result[I + 1];
Result[I + 1] := Ch;
Inc(I, 2);
end;
end;

constructor THddInfo.Create;
begin
inherited;

SetDriveNumber(0);
end;

function THDDInfo.IsInfoAvailable: Boolean;
begin
Result := FInfoAvailable
end;

procedure THDDInfo.ReadInfo;
type
PCharArray = ^TCharArray;
TCharArray = array[0..32767] of Char;

var
Returned: Cardinal;
Status: LongBool;
PropQuery: STORAGE_PROPERTY_QUERY;
DeviceDescriptor: STORAGE_DEVICE_DESCRIPTOR;
PCh: PChar;

begin
FInfoAvailable := False;
FProductRevision := '';
FProductId := '';
FSerialNumber := '';
FVendorId := '';

try
FFileHandle := CreateFile(
PChar('\\.\PhysicalDrive' + ByteToChar(FDriveNumber)),
0,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,
0
);

if FFileHandle = INVALID_HANDLE_VALUE then RaiseLastOSError;

ZeroMemory(@PropQuery, SizeOf(PropQuery));
ZeroMemory(@DeviceDescriptor, SizeOf(DeviceDescriptor));

DeviceDescriptor.Size := SizeOf(DeviceDescriptor);

Status := DeviceIoControl(
FFileHandle,
IOCTL_STORAGE_QUERY_PROPERTY,
@PropQuery,
SizeOf(PropQuery),
@DeviceDescriptor,
DeviceDescriptor.Size,
Returned,
nil
);

if not Status then RaiseLastOSError;

if DeviceDescriptor.VendorIdOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.VendorIdOffset];
FVendorId := PCh;
end;

if DeviceDescriptor.ProductIdOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductIdOffset];
FProductId := PCh;
end;

if DeviceDescriptor.ProductRevisionOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.ProductRevisionOffset];
FProductRevision := PCh;
end;

if DeviceDescriptor.SerialNumberOffset <> 0 then
begin
PCh := @PCharArray(@DeviceDescriptor)^[DeviceDescriptor.SerialNumberOffset];
FSerialNumber := PCh;
end;

FInfoAvailable := True;
finally
if FFileHandle <> INVALID_HANDLE_VALUE then CloseHandle(FFileHandle);
end;
end;

function THDDInfo.SerialNumberInt: Cardinal;
begin
Result := 0;
if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToCardinal(FSerialNumber)
end;

function THDDInfo.SerialNumberText: string;
begin
Result := '';
if ((IsInfoAvailable = True) and (FSerialNumber <> '')) then Result := SerialNumberToString(FSerialNumber)
end;

procedure THDDInfo.SetDriveNumber(const Value: Byte);
begin
FDriveNumber := Value;
ReadInfo;
end;

end.

Amir Oveisi
یک شنبه 23 اردیبهشت 1386, 14:15 عصر
بهترین روس به نظر من استفاده از WMI هست دوست عزیز
تو بخش #C اگه بگردید هست

shm428
جمعه 28 اردیبهشت 1386, 20:32 عصر
سلام دوستان
من کد بدست اوردن شماره هارد دیسک را تو یکی از سایت های انگلیسی پیدا کردم
و روی انواع هارد ها امتحان کردم جواب می ده

koorosh-kabir-2564
جمعه 28 اردیبهشت 1386, 20:55 عصر
من یک dll دارم که میتونه برای شما مفید باشه شما میتونید از این تابع استفاده کنید GetIdhardsepahan
:لبخندساده: البته این dll برای شرکت سپاهان هست
و با کد زیر میتونید ازش استفاده کنید



function GetIdhardsepahan : pchar;external 'serialdll.dll';

برای ورود dll به برنامه و کد زیر برای مثال

var
s:string;
begin
s:=Getidhardsepahan;
label9.Caption:='Rigester Number: '+s;
end;

soroush_vs
شنبه 29 اردیبهشت 1386, 12:28 عصر
البته این dll برای شرکت سپاهان هست

یعنی مجانی نیست؟

Justfriend
دوشنبه 21 مرداد 1387, 17:14 عصر
در این یونیت از GetIdeSerialNumber استفاده کن ولی فقط در ویندوز اکس پی جواب می ده



سلام آقا سعید

خسته نباشی . یک دنیا ممنون بخاطر یونیتی که برای بدست آوردن سریال هارد ارائه کردی

taknegaar
جمعه 12 مهر 1387, 18:10 عصر
Delphi component THDDInfo (Source)

THDDInfo - nonvisual Delphi component provided low level information about IDE, SCSI and ATAPI devices.

Supports Win9x, WinNT, XP and Vista platforms, provided information about IDE, ATAPI and SCSI devices.

Provided information:

* drive type
* Model sting
* Firmware revision
* Serial number

For IDE also:

* drive geometry (cylinders, heads, sectors per track)
* LBA sectors count
* drive size (nonformatted)
* Controller buffer size

THDDInfo v 2.2:
http://artsoft.nm.ru/download/hddinfo.zip

parastoo_zamani
دوشنبه 06 مهر 1388, 12:51 عصر
بدست آوردن سریال هارد دیسک در کلیه ویندوزها


function GetIdeSerialNumber : 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
// Buffer size in bytes
cBufferSize : DWORD;
// Structure with drive register values.
irDriveRegs : TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber : BYTE;
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
// Error code from driver, or 0 if no error.
bDriverError : Byte;
// Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR.
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// Size of bBuffer in bytes
cBufferSize : DWORD;
// Driver status structure.
DriverStatus : TDriverStatus;
// Buffer of arbitrary length in which to store the data read from the drive.
bBuffer : Array[0..0] of BYTE;
end;

var hDevice : THandle;
cbBytesReturned : DWORD;
ptr : PChar;
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 := ''; // return empty string on error
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT, Windows 2000
begin
// warning! change name for other drives: ex.: second drive '\\.\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;