الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الحصول على سيريال الماذربورد برمجيا

بدأه Mohammad Elsheimy في 30 يونيو 2009 · 7 رد · 3,686 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

قمت بكتابة هذا الدرس سابقا في موقعي
.

نظرة خاطفة

سوف نقوم في هذا الدرس بإذن الله تعالى بشرح كيفية الحصول على سيريال اللوحة الأم Motherboard برمجيا باستخدام الدوت نت مع تقنية WMI (Windows Management Instrumentation). سوف نبدأ بشرح نبذة عن WMI ثم سوف نقوم بسرد وشرح الكود المخصص للحصول على سيريال الماذربورد من الـ WMI.

مقدمة

واحدة من أسهل وأبسط الطرق للحصول على معلومات عن النظام والأجهزة Hardware هي باستخدام WMI وهي ترمز إلى Windows Management Instrumentation أي "توجيه إدارة الويندوز".

تم ابتكار وتقديم تقديم WMI أول مرة كجزء من ويندوز 2000 ثم توالت أنظمة التشغيل بعد ذلك وتوالى تطوير WMI وتقديمها كجزء من أنظمة التشغيل هذه. وتقوم فكرة WMI على أنها توفر لك طريقة للحصول على معلومات النظام والهاردوير والشبكات والبرامج الموجودة على النظام وغيرها.

تمتاز WMI بتركيبها المذهل، فهي تم تطويرها كقاعدة بيانات ضخمة. فعلى سبيل المثال معلومات الماذربورد يتم تسجيلها في الجدول Win32_BaseBoard. والجدول Win32_BaseBoard بدوره يحتوي على عدة أعمدة Columns تحتوي على المعلومات المسجلة. فعلى سبيل المثال فمن الأعمدة التي يحتويها الجدول Win32_BaseBoard والتي تمثل بعض بيانات الماذربورد:

  • SerialNumber: سيريال الماذربورد. أحيانا لا يكون مسجل بها السيريال ويكون مسجل بالعمود Product.
  • Product: نوع الماذربورد. وأحيانا يكون مسجل بيها السيريال إذا لم يكن مسجل بالعمود SerialNumber.

ولهذا يمكننا الاعتماد على العمودين SerialNumber و Product للحصول على سيريال الماذربورد. من المفيد أيضا معرفة أن WMI يعطي مسميات أخرى لمكوناته. فعلى سبيل المثال في WMI نسمي الجدول Table باسم Class أي صنف، والصف Row وهو البيانات الموجودة في الجدول نسميها باسم Object أي عنصر، وأما العمود Column فنسميه باسم Property أي صفة. ولهذا يمكننا القول أن الصنف أو التصنيف Win32_BaseBoard والذي يحتوي على بيانات الماذربورد يحتوي على عنصر واحد Object والذي يمثل بيانات الماذربورد الواحدة (ربما لو كان يمكن للجهاز أن يحتوي أكثر من ماذربورد لوجدنا في هذه الـ Class أكثر من صف أو بمعنى آخر أكثر من Object بعدد الماذربوردات التي تم توصيلها لكل واحدة فيها صف Object.) وأيضا فإن الـ Class الخاصة بالماذربورد Win32_BaseBoard تحتوي على بيانات الماذربورد مقسمة إلى أعمدة أو بمعنى آخر Properties خصائص.

ومن المثير أيضا أنه يمكنك الحصول على بيانات الماذربورد عن طريق عمل استعلام Query يشبه إلى حد كبير استعلامات SQL أو بمعنى آخر جمل SQL الاستعلامية والتي تبدأ بـ SELECT.

التطبيق

كما أن WMI تم تركيبها كقاعدة بيانات، يتم الاستعلام عن البيانات بداخلها بنفس الطريقة كما في قواعد البيانات الحقيقة ولكن باختلاف الـ Classes المستخدمة. فعلى سبيل المثال كي نقوم بالاستعلام عن سيريال الماذربورد سوف نقوم أولا بإنشاء عنصر من النوع ManagementObjectSearcher والذي سوف يحوي جملة SQL الخاصة بالاستعلام. ثم سوف نقوم بعد ذلك بتنفيذ الاستعلام عن طريق الدالة Get() الموجودة في العنصر ManagementObjectSearcher والتي تقوم بتنفيذ أمر الاستعلام وإرجاع بيانات عبارة عن مجموعة Collection من العناصر ManagementObject والتي تمثل الصفوف (أي العناصر) التي تم استرجاعها وفي حالتنا هذه لأن هناك ماذربورد واحدة في الجهاز فسوف تكون هذه الـ Collection لا تحتوي إلا على عنصر واحد من النوع ManagementObject. بالإضافة إلى ذلك، يمكنك استخدام الخاصية Properties الخاصة بالعنصر ManagementObject لإرجاع الأعمدة (يمعنى آخر الخصائص Properties) الخاصة بهذا الصف (بمعنى آخر العنصر Object.)

من المهم معرفة أن جميع العناصر التي تمكننا من التعامل مع تقنية WMI موجودة في الـ Namespace المسمى بـ System.Management وهو موجود في المكتبة System.Management.dll. ولذلك يجب عليك إضافة هذه المكتبة إلى References الخاصة بالمشروع.

بعد إضافة المكتبة System.Management.dll إلى References الخاصة بالمشروع ويتم ذلك عن طريق عن قائمة Project -> Add Reference ننتقل الآن إلى خطوة التالية وهي خطوة الكود. فالتالي هو كود التنفيذ في C# يليه كود VB.NET.

لا تنسى إضافة جملة using (في C#) أو جملة Imports (في VB.NET) للـ Namespace المسماة System.Mangement.

تم شرح الكود من خلال الملاحظات Comments على الكود.

لاحظ أن الكود يعتمد على أن المشروع من نوع Console Application. يمكنك تغيير ذلك بالطبع واستخدام دالة الحصول على سيريال الماذربورد فقط وترك دالة التطبيق وهي دالة Main().

// C# Code
static void Main()
{
	Console.WriteLine("Motherboard Serial Number = \n\t{0}",
		GetMotherboardSerialNumber());
}
static string GetMotherboardSerialNumber()
{
	// نقوم بإنشاء العنصر
	// ManagementObjectSearcher
	// وهو الذي سوف يقوم باحتواء جملة الاستعلام وبتنفيذها
	// لاحظ أنه يمكنك استخدام العلامة
	// *
	// للحصول على جميع الأعدمة
	// Properties
	// في الجدول
	// Class
	// الذي يحوي بيانات الماذربورد وهو
	// Win32_BaseBoard
	ManagementObjectSearcher searcher = new ManagementObjectSearcher
		("SELECT SerialNumber, Product FROM Win32_BaseBoard");
	// تنفيذ الأمر
	// يحوي العنصر
	// ManagementObjectCollection
	// جميع البيانات المسترجعة من الاستعلام
	// والتي تتمثل في هيئة صفوف
	// Objects
	ManagementObjectCollection information = searcher.Get();
	string serialNumber = string.Empty;
	// المرور على جميع الصفوف
	// لأنها ماذربورد واحدة فسوف يكون هناك صف واحد
	foreach (ManagementObject obj in information)
	{
		// الاستعلام عن العمود
		// SerialNumber
		// إذا لم يحوي بيانات
		// يتم استخدام العمود
		// Product
		// كبديل
		if (obj.Properties["SerialNumber"].Value.ToString().Trim() != string.Empty)
			serialNumber = obj.Properties["SerialNumber"].Value.ToString().Trim();
		else
			serialNumber = obj.Properties["Product"].Value.ToString().Trim();
		// لا توجد فائدة للسطر التالي لأنها ماذربورد واحدة
		break;
	}

	// يفضل استخدام الدالة
	// Dispose
	// لإلغاء العنصر
	// ManagementObjectCollection
	// من الذاكرة
	searcher.Dispose();

	return serialNumber;
}

وهذا كود VB.NET

' VB.NET Code
Sub Main()
	Console.WriteLine("Motherboard Serial Number = ")
	Console.WriteLine(vbTab & GetMotherboardSerialNumber())
End Sub

Function GetMotherboardSerialNumber() As String
	' نقوم بإنشاء العنصر
	' ManagementObjectSearcher
	' وهو الذي سوف يقوم باحتواء جملة الاستعلام وبتنفيذها
	' لاحظ أنه يمكنك استخدام العلامة
	' *
	' للحصول على جميع الأعدمة
	' Properties
	' في الجدول
	' Class
	' الذي يحوي بيانات الماذربورد وهو
	' Win32_BaseBoard
	Dim searcher As New ManagementObjectSearcher 
		("SELECT SerialNumber, Product FROM Win32_BaseBoard")

	' تنفيذ الأمر
	' يحوي العنصر
	' ManagementObjectCollection
	' جميع البيانات المسترجعة من الاستعلام
	' والتي تتمثل في هيئة صفوف
	' Objects
	Dim information As ManagementObjectCollection = searcher.Get()

	Dim serialNumber As String = String.Empty

	' المرور على جميع الصفوف
	' لأنها ماذربورد واحدة فسوف يكون هناك صف واحد
	For Each obj As ManagementObject In information
		' الاستعلام عن العمود
		' SerialNumber
		' إذا لم يحوي بيانات
		' يتم استخدام العمود
		' Product
		' كبديل
		If (obj.Properties("SerialNumber").Value.ToString().Trim() <> String.Empty) Then
			serialNumber = obj.Properties("SerialNumber").Value.ToString().Trim()
		Else
			serialNumber = obj.Properties("Product").Value.ToString().Trim()
		End If
		' لا توجد فائدة للسطر التالي لأنها ماذربورد واحدة
		Exit For
	Next

	' يفضل استخدام الدالة
	' Dispose
	' لإلغاء العنصر
	' ManagementObjectCollection
	' من الذاكرة
	searcher.Dispose()

	Return serialNumber
End Function

خاتمة

من هذا الدرس تعلمنا ليس فقط الحصول على سيريال الماذربورد! بل إننا تعلمنا كيفية التعامل مع WMI وعمل استعلامات عليها. ومن هذا المنطلق يمكنك الحصول على التركيب الكامل لـ WMI من هنا. فيمكنك من الرابط السابق الحصول على جميع تركيبات WMI من جداول وأعمدة ووصف وشرح لكل جدول وعمود. فمن هناك مثلا يمكنك القراءة عن الجدول المختص بحفظ بيانات القرص الصلب Hard Disk كي يتسنى لك الحصول على السيريال الخاص به بنفس الطريقة.

الجدير بالذكر أنه يمكنك استخدام سيريال الماذربورد في عمل حماية على برنامجك مثلا. فيمكنك على سبيل المثال تشفير السيريال بطريقة معينة (على سبيل المثال تشفير Exclusive OR أي XOR) لتحويله إلى أرقام أو أكواد معينة تعمل على أنها السيريال لبرنامجك. وبالتالي يمكنك حماية البرنامج بطريقة أنه إذا تغير البرنامج وتم تحميله على جهاز آخر (أو بمعنى أصح تم استخدام ماذربورد أخرى) يمكنك معرفة ذلك عن طريق مقارنة سيريال الماذربورد القديم بالسيريال الجديد وهكذا.

تم تعديل هذه المشاركة بواسطة Mohammad Elsheimy في 30 يونيو 2009 في 21:31

2
#2

ما شاء الله درس أكثر من رائع

جعله الله فى ميزان حسناتك

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#3

شكرا جزيلا

#4

مشكور جدا جدا علي شرحك

بس هو فيه غلط بسيط في الكود

المشكلة في جملة if :

if (obj.Properties["SerialNumber"].Value.ToString().Trim() != string.Empty)

المشكلة إن لما يكون الـ SerialNumber Property قيمتها null فبيدي exception لإن هو كده بيحاول يحول الـ value اللي قيمتها null إلي string (لإننا ضفنا ToString() بعد الـ value )

الأحسن إننا نكتبها كده:

if(obj.Properties["SerialNumber"].Value != null)

وبكده هنتفادي الـ error ده

تسلم تاني يا عمنا

تم تعديل هذه المشاركة بواسطة Cer في 22 يناير 2010 في 15:03

#5

شكرا" جزيلا" على الدرس المتميز

#6

الأخ Cer: لا يوجد خطأ لإنها لا ترجع null أبدا بل ترجع نص فارغ

الأخ بهاء: شكرا جزيلا على مرورك

وشكرا لكم جميعا

#7

تبارك الرحمن ..

جميل جداً والله اخوي ، وددت لو اني اطبقها بس لابتوبي ضرب والآن شغال ع الــPC

وهل تنفع على أحدث الماذربوردات مثل i7 وغيرها

وشكراً اخي

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#8
أبو ماهر كتب:

تبارك الرحمن ..

جميل جداً والله اخوي ، وددت لو اني اطبقها بس لابتوبي ضرب والآن شغال ع الــPC

وهل تنفع على أحدث الماذربوردات مثل i7 وغيرها

وشكراً اخي

السلام عليكم ورحمه الله وبركاته

تنفع باذن الله ولو فى اى مشاكل قابلتك ممكن تسال عليها وان شاء الله هتلاقى اللى يساعدك

مواضيع مشابهة