delphi4arab منتديات دلفي للعرب
دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي التقنية (https://delphi4arab.net/forum/forumdisplay.php?fid=6)
+--- قسم : دلفي والتعامل مع النظام و الذاكرة (https://delphi4arab.net/forum/forumdisplay.php?fid=20)
+--- الموضوع : دالة التعرف على رقم التلسلي الفزيائي القرص الصلب (/showthread.php?tid=7781)



دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - أبو معاذ - 01-05-2016

السلام عليكم ورحمة الله وبركاته ،
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج :  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.



RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - PLANSHARP - 01-05-2016

EOlesyserror:Bad Variable type

OS: windows 7, 64 bit.


RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - أبو معاذ - 01-05-2016

نسيت أن أقول أنني أستعمل دلفي 7 مع ويندوز 7  64 بت.


RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - أبو معاذ - 07-05-2016

السلام عليكم ورحمة الله وبركاته ،
تم تجربة الدالة بنجاح على قرص صلب من نوع SSD  و أيضا على لوحة Tablet  مزودة بنظام الويندوز.


RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - justnick - 08-05-2016

السلام عليكم ورحمة الله
هل يختلف الرقم الناتج اذا قمت بتشغيل البرنامج كAdministrator او لا؟

انا اعتمدت على unit تسمى magwmi
عند تشغيل البرنامج كمدير ينتج رقم تسلسلى اظنه صحيح ولكن قصير
وعند تشغيل البرنامج بدون صلاحيات المدير ينتج رقم طويل نوعا ما


RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - أبو معاذ - 22-05-2016

السلام عليكم ورحمة الله وبركاته ،
الحمد لله  ، هذا برنامج   (ليس تطبيق Console) للتعرف على  الرقم التسلسلي  الفزيائي الخاص بالقرص الصلب دون اللحوء إلى أي مكون خارجي.
البرنامج منجز في بيئة دلفي 7 + ويندوز 7 64 بت .


RE: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - wadoud - 30-11-2016

(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: دالة التعرف على رقم التلسلي الفزيائي القرص الصلب - أبو معاذ - 30-11-2016

السلام عليكم ورحمة الله وبركاته ،
الدالة التي في هذا الموضوع
استخراج الرقم الفزيائي الحقيقي للقرص الصلب
أفضل بكثير.