PDA

View Full Version : مرجع کامل رجیستری در #C



وحید پیرمرادیان
جمعه 18 اردیبهشت 1388, 22:45 عصر
فهمیدن همیشه بهتر از آموختن است.

با سلام.


از اینکه عضو جامعه بزرگ سایت برنامه نویس هستم بسیار خوشحالم. تصمیم گرفتم اولین مطلبی که ارسال می کنم در زمینه نحوه ارتباط با رجیستری در #C باشد. امیدوارم این مطلب مورد استفاده دوستان قرار بگیرد.


سطح مطلب: کاربران سطح متوسط به بالا


قبل شروع پیشنهاد می کنم با ساختار رجیستری و مفاهیم Value, Key و SubKey آشنا شوید.


برای استفاده از کلاس های مربوط به رجیستری ابتدا باید فضای نام Microsoft.Win32 را به فضای نامتان اضافه کنید.


ساخت کلید(CreateSubKey):



("مسیر مورد نظر")CreateSubKey.مسیر اصلی در رجیستری.RegistryKey key = Registry


در کد بالا ابتدا کلاس RegistryKey را نوشته و نام دلخواه key را به این کلاس اختصاص می دهیم. حال از کلاس Registry برای تعیین مسیر مورد نظر در رجیستری استفاده می کنیم.


مسیرهای اصلی عبارتند از:


1-HKEY_CURRENT_USER CurrentUser
2-HKEY_LOCAL_MACHINE LocalMachine
3-HKEY_CLASSES_ROOT ClassesRoot
4-HKEY_USERS Users
5-HKEY_PERFORMANCE_DATA PerformanceData
6-HKEY_CURRENT_CONFIG CurrentConfig
7-HKEY_DYN_DATA DynData


و مسیر مورد نظر شامل مسیر زیر مجموعه این مسیر اصلی است. به عنوان مثال:


SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run

مثال:


RegistryKey key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");




نکته: منظور از RegistryKey در تمام مثال ها نام کلاسی است که برای ساخت کلید به کار می رود. یعنی ابتدا کلید مربوطه را می سازیم و سپس بوسیله نام این کلاس عملیات زیر را انجام می دهیم.


دادن مقدار به کلید (SetValue):


(RegistryKey.SetValue (String, Object, RegistryValueKind


String: نام Value
Object: مقدار Value
RegistryValueKind: نوع مقدار (Binary،DWord،MultiString،QWord،String،Unknow n)


دستور زیر مقداری yes را به restart می دهد.




RegistryKey key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
key.SetValue("restart","Yes", RegistryValueKind.String);





حذف زیر مجموعه کلید اصلی (DeleteSubKey):



(RegistryKey.DeleteSubKey (String, Boolean




String: نام زیر کلید


Boolean: اگر مقدار آن true باشد اگر کلید یافت نشد پیغام خطایی نمایش داده می شود و اگر false بود پیغامی نمایش داده نمی شود.








RegistryKey key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
key.DeleteSubKey("Control",true);






متد DeleteSubKeyTree خود کلید و تمام زیر مجموعه های آن را حذف می کند.



حذف مقدار کلید:




(RegistryKey.DeleteValue (String, Boolean




String: نام مقدار


Boolean: اگر مقدار آن true باشد اگر کلید یافت نشد پیغام خطایی نمایش داده می شود و اگر false بود پیغامی نمایش داده نمی شود.


دریافت تمام کلیدهای زیر مجموعه کلید اصلی:




()GetSubKeyNames



این متد یک آرایه از نوع رشته شامل نام تمام کلیدهای زیر مجموعه کلید اصلی را بر می گرداند.


دریافت مقدار یک Value (مقدار کلید):



(RegistryKey.GetValue (String, Object


String:نام Value Object: مقدار پیش فرض در صورتی که Value یافت نشود این مقدار برگردانده می شود.





RegistryKey key = Registry.LocalMachine.CreateSubKey
("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
key.GetValue("restart","No").ToString();




نمایش نوع Value (مقدار کلید):



باید از متد GetValueKind به صورت زیر استفاده کرد:
(GetValueKind (string name









RegistryKey key = Registry.LocalMachine.CreateSubKey
("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
Label1.Text=key.GetValueKind("restart").ToString();




name: نام Value



نمایش نام تمام Value های یک کلید:



()string[] GetValueNames



این متد نام تمام Value های یک کلید را به صورت آرایه ای از رشته ها بر می گرداند.



تعیین سطح دسترسی به یک کلید: (امنیت در رجیستری)


باید از متد زیر در کلاس استفاده نمود:



(SetAccessControl (RegistrySecurity


RegistrySecurity نام یک کلاس در فضای نام System.Security.AccessControl است. که تنظیمات مربوط به امنیت رجیستری را بر عهده دارد. به مثال زیر توجه کنید:






using System;


using System.Reflection;


using System.Security;


using System.Security.AccessControl;


using Microsoft.Win32;


public class Example


{


public static void Main()


{


// Delete the example key if it exists.


try


{


Registry.CurrentUser.DeleteSubKey("RegistryRightsExample");


Console.WriteLine("Example key has been deleted.");


}


catch (ArgumentException)


{


// ArgumentException is thrown if the key does not exist. In


// this case, there is no reason to display a message.


}


catch (Exception ex)


{


Console.WriteLine("Unable to delete the example key: {0}", ex);


return;


}



string user = Environment.UserDomainName + "\\" + Environment.UserName;



RegistrySecurity rs = new RegistrySecurity();



// Allow the current user to read and delete the key.


//


rs.AddAccessRule(new RegistryAccessRule(user,


RegistryRights.ReadKey | RegistryRights.Delete,


InheritanceFlags.None,


PropagationFlags.None,


AccessControlType.Allow));



// Prevent the current user from writing or changing the


// permission set of the key. Note that if Delete permission


// were not allowed in the previous access rule, denying


// WriteKey permission would prevent the user from deleting the


// key.


rs.AddAccessRule(new RegistryAccessRule(user,


RegistryRights.WriteKey | RegistryRights.ChangePermissions,


InheritanceFlags.None,


PropagationFlags.None,


AccessControlType.Deny));



// Create the example key with registry security.


RegistryKey rk = null;


try


{


rk = Registry.CurrentUser.CreateSubKey("RegistryRightsExample",


RegistryKeyPermissionCheck.Default, rs);


Console.WriteLine("\r\nExample key created.");


rk.SetValue("ValueName", "StringValue");


}


catch (Exception ex)


{


Console.WriteLine("\r\nUnable to create the example key: {0}", ex);


}


if (rk != null) rk.Close();



rk = Registry.CurrentUser;



RegistryKey rk2;



// Open the key with read access.


rk2 = rk.OpenSubKey("RegistryRightsExample", false);


Console.WriteLine("\r\nRetrieved value: {0}", rk2.GetValue("ValueName"));


rk2.Close();



// Attempt to open the key with write access.


try


{


rk2 = rk.OpenSubKey("RegistryRightsExample", true);


}


catch (SecurityException ex)


{


Console.WriteLine("\nUnable to write to the example key." +


" Caught SecurityException: {0}", ex.Message);


}


if (rk2 != null) rk2.Close();



// Attempt to change permissions for the key.


try


{


rs = new RegistrySecurity();


rs.AddAccessRule(new RegistryAccessRule(user,


RegistryRights.WriteKey,


InheritanceFlags.None,


PropagationFlags.None,


AccessControlType.Allow));


rk2 = rk.OpenSubKey("RegistryRightsExample", false);


rk2.SetAccessControl(rs);


Console.WriteLine("\r\nExample key permissions were changed.");


}


catch (UnauthorizedAccessException ex)


{


Console.WriteLine("\nUnable to change permissions for the example key." +


" Caught UnauthorizedAccessException: {0}", ex.Message);


}


if (rk2 != null) rk2.Close();



Console.WriteLine("\r\nPress Enter to delete the example key.");


Console.ReadLine();



try


{


rk.DeleteSubKey("RegistryRightsExample");


Console.WriteLine("Example key was deleted.");


}


catch(Exception ex)


{


Console.WriteLine("Unable to delete the example key: {0}", ex);


}



rk.Close();


}


}



/* This code example produces the following output:



Example key created.



Retrieved value: StringValue



Unable to write to the example key. Caught SecurityException: Requested registry access is not allowed.



Unable to change permissions for the example key. Caught UnauthorizedAccessException: Cannot write to the registry key.



Press Enter to delete the example key.



Example key was deleted.


*/





موفق باشید.

salehbagheri
جمعه 18 اردیبهشت 1388, 23:00 عصر
لطفاً كدهاتون رو بين تگ كد قرار بديد! بدين صورت كه كد مورد نظر رو در اديتور سايت انتخاب و سپس بر روي # از منوي اديتور كليك كنيد!

newgoldenman
جمعه 18 اردیبهشت 1388, 23:39 عصر
سلام دوست عزیز. ممنون از مطلب مفیدت و نیز چند تا تاپیك دیگه كه مفید بودند دیدم الان زدی.
فقط یه چیزی! اگه لطف كنی و مطابت رو توی این تاپیك:
http://barnamenevis.org/forum/showthread.php?t=95001
قرار بدی، دیگه كسی كه دنبالش میخواد بگرده، نمیاد توی كل تاپیك ها جستجو كنه.
چون اون تاپیك مرجع این تالار هست.
دستت درد نكنه
موفق باشی

HAMRAHSOFT.IR
جمعه 12 شهریور 1389, 15:36 عصر
سلام دوستان امكان داره يك برنامه كوچيك بزاريد ؟

R2du-soft
سه شنبه 19 دی 1391, 16:23 عصر
دوستان عزیز من وقتی کد رو تو دکمه میزارم و برنامه رو اجرا میکنم خطا میده!!!!!!
میشه بیشتر توضیح بدید؟
ممنون

visual studio cannot start debugging because the debug target
.
.
.
یکمی از متن پیغام خطا هست