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

كيف نقوم بالبحث في سجل النظام

بدأه محمد سامر أبو سلو في 30 يوليو 2008 · 1 رد · 649 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

نحتاج أحيانا للبحث في سجل النظام عن مفتاح يحتوي على قيمة أو محتويات محددة ولهذا الغرض نستخدم الفئة Microsoft.Win32.Registry للحصول على الكائن Microsoft.Win32.RegistryKey الذي يمثل المفتاح الجذري للعش الذي نود البحث فيه في سجل النظام مستخدمين عناصر الكائن RegistryKey للتنقل عبر شجرية مفتاح السجل وتعداد عناصره وقراءة أسماء وقيم المفاتيح المحتواة في ذلك المفتاح.

وهنا يجب علينا أولا الحصول على كائن RegistryKey يمثل المستوى الأساسي للتنقل عبر عناصر شجرية الكائن RegistryKey حيث تقدم لنا الفئة Registry مجموعة مؤلفة من سبعة خاصيات مشتركة تمثل المستوى الأساسي لمفاتيح سجل النظام وهي

ClassesRoot HKEY_CLASSES_ROOT

CurrentConfig HKEY_CURRENT_CONFIG

CurrentUser HKEY_CURRENT_USER

DynData HKEY_DYN_DATA

LocalMachine HKEY_LOCAL_MACHINE

PerformanceData HKEY_PERFORMANCE_DATA

Users HKEY_USERS

كما يوفر لنا الكائن My الفئة My.Computer.Registry التي تتضمن مجموعة مطابقة من الخصائص توفر نفس وظيفية الخصائص الموجودة في الفئة Microsoft.Win32.Registry وبعد حصولك على الكائن RegistryKey الجذري يمكنك التنقل عبر مفاتيحه الفرعية ولدعم هذا التنقل تمكنك الفئة RegistryKey من استخدام الطريقة GetSubKeyNames للحصول على مصفوفة نصية تحتوي على أسماء جميع المفاتيح الفرعية ثم استخدام الطريقة OpenSubKey للحصول على مرجع للمفتاح الفرعي وهي متوفرة بشكلان محملان الأول يفتح ذلك المفتاح للقراءة فقط والثاني يستقبل قيمة منطقية إن كانت True فهي تفتح ذلك المفتاح مع قابلية الكتابة أيضا.

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

• CreateSubKey تنشئ مفتاح فرعي باسم معين وتعيد كائن RegistryKey قابل للكتابة فإن كان ذلك المفتاح موجودا فهي تعيد مرجعا له

• DeleteSubKey تقوم بحذف مفتاح باسم محدد حيث يجب أن لا يحتوي ذلك المفتاح على أية مفاتيح فرعية ويمكن ان يحتوي على قيم وفي حالة فشله فهو يطلق استثناء System.InvalidOperationException

• DeleteSubKeyTree يقوم بحذف المفتاح مع جميع المفاتيح الفرعية والقيم ضمنه

• DeleteValue يقوم يحذف قيمة باسم محدد في المفتاح الحالي

• GetValue يعيد قيمة باسم محدد في المفتاح الحالي وتكون القيمة المعادة من النوع Object ثم يجب استخدام دوال تحويل الأنواع لتحويلها إلى نوع البيانات المطلوب وهي تعيد Nothing إن لم يتم إيجاد القيمة وهي تمتلك طريقة محملة تمكنك من تحديد القيمة الافتراضية المعادة بدلا عن Nothing

• GetValueKind تعيد نوع البيانات الذي تحمله قيمة محددة في المفتاح الحالي وتكون القيمة المعادة من نوع التعداد Microsoft.Win32.RegistryValueKind

• GetValueNames وهي تعيد مصفوفة نصية تحتوي على أسماء جميع القيم المحتواة في المفتاح الحالي وإن كان المفتاح يحتوي على قيمة افتراضية ممثلة بسلسلة نصية فارغة فيتم إعادة هذه السلسلة النصية الفارغة كعنصر ضمن المصفوفة المعادة

• SetValue تقوم بإنشاء أو تعديل قيمة باسم محدد وهي تزودنا بطريقة محملة تمكننا من تحديد نوع البيانات المخزنة في تلك القيمة حيث تأخذ قيمة التعداد RegistryValueKind كمحدد أخير لتحديد نوع تلك القيمة وإن لم نقم بتحديد نوع هذه القيمة فيتم الاستدلال على نوعها آليا اعتمادا على نوع الكائن الممرر لضبط تلك القيمة

كما أن الفئة RegistryKey تحقق الواجهة IDisposable لهذا عليك استدعاء الطريقة IDispsable.Dispose لتحرير مصادر النظام عندما تنتهي من استخدام الكائن RegistryKey.

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

Imports System
Imports Microsoft.Win32
Namespace Apress.VisualBasicRecipes.Chapter15

	Public Class Recipe15_05

		Public Shared Sub SearchSubKeys(ByVal root As RegistryKey, ➥
										  ByVal searchKey As String)
			' Loop through all subkeys contained in the current key.
			For Each keyName As String In root.GetSubKeyNames
				Try
					Using key As RegistryKey = root.OpenSubKey(keyName)
						If keyName = searchKey Then PrintKeyValues(key)
							SearchSubKeys(key, searchKey)
					End Using
					Catch ex As Security.SecurityException
						' Ignore SecurityException for the purpose of this example.
						' Some subkeys of HKEY_CURRENT_USER are secured and will
						' throw a SecurityException when opened.
					End Try
				Next
			End Sub

			Public Shared Sub PrintKeyValues(ByVal key As RegistryKey)
				' Display the name of the matching subkey and the number of
				' values it contains.
				Console.WriteLine("Registry key found : {0} contains {1} values", ➥
						key.Name, key.ValueCount)
				' Loop through the values and display.
				For Each valueName As String In key.GetValueNames
						If TypeOf key.GetValue(valueName) Is String Then
							Console.WriteLine(" Value : {0} = {1}", valueName, ➥
											key.GetValue(valueName))
						End If
				Next
			End Sub

			Public Shared Sub Main(ByVal args As String())
				If args.Length > 0 Then
					' Open the CurrentUser base key.
					Using root As RegistryKey = Registry.CurrentUser
						' Search recursively through the registry for any keys
						' with the specified name.
						SearchSubKeys(root, args(0))
					End Using
				End If
				' Wait to continue.
				Console.WriteLine(Environment.NewLine)
				Console.WriteLine("Main method complete. Press Enter.")
				Console.ReadLine()
			End Sub

	End Class
End Namespace

و بتشغيل المثال السابق واستخدام Environment كمحدد سطر أوامر فسوف يظهر لنا خرجا شبيها بالتالي إن كنا نعمل على جهاز يشغل ويندوز فيستا

Registry key found : HKEY_CURRENT_USER\Environment contains 3 values
Value : TEMP = C:\Users\ Todd \AppData\Local\Temp
Value : TMP = C:\Users\Todd\AppData\Local\Temp
...
Main method complete. Press Enter.

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

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

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

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

#2

شكرا جزيلا على هذا الدرس الجميل

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