delphi4arab منتديات دلفي للعرب

نسخة كاملة : دالة التعرف على رقم التلسلي الفزيائي القرص الصلب
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته ،
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج :  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.
EOlesyserror:Bad Variable type

OS: windows 7, 64 bit.
نسيت أن أقول أنني أستعمل دلفي 7 مع ويندوز 7  64 بت.
السلام عليكم ورحمة الله وبركاته ،
تم تجربة الدالة بنجاح على قرص صلب من نوع SSD  و أيضا على لوحة Tablet  مزودة بنظام الويندوز.
السلام عليكم ورحمة الله
هل يختلف الرقم الناتج اذا قمت بتشغيل البرنامج كAdministrator او لا؟

انا اعتمدت على unit تسمى magwmi
عند تشغيل البرنامج كمدير ينتج رقم تسلسلى اظنه صحيح ولكن قصير
وعند تشغيل البرنامج بدون صلاحيات المدير ينتج رقم طويل نوعا ما
السلام عليكم ورحمة الله وبركاته ،
الحمد لله  ، هذا برنامج   (ليس تطبيق Console) للتعرف على  الرقم التسلسلي  الفزيائي الخاص بالقرص الصلب دون اللحوء إلى أي مكون خارجي.
البرنامج منجز في بيئة دلفي 7 + ويندوز 7 64 بت .
(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]
السلام عليكم ورحمة الله وبركاته ،
الدالة التي في هذا الموضوع
استخراج الرقم الفزيائي الحقيقي للقرص الصلب
أفضل بكثير.