تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Windows Management Instrumentation - WMI
#1
كاتب الموضوع : samerselo


- في البداية ليست لدي خبرة كبيرة في التعامل مع هذه الفئات لذا اعتبروا هذا الموضوع بداية للمناقشة بيننا جميعا في هذه الفئات ويمكن يكون الكود الوحيد الفعلي لي مستخدما هذه الأدوات هو ماورد في موضوعي حول تعقب أقراص USB

- ثانيا للتعامل مع هذه الفئات لمن يعملون على ويندوز فيستا يجب أن يشغلوا كودهم بصلاحيات مدير وهذا الموضوع قمت بتغطيته سابقا في مواضيع خاصة بهذا الغرض

- ثالثا سأقوم بنقل ملخص للموضوع الأساسي حول هذه الفئات وهو للأخ HAZZOOM في منتدى الفريق العربي للبرمجة


بسم الله نبدأ




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

من فتره كبيره يمكن من منذ بداية تعلمي للدوت نت , احتفظت بكود يقوم بجلب السريال بتاع الهارد علي أمل ان الواحد ممكن يحتاجه وطبعا مكنتش فاهم منه حاجه :


كود :
Dim HDinformation As New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
Dim HD As ManagementObject
For Each HD In HDinformation.Get()
MsgBox(HD("SerialNumber").ToString())
Next
قلت ألقي نظره علي الكود ده اللي محتفظ بيه من مده , وطبعا أنا لم أتعامل مع هذه الـ Management Namespace في الدوت نت قبل كده , فبدأت أبحث في الـ MSDN والكتب اللي عندي عن أي شئ يفيدني علشان أفهم الحوار ده ماشي ازاي , وفعلا قضيت اليوم بكامله علشان أفهم ..., بس مش علشان أفهم الكود ده (الكود سهل وبسيط) , لكن قضيت اليوم كله علشان أفهم الـ WMI , CIM وهي اختصارا للمصطلحات الـ Windows Management Instrumentaion و الـ component Information Model , صحيح مفهمتش 100% ولاحتي 75% لكن يعني الي حد ما فهمت ما علاقه هذه المصطلحات ببعضها , وقلت أكتب فيهم درس صغير علي قدي حتي علشان تثبت المعلومات في دماغي , لأن الموضوع طلع كبير جدا ومش سهل ,

قبل الدخول في شرح الكود السابق .. يجب معرفة معني المفاهيم التي ذكرناها ,

كود :
CIM (Common Information Model) :
هي عباره عن نموذج يحتوي علي معلومات مثل معلومات عن الـ Hard Disk و الـ Bios و الـ Processor و الـ Applications و الـ Network والـ Devices وغيرها ..., وهي تتألف منNamespaces, Classes لها خصائص كائنية التوجه مثل الـ Inheritance, Polymorphism ,


كود :
WMI (Windows Management Instrumentation) :
هي عباره عن جزء من النظام يمكنك من استخدام الـ CIM للتعامل مع المعلومات التي تقدمها , أي انها هي الصوره التي تمكن المبرمج من استخدام الـ CIM وذلك بعدة طرق كالآتي :


كود :
COM API for WMI :C or C++ applications
Scripting API for WMI : 1 - Scripting Languages like : VBS , JS , ActiveX script hosting
2 - Visual BASIC .
3 - Active Server Pages.
.NET Framework applications written in C#, Visual BASIC .NET, or J# : System .Management.
وبالتأكيد يكون التعامل مع هذه المعلومات التي يقدمها النموذج أفضل باستخدام الـ COM API ولكنه ليس الطريق السهل , أما عن الطريق الثاني Scripting API فهو فعلا الطريق السهل ولكنه بالتأكيد ليس بقوة الطريق الأول , ولحسن الحظ قامت ميكروسوفت بتقديم حل يغني عن الطريقين السابقين ويتمثل في الـ Management Namespace ,


كود :
WQL (WMI Query Language) :
هي لغة استعلام تستخدم لتسهيل التعامل مع المعلومات التي يقدمها الـ WMI باستخدام نموذج الـ CIM ,

الموضوع كبير جدا ولكن باذن الله سأحاول تقديم كل ما أستطيع تقديمه , وللحصول علي معلومات أكثر يمكنك البحث في الـ MSDN ,
}}}
تم الشكر بواسطة:
#2
في الدرس السابق ذكرنا ترجمة ومعاني مصطلحت التقنيات المستخدمه في الكود (البسيط) الذي يقوم بجلب سريال الهارد , ولكن هذه المعلومات لا تكفي ولا تشرح بالضبط ما يحدث , لذا سنقوم بعمل تحليل بسيط للكود لكي نستطيع أن نحصل علي عناصر ندخل منها في صلب الموضوع :


كود :
Dim HDinformation As New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
Dim HD As ManagementObject
For Each HD In HDinformation.Get()
MsgBox(HD("SerialNumber").ToString())
Next
في السطر الأول من الكود قمنا بانشاء Object من الـ Class ManagementObjectSearcher , وأبسط طريقه للتعامل مع الـ Constructor الخاص بهذه الـ Class هو اعطائها جملة استعلام WMI Query , وفي حالتنا هذه كانت الجملة :

كود :
SELECT * FROM Win32_PhysicalMedia
هذه الجملة تقوم بجلب بيانات من .... ؟؟؟ من ماذا ... ؟؟؟
هذه الجملة تقوم بجلب المعلومات من Class تسمي بـ Win32_PhysicalMedia ....!!! ما هذا الكلام الغريب ؟؟؟ أين توجد هذه الـ Class حيث اني لم أشاهد Class بهذا الاسم أو الشكل الغريب في الـ Framework Class Library , نعم فهي لا توجد داخل الـ FCL وانما توجد داخل الـ CIM , فلقد قلنا أنه يتكون من Classes كائنية التوجه Object-Oriented , وهذه الـ Classes هي التي تحوي المعلومات التي تحدثنا عنها , اذن لقد بدأت صورة الـ CIM تتضح لمن لم يفهمها من الدرس الأول ,

ولكن حتي الآن لم نفهم باقي الكود وكيف يتم استخراج تلك المعلومات من هذه الفصائل عن طريق الـ WQL , ولماذا استخدمنا الـ For Each ,
في السطر الثاني من الكود قمنا بتعريف Object من الـ Class ManagementObject , وما علاقة هذا بالموضوع ؟؟؟ سنعرف السبب ,
في السطر الثالث قمنا بعمل For Each Loop للحصول علي عناصر الـ Collection التي تعود بها الـ Function Get الخاصه بالعنصر HDinformation وهذه العناصر من النوع ManagementObject , آه لذلك قمنا بتعريف العنصر HD من الـ Class ManagementObject ,
الآن عن طريق الـ For Each Loop يمكن الحصول علي البيانات والمعلومات التي تعود بها جملة الـ WQL Select , وفي السطر الموجود داخل الـ Loop قمنا بوضع الداله التي تعود بسريال الهارد ديسك بعد تمرير اسم الخاصيه التي نريد أن نعرف معلومات عنها , خاصيه هل تقول خاصيه ...؟؟؟
نعم خاصيه لأنه توجد خصائص لهذه الـ Classes التي تحتوي علي البيانات وهذا ما سنتحدث في الدرس القادم ان شاء الله ...,,,

أرجو أن تكون الصوره قد اتضحت قليلا , بعد شرح الكود
}}}
تم الشكر بواسطة:
#3

في الدرس السابق قمنا بشرح الكود الذي يقوم بجلب سريال الهارد ديسك عن طريق جملة الـ WQL وعرفنا أنها تبحث في الـ Class التي تسمي
Win32_PhysicalMedia وهذه هي احدي الـ Win32 Classes أنظر الرابط لتعرف أكثر عنها :

WMI Administrative Tools

لو تجولت في الرابط لوجدت Classes يمكنك استخدامها لمعرفة الكثير من المعلومات عن الـ Hardware الخاص بالجهاز ,

الآن نتعرف أكثر علي الـ Class ManagementObject :

اكتب معي الكود التالي :

كود :
Dim x As New Management.ManagementObject("Win32_WMISetting=@")
في السطر السابق قمنا بانشاء عنصر من الـ Class ManagementObject , وأبسط صوره للـ Constructor لهذه الـ Class هي أن يأخذ اسم الـ
Win32 Class متبوعا بـ "@=" حتي يتعرف الكائن الـ ManagementObject علي ان هذه الـ Class تكون Singleton , ومعني انها أي ان لها Instance واحد , أي انها وحيده وفريده أي Unique ,
بعد ان انشأنا هذا العنصر ما الذي يمكننا هذا العنصر من عمله بهذه الـ Win32 Class .. ؟؟؟
يمكننا التعرف علي خواص هذه الـ Class كالآتي :


كود :
Dim xx As Management.PropertyData
For Each xx In x.Properties
MsgBox(xx.Name)
Next
في الكود السابق قمنا بتعريف عنصر من الـ PropertyData Class , ثم قمنا بعمل For Each Loop للحصول علي خواص الـ Win32 Class ,

جرب الكود وأنظر النتيجة ......,

يمكنك التعرف أكثر علي الـ Win32 Classes من خلال WMI Studio وهو جزء من WMI Tools , ويمكنك تنزيله من موقع ميكروسوفت من
الرابط :

Win32 Classes
}}}
تم الشكر بواسطة:
#4

وهذا رد لأحد الإخوة wael_shehab حول كيفية قراءة رقم هارد من نوع ساتا - كان جديد وقتها والكود في بداية المقال عن هاردات IDE -

(فيما أعتقد اللى ممكن يلم الموضوع ده كله) سواء كان الهارد IDE OR SATA
و برضه مش هنكسف أخواننا العرب الحلوين من معرفة كمان سيريال ال BIOS - PROCESSOR - MACaddress
و أتمنى من ربنا سبحانة و تعالى إنه يعجبكم و على فكره أنا جربته كويس .
و ها هى الخطوات

1- قم بإنشاء مشروع من النوع WINDOWS APPLICATION
2- إحفظة كما تريد
3- قم بإنشاء COMMAND BUTTON سيبه زى ما هو أو سميه اللى إنتى عايزه
4- قم بإنشاء عدد أربعة LABEL - و أربعة TEXTBOXs مناظرة
5- قم بتسمية ال LABELS على الترتيب
HD SERIAL
MAC ADDRESS
PROCESSOR ID
BIOS ID
و قم بتسمية ال TEXTBOXs
TextBox1
TextBox2
TextBox3
TextBox4
يعنى يبهم زى ما هم بمعنى أصح
6-
إبدأ بكتبة الكود بعد إضافة ال Reference طبعا زى ما قال الأخ حازم طبعا

كود :
Imports System.Management
7- جوه الكود الخاص بال command button اللى إحنا عملناه إكتي الكود الآتى زى ما هو


كود :
Dim MOS_HD As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
Dim mo_HD As ManagementObject
For Each mo_HD In MOS_HD.Get()
TextBox1.Text = mo_HD("Model").ToString()
Next
Dim MOS_MAC As New ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter")
Dim mo_MAC As ManagementObject
For Each mo_MAC In MOS_MAC.Get()
TextBox2.Text = mo_MAC("MACAddress").ToString()
Next
Dim MOS_PR As New ManagementObjectSearcher("SELECT * FROM Win32_Processor")
Dim mo_PR As ManagementObject
For Each mo_PR In MOS_PR.Get()
TextBox3.Text = mo_PR("ProcessorId").ToString()
Next
Dim MOS_BIOS As New ManagementObjectSearcher("SELECT * FROM Win32_BIOS")
Dim mo_BIOS As ManagementObject
For Each mo_BIOS In MOS_BIOS.Get()
TextBox4.Text = mo_BIOS("Name").ToString()
Next
}}}
تم الشكر بواسطة:
#5
كاتب المشاركة : MrBassam

لقد قمت بتحميل WMI Administrative Tools
وقد لفت نظرى اداء اخرى عظيمه الفائده هى WMI Code Creator v1.0
التى تسهل من عملية كتابة الاكواد ... ارجو ان تجربوها.
}}}
تم الشكر بواسطة:



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


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