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

تعامل مع إدارة النظام و الأجهزة بسطر واحد و من خلال Components

مغلق
بدأه أبو همام في 16 يوليو 2007 · 16 رد · 2,990 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الصلاة و السلام على نبينا محمد و على آله و صحبه أجمعين .

( يا أخي والله بحثت عن هذا الموضوع و وجدت أنه تم الحديث عنه!! , ولكن ليس من الزاوية التي سأنظر من خلالها )

بعض الأخوة جزاهم الله كل خير قد تناولوا موضوع الـ Windows Management Instrumentation

بكثير من التفصيل و الأمثلة كالأخ ( Hazzom ) والأخ ( MiCcSoft ) في المشاركات التالية :

/index.ph...t=0&start=0

/index.ph...t=0&start=0

و كل ذلك قد تم من خلال الكود والاستعلامات التي تعمل ضمن الـ System.Management Namespace

الآن , الذي وجدته أنه يمكن التعامل من إدارة النظام والأجهزة وبكل سهولة من خلال Components يمكن إضافته من Classes جاهزة , و بالتالي التعامل معها ومع خصائصها يصبح و كأنك تتعامل مع أي Object عادي قد سحبته من شريط الأدوات . .... كيف ذلك ؟

(( لا أدري إن كان هذا المنهج الذي سأقوله الآن يمكن الاعتماد عليه مثل منهج الكود في مشاريع كبيرة ))

لن أطيل التفصيل , و سأترك الصور تشرح هذه الطريقة بإذن الله ....

1. في Visual Studio 2005 ومن نافذة Server Explorer و تحت فرع Servers أدخل إلى السيرفر الرئيسي , ثم إلى فرع Management Classes كما هو ميبن في الصورة التالية :

post-106212-1184532796_thumb.jpg

طبعاً يمكن الاستفادة من الـ Classes الموجودة افتراضياً , لكن سنضيف Class جديدة .

2. إذا قلنا له Add Classes كما في الصورة السابقة , سوف يفتح لنا مربع حوار لكي نضيف من خلاله ما نريد من Classes جديدة . الآن في شجرة الـ Classes ندخل إلى فرع Root\CIMV2 و الذي نجد فيه عشرات الـ Classes كما في الصورة التالية :

post-106212-1184532837_thumb.jpg

3. نختار من هناك Physical Media ثم نضيفها بواسطة الزر Add كما في الصورة التالية :

post-106212-1184532892_thumb.jpg

4. انقر زر OK , سوف يتم إضافة الـ Class الجديدة إلى فرع الـ Management Classes . الآن افتح فرع Physical Media Class من هناك , واختر القرص الذي تريد ( طبعاً هذا هو الهارد ديسك التابع لجهازك ) . Right Click عليه ثم Add To Designer كما في الصورة :

post-106212-1184532919_thumb.jpg

5. عند ذلك سوف يتم إضافة كائن أو Component جديدة إلى الـ Components Tray في المشروع , بالإضافة إلى ملف Class جديد تابع لها في Project Explorer كما يلي :

post-106212-1184532948_thumb.jpg

6. الآن يمكن الاستفادة من كل خصائص الـ Component الجديدة و بكل سهولة , فقط ضع اسمها في صفحة الكود وبعده نقطة و اختر ما تريد من الخصائص . مثلاً وجدت أن السطر التالي يعيد لي الـ Serial Number الحقيقي الخاص بالـ Hard Disk كالتالي :

Me.PhysicalMedia1.SerialNumber

بنفس الأسلوب يمكن الاستفادة من مئات الـ Classes المتاحة في الـ Management Classes , ويمكن التعرف على خصائص النظام و الأجهزة بهذه البساطة .

لا أدري هل يمكن الاعتماد على ذلك كبديل عن البرمجة بواسطة System.Management Namespace

هذا ما أريد أن تشاركوني فيه من أراء و نصائح ....

وفقنا الله و إياكم لما يحب و يرضى في الدنيا و الآخرة ..... والسلام عليكم .

#2

شكرا لك أخ أبو همام على الموضوع

لايوجد داعي للقسم - يكفي أن تشير إلى أنك تطرح الموضوع من زاوية أخرى

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#3

شكرا لك اخي الفاضل على هذا الموضوع .. لقد فتحت امامي افاق جديده .. كنت اتجاهل اي كود يستخدم WMI اراه امامي حتى انني استغربت الجمع بينه وبين ما يشبه جمل الاستعلام في التصريح عن كائناته !

لكن هذه الفكره اكثر من رائعه وتوفر الكثير من الوقت .

وقد اعجبتني فكره السيريال نمبر للقرص الصلب .

تحياتي

#4
اقتباس
لا أدري هل يمكن الاعتماد على ذلك كبديل عن البرمجة بواسطة System.Management Namespace

دائماً ما يوفر عليك الوقت و الجهد, ويعطيك متطلبات هو أفضل بكثير من انهاك نفسك و ضياع وقت في كتابة عبر الكود , لا سيما و الامر

متاح عبر الكائنات components .

في المثال يتضح المقال

#5

حياكم الله جميعاً , و جزاكم كل خير على التفاعل .... لكن لدي سؤال حول هذا الموضوع :

هل جرب أحدكم أن يعمل الخطوات السابقة في مشروع بسيط , ثم قام بتجربتها على جهاز آخر ...

فأنا أخشى أن تلك الطريقة تعمل فقط في الجهاز الحالي الذي عملت عليه المشروع ... لماذا ؟

لأنه لو نظرنا إلى الكود الذي صرح به عن تلك الكائنات و التي تم إنشاؤها من الـ Management Classes

( طبعاً ذلك تجده في الملف المخفي Form1.Designer.vb ) لوجدنا أنه تم وضع التصاريح على أساس اسم الجهاز الحالي أو السيرفر الحالي ) . فكيف يمكن تجاوز ذلك لكي يعمل على أي جهاز ...؟ و شكراً .

#6

لم اجرب ذلك بعد ، لكن اعتقد انه يمكننا اسنادها برمجيا لكن اواجه صعوبه في ذلك ،

القيمه النصيه المسنده تبدأ بإسم جهاز الكمبيوتر ، وهذا يمكننا الحصول عليه برمجيا ، لكن هناك جزء خاص يختلف من جهاز كمبيوتر الى اخر بخصوص الـ Physical Media فانا تظهر لدي وحده اما انت فإثنتان واعتقد انها تمثل الاقراص الصلبه الموجوده في الجهاز ام انا مخطيء ؟

#7

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

نعم أخي النبهاني , هذا صحيح . الـ Physical Media تمثل أقراص التخزين الصلبة , والسبب أنه ظهر لدي اثنان كما في الشكل سابقاً هو لأنه لدي قرصين صلبين في جهازي ( Two Hard Disks ) ...

الذي لاحظته أنه عندما أضفت أي واحد من الـ Classes الممثلة لهذين القرصين الصلبين فإنه يضيف كائن جديد إلى الـ Designer و يعطيه اسم افتراضي من الشكل ( PhysicalMedia1 ) و إذا أضفت آخر سيعطيه نفس الاسم مع تغيير الرقم فقط أي يصبح (PhysicalMedia2 ) وهكذا .... كأنك تضيف Button .

لكن ما الذي يتغير ؟ عندما نفحص الكود المخفي في الملف Form1.Designer.vb , فإننا سنجد أنه قد صرح عن تلك الكائنات من نوع واحد , وهو ( ROOT.CIMV2.PhysicalMedia ) كما يلي :

Friend WithEvents PhysicalMedia1 As NewExplorings.ROOT.CIMV2.PhysicalMedia

طبعاً (NewExplorings ) هو اسم المشروع ...

الآن , عندما قام بإسناد قيمة إلى الخاصية ( Path ) للكائن الجديد , كتب لنا هذا السطر :

Me.PhysicalMedia1.Path = New System.Management.ManagementPath("\\RAOAF\root\CIMV2:Win32_PhysicalMedia.Tag=""\\\\.\\PHYSICALDRIVE0""")

حيث أن (PHYSICALDRIVE0 ) هو ممثل القرص الصلب الأول والرئيسي في الجهاز .

و كذلك ( RAOAF ) هو اسم الجهاز الحالي .

نلاحظ أن كل شيء في هذا الإسناد ثابت إلا اسم الجهاز , وهذا الاسم عندما عوضت بدلاً عنه بالعبارة التالية :

My.Computer.Name

فقد نجح الأمر وعمل البرنامج , ولكن فقط أثناء الـ Run Time لأنه عرف قيمة تلك العبارة أثناء التشغيل . و لكن لو رجعت إلى الـ Design Mode لأعطاك خطأ لأنه لم يعرف تفسير تلك العبارة أثناء التصميم .

وهذا جزء من رسالة الخطأ في الـ Design Mode كما في الصورة التالية :

post-106212-1184673206_thumb.jpg

ما رأيكم في هذا ؟ هل ترون من جدوى أو فائدة للاعتماد على هذا المنهج ؟ نرجو تعاونكم ....

#8

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

أردت فقط اضافة ربما تكون مفيدة

كنت في أغلب الأحيان عند عمل سكريبت wmi استبدل اسم الكمبيوتر الحالي بنقطة "." فقط والكود يعمل بدون مشاكل

ربما الحل يكون في عدم كتابة اسم الكمبيوتر واستبداله بالنقطة

والله أعلم

#9

و تطبيقاً على اساس النقطة كالتالي:

 Dim mp As ManagementPath = _
		New ManagementPath( _
		"\\.\root\CIMV2:Win32_PhysicalMedia.Tag=""\\\\.\\PHYSICALDRIVE0""")

		Me.PhysicalMedia1.Path = mp

		MsgBox(Me.PhysicalMedia1.SerialNumber.ToString)

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

WMIPhysicalMedia.rar

في المثال يتضح المقال

#11

لقد جربت مثال الاستاذ الشهاب الحارق ولكنه لم يعمل لدي ايضا واعطى رساله خطأ مفادها :

The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)

وهذه تفاصيلها :

System.Runtime.InteropServices.COMException was unhandled
  ErrorCode=-2147023174
  Message="The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)"
  Source="System.Management"
  StackTrace:
	   at System.Management.ManagementScope.Initialize()
	   at System.Management.ManagementObject.Initialize(Boolean getObject)
	   at System.Management.ManagementObject.get_ClassPath()
	   at WMIPhysicalMedia.ROOT.CIMV2.PhysicalMedia.get_ManagementClassName() in C:\Documents and Settings\XPPRESP3\Desktop\WMIPhysicalMedia\root.CIMV2.Win32_PhysicalMedia.vb:line 122
	   at WMIPhysicalMedia.ROOT.CIMV2.PhysicalMedia.CheckIfProperClass(ManagementScope mgmtScope, ManagementPath path, ObjectGetOptions OptionsParam) in C:\Documents and Settings\XPPRESP3\Desktop\WMIPhysicalMedia\root.CIMV2.Win32_PhysicalMedia.vb:line 616
	   at WMIPhysicalMedia.ROOT.CIMV2.PhysicalMedia.set_Path(ManagementPath Value) in C:\Documents and Settings\XPPRESP3\Desktop\WMIPhysicalMedia\root.CIMV2.Win32_PhysicalMedia.vb:line 194
	   at WMIPhysicalMedia.Form1.Form1_Load(Object sender, EventArgs e) in C:\Documents and Settings\XPPRESP3\Desktop\WMIPhysicalMedia\Form1.vb:line 9
	   at System.EventHandler.Invoke(Object sender, EventArgs e)
	   at System.Windows.Forms.Form.OnLoad(EventArgs e)
	   at System.Windows.Forms.Form.OnCreateControl()
	   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
	   at System.Windows.Forms.Control.CreateControl()
	   at System.Windows.Forms.Control.WmShowWindow(Message& m)
	   at System.Windows.Forms.Control.WndProc(Message& m)
	   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
	   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
	   at System.Windows.Forms.Form.WmShowWindow(Message& m)
	   at System.Windows.Forms.Form.WndProc(Message& m)
	   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
	   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
	   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
	   at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow)
	   at System.Windows.Forms.Control.SetVisibleCore(Boolean value)
	   at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
	   at System.Windows.Forms.Control.set_Visible(Boolean value)
	   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
	   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
	   at System.Windows.Forms.Application.Run(ApplicationContext context)
	   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
	   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicat
onModel()
	   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
	   at WMIPhysicalMedia.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
	   at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
	   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
	   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
	   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
	   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
	   at System.Threading.ThreadHelper.ThreadStart()

وهي تحدث في الكود التالي :

		<Browsable(true),  _
		 DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>  _
		Public ReadOnly Property ManagementClassName() As String
			Get
				Dim strRet As String = CreatedClassName
				If (Not (curObj) Is Nothing) Then
					If (Not (curObj.ClassPath) Is Nothing) Then
						strRet = CType(curObj("__CLASS"),String)
						If ((strRet Is Nothing)  _
									OrElse (strRet Is String.Empty)) Then
							strRet = CreatedClassName
						End If
					End If
				End If
				Return strRet
			End Get
		End Property

في السطر If Not(curObj) ....

#12

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

بارك الله فيكم و جزاكم كل خير على هذا التعاون ....

نعم , لقد نجحت طريقة ( النقطة ) ... كيف ؟

فقط قمت باستبدال اسم جهاز الكمبيوتر بنقطة في الملف المخفي Form1.Designer.vb . أما الخبر الأهم هو أن البرنامج عمل على جهاز آخر و أعطى النتيجة المرجوة , الحمد لله رب العالمين . إذاً فهي طريقة فعالة إن شاء الله , و توفر الوقت والجهد , بالإضافة إلى الكثير من الإمكانيات و المعلومات التي يمكن أن نحصل عليها من الـ Management Classes .

وفقنا الله و إياكم لكل خير و رفعة في الدنيا و الآخرة ..... و السلام عليكم .

#13

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

هذا مثال بسيط يوضح ذلك , و فيه نحصل على الـ Serial Number للقرص الصلب .

هذا المثال مجرب و ناجح على جهازين . أرجو أن ينجح معكم بإذن الله , والله ولي التوفيق ...

M_System.rar

#14

جزاك الله خير, المثال يعمل كما هو متوقع منه, شكراً لكل الجهود المبذولة من الجميع.

في المثال يتضح المقال

#15

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

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

لقد مرت علي طريقة لانشاء اتصال يقوم بقراءة هذه المعلومات في الاصدار الحالي 2005 لكني لا أتذكره ربما يفيدنا الأخ أبو همام في هذا الجانب

وبالتوفيق للجميع دائما

#16

وعليكم السلام أخي DreamNet و جزاك الله كل خير , فقد كانت نصيحتك باستخدام ( النقطة ) حاسمة في نجاح هذا الأسلوب الذي يوفر الكثير من كتابة و تعقيد الكود .

أما أسلوب التعامل مع الـ Management Classes وبرمجته بالكود , فقد تحدث عن ذلك بعض الزملاء كما ذكرت في بداية هذه المشاركة . وهذه روابط تلك المشاركات :

/index.ph...t=0&start=0

/index.ph...t=0&start=0

وفقكم الله ......

#17

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

والآن , إذا كنت من الذين يحبون كتابة كودات WMI و لا تفضل أسلوب الـ Components , فهذا برنامج صغير يقوم بتوليد تلك الكودات حسب الـ Management Class التي تختارها و الخصائص التابعة لها . أيضاً يمكن توليد تلك الكودات بثلاث لغات برمجية هي : VB Script - VB.Net - C#.Net

نسأل الله للجميع التوفيق ....

ملاحظة : البرنامج من مايكروسوفت .

WMICodeCreator.zip

هذا الموضوع مغلق.

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