01-05-2016, 09:52 AM
السلام عليكم ورحمة الله وبركاته ،
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج : Console Application
ولكن يمكن تطويره .
جربته عندي في نظام الويندوز 7 64 بت ، تمت العملية بنجاح .
أضعه هنا بين يدي إخواني ،
و أرجو من الإخوة تجربته على جميع الأنظمة و أنواع القرص الصلب ، و إفادتنا بالنتيجة.
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج : Console Application
ولكن يمكن تطويره .
جربته عندي في نظام الويندوز 7 64 بت ، تمت العملية بنجاح .
أضعه هنا بين يدي إخواني ،
و أرجو من الإخوة تجربته على جميع الأنظمة و أنواع القرص الصلب ، و إفادتنا بالنتيجة.
كود :
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
var MonSerie1 , MonSerie : string ;
function GetDiskSerial(const Drive:AnsiChar):string;
var
FSWbemLocator : OLEVariant;
objWMIService : OLEVariant;
colDiskDrives : OLEVariant;
colLogicalDisks: OLEVariant;
colPartitions : OLEVariant;
objDiskDrive : OLEVariant;
objPartition : OLEVariant;
objLogicalDisk : OLEVariant;
oEnumDiskDrive : IEnumvariant;
oEnumPartition : IEnumvariant;
oEnumLogical : IEnumvariant;
iValue : LongWord;
DeviceID : string;
begin;
Result:='';
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
objWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', ''); //Connect to the WMI
colDiskDrives := objWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',0);
oEnumDiskDrive:= IUnknown(colDiskDrives._NewEnum) as IEnumVariant;
while oEnumDiskDrive.Next(1, objDiskDrive, iValue) = 0 do
begin
DeviceID := StringReplace(objDiskDrive.DeviceID,'\','\\',[rfReplaceAll]); //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
colPartitions := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));//link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
oEnumPartition := IUnknown(colPartitions._NewEnum) as IEnumVariant;
while oEnumPartition.Next(1, objPartition, iValue) = 0 do
begin
colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+objPartition.DeviceID+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'); //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
oEnumLogical := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;
while oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 do
begin
if objLogicalDisk.DeviceID=(Drive+':') then //compare the device id
begin
Result:=objDiskDrive.SerialNumber;
Exit;
end;
objLogicalDisk:=Unassigned;
end;
objPartition:=Unassigned;
end;
end;
end;
begin
try
CoInitialize(nil);
try
MonSerie1 := GetDiskSerial('C');
MonSerie := TrimLeft(TrimRight(MonSerie1));
Writeln(MonSerie);
Readln;
finally
CoUninitialize;
end;
except
on E:Exception do
begin
Writeln(E.Classname, ':', E.Message);
Readln;
end;
end;
end.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.