وحید پیرمرادیان
جمعه 18 اردیبهشت 1388, 23: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.
*/
موفق باشید.
با سلام.
از اینکه عضو جامعه بزرگ سایت برنامه نویس هستم بسیار خوشحالم. تصمیم گرفتم اولین مطلبی که ارسال می کنم در زمینه نحوه ارتباط با رجیستری در #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.
*/
موفق باشید.