دالة التعرف على رقم التلسلي الفزيائي القرص الصلب
#7
(01-05-2016, 09:52 AM)Unprogramme كتب : السلام عليكم ورحمة الله وبركاته ،
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج :  Console Application
ولكن يمكن تطويره .
جربته عندي في نظام الويندوز 7 64 بت ، تمت العملية بنجاح .
أضعه هنا بين يدي إخواني ،
و أرجو من الإخوة تجربته على جميع الأنظمة و أنواع القرص الصلب ، و إفادتنا بالنتيجة. Idea

كود :
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.
السلام عليكم
[size=small]EOlesyserror:Bad Variable type[/size]

[size=small]OS: windows 7, 32 bit.[/size]
الخوف من أي محاولة جديدة طريق حتمي للفشل.
الرد


الردود في هذا الموضوع
RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - بواسطة wadoud - 30-11-2016, 02:41 AM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم