دالة التعرف على رقم التلسلي الفزيائي القرص الصلب
#1
السلام عليكم ورحمة الله وبركاته ،
منذ مدة و أنا أبحث عن دالة استخراج رقم القرص الصلب ، دون استعمال مكون خارجي ،
وجدت على الكود ، عبارة عن برنامج :  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.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 2 users say قال شكرا ل أبو معاذ على المشاركة المفيدة
  • wadoud, kito
الرد
#2
EOlesyserror:Bad Variable type

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

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


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


الملفات المرفقة
.rar   NumHardSerial.rar (الحجم : 8.68 ك ب / التحميلات : 114)
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
[-] كل من 1 user says قال شكرا ل أبو معاذ على المشاركة المفيدة
  • wadoud
الرد
#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]
الخوف من أي محاولة جديدة طريق حتمي للفشل.
الرد
#8
السلام عليكم ورحمة الله وبركاته ،
الدالة التي في هذا الموضوع
استخراج الرقم الفزيائي الحقيقي للقرص الصلب
أفضل بكثير.
اللهم اجعلني من أهل القرآن ، الذين هم أهلك و خاصتك.
تذكر بأن الوقت الذي تلهو فيه ، غيرك يبني مجده فيه.
الرد


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


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