منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
كيف نقوم بالبحث في سجل النظام - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : كيف نقوم بالبحث في سجل النظام (/showthread.php?tid=5130)



كيف نقوم بالبحث في سجل النظام - RaggiTech - 05-10-12

كاتب الموضوع : samerselo

نحتاج أحيانا للبحث في سجل النظام عن مفتاح يحتوي على قيمة أو محتويات محددة ولهذا الغرض نستخدم الفئة 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.