العمل مع محرر التسجيل Registry من خلال الدوت نت

مقدمة:

دائماً ما كان المبرمجون يجدون محرر التسجيل Windows REGISTRY مكاناً مناسب لتخزين معلومات وإعدادات برامجهم وذلك لأن الوصول للبيانات عبر الريجستري هو اسرع من الوصول للبيانات من الملفات وأيضاً لأنه مستودع آمن للبيانات في نظام التشغيل.

في هذا الدرس سنتحدث عن التعامل مع الريجستري Registry في C#.Net و VB.Net:


أساسيات محرر التسجيل Windows Registry:

بنية الريجستري منظمة بشكل هرمي. ويوجد في الريجستري خمسة مفاتيح معرفة مسبقاً تخزن تحتها جميع البيانات وكما ان هذه المفاتيح لا يمكن إعادة تسميتها او حذفها, ويندرج تحت كل مفتاح منها العديد من المفاتيح القرعية Subkeys إضافة إلى قيم البيانات Values. وإليكم وصف بسيط حول كل مفتاح منها:



المفتاح
                                  وصفه
HKEY_CURRENT_USER
يحوي على إعدادات ومعلومات حول المستخدم الحالي للنظام, أي ان كل تفضيلات المستخدم الحالي تخزن هنا.
HKEY_USERS
يحوي على إعدادات ومعلومات حول جميع المستخدمين المسجلين في النظام.
HKEY_LOCAL_MACHINE
يحوي معلومات وإعدادات معينة حول جهاز الكمبيوتر بغض النظر عن المستخدم الحالي للنظام.
HKEY_CLASSES_ROOT
يحوي البيانات التي تربط بين أنواع الملفات والبرامج التي يمكن قراءة هذه الملفات بواسطتها, إضافة إلى البيانات الخاصة بكائنات COM.
HKEY_CURRENT_CONFIG
يحوي معلومات حول قطع الجهاز Hardware.


Registry Editor Picture - C# - VB.NET الريجستري فيجوال بيسيك - سي شارب



العمل مع محرر التسجيل في الفيجوال ستوديو VB.Net & C#.Net:

العمليات على الريجستري في .net يمكن القيام بها عن طريق كلاسين موجودين في مجال الاسماء Microsoft.Win32. الكلاسين هما Registry و RegistryKey حيث ان الكلاس Registry يزودنا بالمفاتيح الاساسية في الريجستري على شكل طرق (Methodes) عامة وللقراءة فقط وأهم الطرق التي يحويها:



ClassesRoot
يمكننا من الوصول إلى المفتاح HKEY_CLASSES_ROOT
CurrentConfig
يمكننا من الوصول إلى المفتاح HKEY_CURRENT_CONFIG
CurrentUser
يمكننا من الوصول إلى المفتاح HKEY_CURRENT_USER
LocalMachine
يمكننا من الوصول إلى المفتاح HKEY_LOCAL_MACHINE
Users
يمكننا من الوصول إلى المفتاح HKEY_USERS


كل واحدة من الطرق السابقة (Methodes) تزودنا بكائن Object من نوع الكلاس RegistryKey والذي تستخدم توابعه للوصول إلى المفاتيح الفرعية والبيانات التابعة للمفتاح الرئيسي. أهم ما يقدمه لنا هذا الكلاس RegistryKey:



الخاصية / التابع / الطريقة
العمل
SubKeyCount
ترجع عدد المفاتيح الفرعية الموجودة تحت المفتاح الحالي
ValueCount
ترجع عدد القيم الموجودة في المفتاح الحالي
Close
إغلاق المفتاح الحالي المفتوح وحفظ بياناته في حال تم تعديلها
CreateSubKey
إنشاء مفتاح فرعي أو فتح مفتاح موجود مسبقاً
DeleteSubKey
حذف المفتاح الفرعي في حال لم يكون يحوي مفاتيح فرعية
DeleteSubKeyTree
حذف المفتاح الفرعي وجميع المفاتيح الفرعية الموجودة تحته
DeleteValue
حذف قيمة محددة موجودة في المفتاح الحالي
GetSubKeyNames
ترجع مصفوفة من نوع String تحوي اسماء المفاتيح الفرعية
GetValue
ترجع بيانات القيمة
GetValueNames
ترجع مصفوفة من نوع String تحوي اسماء القيم الموجودة في المفتاح الحالي
OpenSubKey
فتح مفتاح فرعي
SetValue
إسناد بيانات قيمة ما


مثال عملي  (كيفية التحكم في تفعيل وإلغاء تفعيل إدارة المهام):

العمل مع الريجستري من خلال VB.net & C# يقودنا إلى صيغة عامة في كتابة الكود وهي:
  1. فتح المفتاح الذي نريد العمل معه او مع القيمة والمفاتيح الفرعية التابعة له.
  2. إجراء العمليات المطلوبة.
  3. ثم إغلاق المفتاح او المفاتيح التي تم فتحها.
  • كود معرفة هل إدارة المهام مفعلة أم لا:
RegistryKey hKey = Registry.CurrentUser.OpenSubKey(regpath,true);
           
if (hKey == null)
    chkTaskManager.Checked = false;
else
{
    string res = hKey.GetValue("DisableTaskMgr", "0").ToString();
    hKey.Close();

    if (res == "1")
        chkTaskManager.Checked = true;
    else
        chkTaskManager.Checked = false;
}
Dim hKey As RegistryKey = Registry.CurrentUser.OpenSubKey(regpath,True)

If hKey Is Nothing Then
    chkTaskManager.Checked = False
Else
    Dim res As String = hKey.GetValue("DisableTaskMgr", "0").ToString()
    hKey.Close()

    If res = "1" Then
        chkTaskManager.Checked = True
    Else
        chkTaskManager.Checked = False
    End If
End If

من أجل التحكم في تفعيل إو إلغاء تفعيل إدارة المهام فإننا بحاجة إلى التعامل مع القيمة DisableTaskMgr الموجودة في المسار التالي:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System
حيث إذا كانت هذا القيمة تساوي الواحد فإن إدارة المهام غير مفعلة والعكس صحيح.

لذلك قمنا بفتح المفتاح الذي يحوي القيمة عن طريق التابع OpenSubKey الخاص بالكائن hKey الذي هو من النوع RegistryKey وقمنا بفتح المفتاح للكتابة عن طريق تمرير القيمة true للبارميتر الثاني.

في حال كانت قيمة الكائن hKey تساوي null في C#.Net أو Nothing في VB.NET هذا يعني ان التابع فشل في فتح المفتاح المطلوب أي أنه غير موجود فهذا يعني ان القيمة التي سنفحصها غير موجودة أصلاً لذلك فإن إدارة المهام ستكون مفعلة لذلك نسند القيمة true لصندوق التحقق.

في حال النجاح في فتح المفتاح نقوم بقراءة القيمة DisableTaskMgr ووضعها في متحول ثم نقوم بإغلاق المفتاح بعد الانتهاء كي لا تحدث أخطاء ثم نقوم بإسناد قيمة إما true او false لصندوق التحقق حسب القيمة.
  • كود التحكم في تقعيل إدارة المهام:
if (chkTaskManager.Checked)
{
    RegistryKey hKey = Registry.CurrentUser.OpenSubKey(regpath,true);

    if (hKey == null)
    {                   
        hKey = Registry.CurrentUser.OpenSubKey(regpath.Substring(0, regpath.LastIndexOf(@"\")), true);
        hKey.CreateSubKey("System");
        hKey.OpenSubKey(regpath, true);
        hKey.SetValue("DisableTaskMgr", 1);
        hKey.Close();
    }
    else
    {
        hKey.SetValue("DisableTaskMgr", 1);
        hKey.Close();
    }
}
else
{
    RegistryKey hKey = Registry.CurrentUser.OpenSubKey(regpath, true);

    hKey.DeleteValue("DisableTaskMgr");
    hKey.Close();
}
If chkTaskManager.Checked Then

    Dim hKey As RegistryKey = Registry.CurrentUser.OpenSubKey(regpath,True)



    If hKey Is Nothing Then

        hKey = Registry.CurrentUser.OpenSubKey(regpath.Substring(0, regpath.LastIndexOf("\")), True)

        hKey.CreateSubKey("System")

        hKey.OpenSubKey(regpath, True)

        hKey.SetValue("DisableTaskMgr", 1)

        hKey.Close()

    Else
        hKey.SetValue("DisableTaskMgr", 1)
        hKey.Close()
    End If

Else
    Dim hKey As RegistryKey = Registry.CurrentUser.OpenSubKey(regpath, True)
    hKey.DeleteValue("DisableTaskMgr")
    hKey.Close()
End If

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

وكي نقوم بإنشاء المفتاح فإننا نفتح المفتاح الأعلى منه أي المفتاح:
HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\Policies
حيث نقوم بإقتطاع جزء من السلسلة النصية التي تحمل مسار المفتاح  لنحصل على مسار المفتاح السابق. بعد ذلك نقوم بإنشاء المفتاح System ثم نقوم بإنشاء القيمة DisableTaskMgr واسناد القيمة واحد لها من أجل إيقاف إدارة المهام.

أما في حال كان المفتاح موجوداً فإننا فقط فقوم بإنشاء القيمة DisableTaskMgr واسناد القيمة واحد لها.

أما القسم الثاني من الكود وهو لإعادة تفعيل إدارة المهام فإننا نقوم بحذف القيمة DisableTaskMgr وذلك بعد فتح المفتاح المطلوب وحذف القيمة ثم إغلاق المفتاح.

تنبيهات:
  1. من أجل الكتابة والقراءة من الريجستري تحتاج إلى صلاحيات آمان أي ان المستخدم الحالي الذي ينفذ الكود VB.Net أو C#.Net , إذا لم يكن يملك صلاحيات فإن تنفيذ كود سيؤدي إلى ظهور إعتراض SecurityException.
  2. محرر التسجيل جزء حساس جداً في نظام التشغيل لذلك يُفضل عمل نسخة احتياطية قبل التعامل مع الريجستري حيث ان اي ضرر يلحق بالريجستري سيؤدي إلى أخطاء وانهيار في النظام.

2 تعليقات

المعلومات ممتازه لكن العرض سئ بصراحه لم افهم شئ

رد

ارجو توضيح اكثر للاكواد المكتوبه

رد

إرسال تعليق