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

This article is available in English too, check it out here.

نظرة خاطفة

سوف نقوم في هذا الدرس بإذن الله تعالى بشرح كيفية الحصول على سيريال اللوحة الأم 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 وكود VB6.

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

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

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

// C# Code
static void Main()
{
    Console.WriteLine("Motherboard Serial Number = nt{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 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
' VB6
Set colProcessList = GetObject("Winmgmts:") _
    .ExecQuery("SELECT SerialNumber, Product FROM Win32_BaseBoard")

For Each objprocess In colProcessList
    MsgBox ("Serial Number=" & objprocess.SerialNumber)
    MsgBox ("Product=" & objprocess.Product)
Next

خاتمة

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

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

اترك تعليقا

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار ووردبريس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s