استغلال Sript VBS في الدلفي لاستخراج الرقم التسلسلي للقرص
#11
هناك دالة اسمها GetVolumeInformation وهي تجلب لنا عدة معلومات من بينها الرقم التسلسلي وهدا مثال
لطريقة استعمالها

PHP كود :
procedure TForm1.Button1Click(Sender: TObject);
var
  
VolSerialNumber: DWORD;
  
MaximumComponentLength: DWORD;
  
FileSystemFlags: DWORD;
  
SerialNumber: string;
begin
  GetVolumeInformation
('h:\',
                       nil,
                       0,
                       @VolSerialNumber,
                       MaximumComponentLength,
                       FileSystemFlags,
                       nil,
                       0);
  SerialNumber := IntToHex(HiWord(VolSerialNumber), 4) +
                  '
-' +
                  IntToHex(LoWord(VolSerialNumber), 4);
  ShowMessage(SerialNumber);
end; 
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد
#12
kachwahed كتب :الحصول على الرقم التسلسلي، لكني جربت مكونات MiTeC System Information Component Suite ومكونات أخرى عديدة من هذا النوع وكلها لم لم تف بالغرض

ضمن امثلة MiTeC System Information Component Suite هناك مثال اسمه USBEnum جربه وانظر بنفسك
الرد
#13
me&delphi' كتب :هناك دالة اسمها GetVolumeInformation

مايسمى Volume Serial Numbers رقم عشوائي يعطيه النظام للPartition عند تهيئتها بFormat
http://www.delphi4arab.net/forum/showthread.php?tid=968
الرد
#14
بارك ا لله فيكم جميعا
شكرا كثيرا أستاذ لقد جربت المكون TGetDiskSerial.3.0.0 أيضا وغيره كثير...
كل هذه المكونات تعيد نتائج متشابهة، وليس منها من يعيد الرقم التسلسلي الفيزيائي وليس المنطقي (Logic) فهذا الأخير يمكن الحصول عليه بسهولة باستعمال الدالة GetVolumeInformation كما قال أخي me&delphi وكما ذكرت من قبل.
باختصار كل من عنده مكون أو دالة فيقارن نتيجتها مع الـ VBScript السابق، وإن تطابقا فقد وجد الحل
ملاحظة هامة: هناك الكثير من الأقراص (FlashDisk) المتداولة بين الناس ليس لها رقم فيزيائي أو قيمته صفر، يعني لو تجرب VBScript السابق يعطيك القيمة 0 أو 1.
شكرا كثيرا على تعاونكم، ما زال البحث مستمر وسأوافيكم بالجديد إن شاء الله.
الرد
#15

TGetDiskSerial للحصول على الرقم التسلسلس للقرص الصلب HDD ولا تنفع مع USB Flash Disk
كود :
http://www.devlib.net/tgetdiskserial.htm

إقتباس :يعني لو تجرب VBScript السابق يعطيك القيمة 0 أو 1.
كما قلت وكررت مكونات MiTeC تنفع وهذه صورة توضح ذلك مع اثنين USB Flash Disk مختلفين
[صورة: n32id3.gif]
كما هو واضح بالصورة اضفت صورة تنفيذ VBSلترى ان القرصين مختلفين
والسلام عليكم
الرد
#16
بارك الله فيك أستاذ.
لقد أعدت اختبار الرقم التسلسلي للـ USB Disk باستعمال مكون MiTeC والنتيجة ما يلي:
- هذا الرقم يبقى ثابت حتى بعد عمل تهيئة (Format) للقرص
- هذا الرقم يختلف عن الرقم الذي يصدره VBScript

صورة قبل الـ Format
[صورة: beforeformat.jpg]

صورة بعد الـ Format
[صورة: afterformat.jpg]

الأقراص التي ليس لها رقم تسلسلي فيزيائي (أو لم يتعرف عليه الجهاز) يكتبها 0 أو 1، ومثل هذه لا يمكن استعمالها للاختبار، هذه الصورة لقرص Flash Kingston له رقم تسلسلي تعريفي ثابت يختلف عن الذي تصدره مكونات MiTeC.

[صورة: kingston.jpg]
شكرا أستاذ، ولكم جميعا، سأواصل البحث
الرد
#17

الرقم الذي يظهره MiTEC هو الرقم التسلسلي Serial Number للUSB Flash Disk يضعه المصنع وهو موجود بكل الFladh Disk باختلاف انواعها
وهذه صورة اخرى باستعمال بريمج مايكروسوفت الشهير
USBView
[صورة: s0wspj.gif]
الرد
#18
وجدت ما كنت أبحث عنه:
WMI أو ما يعرف بـ Windows Management Instrumentation هي إضافة من Microsoft تسمح بالتعرف على المعلومات الإدارية للحاسب وأدواة النظام...للمزيد wikipedia

الكود VBScript الذي طرحته سابقا يستعمل استعلام SQL للحصول على المعلومات بهذه التقنية، ويمكن تغيير الاستعلام :
كود :
Select * from Win32_DiskDrive where caption like '%USB%'
إلى:
كود :
Select * from Win32_DiskDrive
للحصول على جميع الأقراص في الجهاز، كما يمكن عرض معلومات أخرى للقرص على غرار caption (أو DeviceID) و Signature (وهذا بيت القصيد، وليس الرقم التسلسلي في الحقيقة) مثل: Model، Description، TotalSectors... وغيرها فيصبح الكود كما يلي:

كود :
On Error Resume Next MyComputer = "." Set obj = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & MyComputer & "\root\cimv2") Set columns = obj.ExecQuery("Select * from Win32_DiskDrive") For Each item in columns Wscript.Echo "DeviceID: " & Item.DeviceID Wscript.Echo "Model: " & Item.Model Wscript.Echo "Description: " & Item.Description Wscript.Echo "Size: " & Item.size Wscript.Echo "Partitions: " & Item.Partitions Wscript.Echo "Manufacturer: " & Item.Manufacturer Wscript.Echo "TotalCylinders: " & Item.TotalCylinders Wscript.Echo "TotalSectors: " & Item.TotalSectors Wscript.Echo "TotalTracks: " & Item.TotalTracks Wscript.Echo "SectorsPerTrack: " & Item.SectorsPerTrack Next

[صورة: signatureusb.png]

وكما حصلنا على بيانات القرص بنفس الطريقة يمكن الحصول على معلومات أخرى حول النظام: Process و Registry وغير ذلك...

المكونات التجارية WmiSet Component Collection For Delphi, C++Builder مخصصة لمثل هذا الغرض، للتحكم في النظام والشبكة و...
الموقع:
كود :
http://www.online-admin.com/wmiset.html

وفي المرفقات نسخة كاملة للمكونات مع الأمثلة، وملف تطبيقي كمثال.
بارك الله في الأستاذ DeltaAziz وشكرا لكم جميعا.


الملفات المرفقة
.rar   WmiSet.v1.65.Full.Source.rar (الحجم : 585.21 ك ب / التحميلات : 130)
.rar   WmiQuery.rar (الحجم : 308.88 ك ب / التحميلات : 116)
الرد
#19
في البداية السلام عليكم



الحمد لله أنك وصلت لمبتغاك أخي العزيز kachwahed
فالحصول على نتيجة بعد بحث طويل مهم جدا

أسف لكوني لم أبحث كثيرا معك لكثرة المشاغل هذه الفترة و سابقا
كنت أعلم بوجود المكونات التي ذكرت سابقا
لكني اردت ادراج وحدة تقوم بهذه الوظيفة
فكانت تدخلاتي سريعة

المهم ان تعم الفائدة للجميع
حياك الله
بالتوفيق لك
و السلام.
الرد
#20
بارك الله فيكم أتمنى لو كانت هناك وحدة لهدا الغرض دون اللجوء الى dll أو مكونات أو شيء آخر
لا اله الا أنت سبحانك اني كنت من الضالمين
الرد


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


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