PDA

View Full Version : آموزش: آموزش Registry



ordebehesht
یک شنبه 17 دی 1391, 16:24 عصر
با سلام تو سایتهای لاتین دنبال مطلبی در مورد رجیستری بودم به چند تا سایت برخورد کردم که مطالب جالبی داشت بعد اینکه اوان رو خوندم دلم نیومد برداشت خودمو در اختیارتون قرار ندم تا ازش استفاده کنین اگه عیب و ایرادی داشت به بزرگی خودتون ببخشین تواین پست در مورد رجیستری بحث میشه در پست بعدب یه کلاس در اختیارتون قرار میدم تا ازش استفاده کنین فقط خواهشن نکته کلامی انتقادی سوال دارین پیام خصوصی بدین ممنون میشم
================================================== ==================
خواندن و نوشتن در رجیستری:
رجیستری چیست: رجیستری که از ابتدای خلقت ویندوز 95 تا کنون همره تمام نسخ سیستم عاملها بوده است می توان به عنوان مخزن و انبار داده ای برا ذخیره اطلاعات مهم ازجمله خود سیستم عامل، اطلاعات نرمافزار های نصبی، کاربران و حساب کاربری و سطح دسترسی کاربران، در شبکه اطلاعات مربوط به کلاینتها و ..... می باشد.
اما رجیستری در C#‎‎‎‎‎‎‎‎‎‎‎‎‎: برای کار با رجیستری در C#‎‎‎‎‎‎‎‎‎‎‎‎‎ ما نیاز به کتابخانه ای جامع تر از کتابخانه .net داریم؛ در واقع کتابخانه مورد انتظار ما دارای کلاسهایی برا دستیابی به رجیستری می باشد ابن کتابخانه دارای کلاسهایی برای این کار می باشد کلاس های مد نظر ما در دو کلاس خلاصه میشود یکی Registry و دیگری Registry Key می باشد که تحت فضای نام Microsoft.Win32‌قابل دسترسی می باشد.
ما در اینجا از بحث در مورد رجیستری و ساختار سلسله مراتب آن خود داری می کنیم و آم را به خواننده وا می گذاریم و فقط یک اطلاعات خلاصه وار جهت آشنایی می دهیم.
شما می توانید جهت مشاهده registry editor از مسیر زیر رفته و ادیتور مربوطه رو مشاهده کنید

Run >> regedit.
که ادیتور زیر مشاهده می شود


97960

همانطور که مشاهده میکنید ریشه روت ما My Computer می باشد و پوشه های دیگری زیر ریشه وجود دارد که با کلمه HKEY شروع شده اند به این زیر رشه ها اصطلاحا می گوییم Hive.
این hive ها شامل key هستند که خود می تواند دارای چندین key باشد اصطلاحا به key می گوییم همانطور که گفتیم هر کلید میتواند شامل زیر کلید های دیگری باشند که Sub key میگوییم که ممکن است در ادامه به کلید و یا مقادیرvalue اشاره کند.
مقادیر value ها شامل اطلاعات واقعی ذخیره شده هستند پنج نوع مقدار اصلی داریم که عبارتند از
Expandable-String،Multi-String، String، Binary، DWORD.
شش hive در رجیستری وجود دارد که عبارتند از
· HKEY_CLASSES_ROOT (HKCR)
این شاخه شامل جزئیاتی از انواع داده درون سیستم است(.txt, .doc, and so on) و اینکه کدام نوع برنامه ها و چه نوعی از آنها توانایی اجرای یرنامه ها را دارد و ......
· HKEY_CURRENT_USER (HKCU)
شامل جرئیات کاری برای کاربیچری که در حال حاضر به سیستم وارد شده است. این مجمعه تنظیمات شامل تنظیمات دسکتاپ،متغیر های محلی، اتصالات شبکه وپرینتر و دیگر تنظیمات تعریف شده برای محبط محاسباتی کاری یک کاربر می باشد.
· HKEY_LOCAL_MACHINE (HKLM)
این hive‌ شامل اطلاعات ویژه در مورد نوع سخت افزار و نرم افزار و سایر الویتهای ارایه شده بر روی یک pc‌ می باشد این فایل برای تمام کاربرانی که وارد کامپیوتر شده اند قابل استفاده اند
· HKEY_USERS (HKUSR)
این شاخه شامل اولویتهای کاری برای همه کاربران می باشد
· HKEY_CURRENT_CONFIG (HKCF)
این hive جزئیات سخت افزارهای نصب شده را شامل می شود.
دو تا کلید باقی مانده شامل جرئیات اطلاعات زود گذر و موقتی می باشد و جایی که این تغییرات اعمال می شود عبارتند از:
· HKEY_DYN_DATA
این hive محتوی داده ای فرار عمومی می باشد که لازم برای ذخیره داده در رجیستری می باشد....
· HKEY_PERFORMANCE_DATA
این شاخه شامل اطلاعاتی مورد بررسی جهت اولویت برای برنامه های قابل اجرا می باشد.
هر hive شامل ساختار درختی از کلیدهای رجیستری می باشد که کلیدها همانند فایلها و فولدرها در یک سیستم فایلی مبی باشد با یه اختلاف بسیار مهم که فایلهای سیستمی داده ها و فولدرها را تشخیص می دهد اما در رجیستری تنها یک کلید می باشند. هر کلید ممکن است شامل داده و کلیدهای دیگر باشد.
اگر یک کلید شامل داده باشد شکل ساختاری آن همانند یک سری از مقادیر خواهد بود.هر مقدار دارای یک نام جامع، نوع مقدار (فرمت)، و خود مقدار خواهد بود به علاوه یک کلید میتواند یه مقدار بی نام و پیشفرض default داشته باشد.
کلاسهای کتابخانه رجیستری: کلاسهای کتابخانه رجیستری که تحت فضای نام Microsoft.win32 قرار دارند عبارتند از registry key و registry.
با استفاده از کلاس رجیستری ما میتوانیم به زیر کلید های یک کلید دستیابی داشته و یا یک کلید را ساخته و تغییر و حذف کنیم و هر آنچه که مورد نیاز است می توان با رجیستری انجام داد مانند تعیین سطوح امنیتی برای یک کلید.
نقش دیگر کلاس رجیستری دسترسی به hive های رجیستری است این نمونه ها که به تعداد 7 عدد هستند به ترتیب به نامهای ClassesRoot, CurrentConfig, CurrentUser, DynData, LocalMachine, PerformanceData, and Users خوانده می شوند و معادل یک hive‌در رجیستری می باشند به عنوان مثال جهت دستیابی به hive مورد نظر مانند LocalMachine باید به صورت زیر بنویسیم
RegistryKey hklm = Registry.LocalMachine;
لازم به توضیح است که کلاس رجیستری دارای سازنده نمی باشد به همین دلیل ما میتوانیم با استفاده از نمونه ساخته شده توسط کلاس Registry key به کلیدها ، زیر کلیدها و مقادیر آن دسترسی خواهید داشت با استفاده از متدهای کلاس رجیستری میتوان این مقادیر را ایجاد تغییر و حذف کرد در ادامه با مثالهایی به بررسی آنها خواهیم پرداخت.

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software")
;RegistryKey hkMicrosoft = kSoftware.OpenSubKey("Microsoft");

در این مثال همانطور که می بینید از کلاس Registry Key نمونه سازی کردیم و آن را برابر با ارجاعی به پرارپرتی استاتیکی از کلاس Registry قرار دادیم تا با استفاده از این نمونه سازی به کلیدهای پراپرتی استاتیک دسترسی داشته باشیم این نمونه سازی را سلسله وار ادامه دادیم تا به زیر کلیدهای مورد نظر کلید مد نظر و یا زیر کلید مد نظر برسیم.
این نوع دستیابی فقط دستیابی از نوع فقط خواندنی بوده و مقادیر و یا زیر کلید های را برمیگرداند تغییری اعمال نمیکند لذا اگر بخواهیم قابلیت نوشتن(شامل تولید یک مقدار تغییر و ایجاد یک کلید و حذف کلید و فرزندان آن کلید) را داشته باشیم باید مجوز این کار را صادر نموده جهت دستیابی به این قابلیت نیاز به استفاده از متدهای override در متد opensubkey() می باشیم که یک پارامتر دیگر از نوع bool به عنوانورودی دریافت می کندکه این پارامتر قابلین نوشتن- خواندن رابه ما میدهد.
در مثال قبل جهت تغییر در کلید Microsoft بدین شکل باید عمل کرد

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true);

همانطور که در خط 3 می بینید این قابلیت با استفاده از مقدار true به این متد جهت دستیابی خواندنی و نوشتنی داده شده است. متد opensubkey() متدی برای صدازدن یک کلید می باشد همانطور که در مثال بالا مشاهده می کنید این متد یک پارامتر که نام کلید است و پارامتر دیگر نحوه دسترسی را تعیین می کند می گیرد لازم به توضیح است در صورتی که کلید فراخاونی شده وجود نداشته باشد مقدار بازگشتی از نوع null بر می گرداند که نشان از عدم وجود کلید است.
ایجاد یک کلید و یا زیر کلید:
حال که به کلید دستیابی با اولویت بالا پیدا کردیم میتوانیم یک زیر کلید برای آن ایجاد و یا زیر کلید های آن را تغییر و یا خذف کنیم
برای ایجاد یه زیرکلید به صورت زیر عمل می کنیم

RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");

متد createsubkey() متدی بسیار هوشمند است در صورتی که قرار است ملیدی ایجاد شود که این کلید در زیرکلید وجود دارد یک نمونه از registry key که حاوی کلید مورد نظر است برمیگرداند این متد زمانی چنین رفتاری از خود نشان می دهد که کاربری بخواهد کلیدی که قبلا وجود داشته را مجدد ایاد نماید .
همانطور که میدانید یک رجیستری بخش عمده ای داده همانند اطلاعات پیکربندی سیستم برای ویندوز و دیگر نرم افزارها می باشد که دستکاری رجیستری به طور معمولی شدنی نیست.بنابراین زمانی در چنین موقعیتی قرار می گیرید که بخواهید یک کلید را به طور صریح و ضمنی ایجاد نمایید بدون مشخص کردن sub key و مسیر و کلید و زیر کلید های برای آن.
برای تغییر اصلاح مقادیر یک کلید میتوان از متد های خاص آن استفاده کرد این متدها عبارتند از getvalue , setvalue ؛ هر کدام از توابع پارامترهای مشخصی را به عنوان ورودی دریافت میکند ورودی مشترک این دو متد دریافت رشته معینی به عناون نام مقدار یک کلید می باشد لازم به تضیح است که متد getvalue با گرفتن نام مقدار، data برای مقدار را برمیگرداند به عبارتی اگر registry خود را نگاه کنید با انتخواب یک کلید از سمت چپ مقادیر موجود آن را در سمت راست خواهید دید که سرایند مقادیر شامل نام مقدار و نوع مقدار و داده مقدار می باشد .
متد Setvalue که برای ایجاد تغییر می باشد مانند متد قبلی یک رشته به عنوان نام مقدار میگیرد و علاوه بر آن مقداری به عنوان داده برای این مقدار را دریافت میکند که نوع داده توسط خود مقدار تعیین میگردد.لازم به توضیح است که این پارامتر از نوع object refrense‌ می باشد چرا که این نوع پارامتر توانایی ارجاع به هرکلاسی را دارد دقت کنید کلاسهای تعیین کننده نوع مقدار و نه چیز دیگر که می تواند تعیین کند داده از نوع REG_SZ, REG_DWORD,و یا REG_BINARYباشد.


به مثال زیر توجه نمایید.

RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware");
hkMine.SetValue("MyStringValue", "Hello World");
hkMine.SetValue("MyIntValue", 20);


در این مثال ما برای یک کلید دو مقدار ایجاد کردیم مقدار اول با نام MyStringValue که از نوع REG_SE و مقدار دوم با نام MyIntValue که از نوع REG_DWORD خواهد بود.
در مثال بعدی ما مقدار مورد نظر را از registry ‌ می خوانیم

string stringValue = (string)hkMine.GetValue("MyStringValue");
int intValue = (int)hkMine.GetValue("MyIntValue");

در این مثال ما توسط متد getvalue مقدار مورد نظر را می خوانیم و به داده آن دسترسی پیدا میکنیم دقت کنید که تعریف نمونه ها به طور ضمنی ازنوع int , string نشان از نوع دسترسی ارجاعی می باشد در نوع int ارجاع ما از نوع int و دز string از نوع string است لازم به ذکر است که نوع int وقتی ارجاع به داده مقدار از نوع REG_DWORD و ارجاع از نوع string وقتی که داده مقدار از نوع REG_SE می باشد استفاده می شود.

و در نهایت بعد از اتمام کار باید دسترسی به کلید بسته شود که یه این صورت امکانپذیر می باشد.
در فایل زیر متد ها و خواص مفید کلاس registrykey قرار دارد
http://uploadtak.com/images/z314_class.pdf

ordebehesht
یک شنبه 17 دی 1391, 16:57 عصر
مطالب بالا به صورت فایل گرداوری و قابل دانلود می باشد موفق باشید

http://uploadtak.com/images/u165_reg.pdf

ordebehesht
یک شنبه 17 دی 1391, 17:29 عصر
در ادامه کلاسی براتون میزارم که تو سایت codeproject دیدم یه بنده خدایی نوشته بود به نظرم خوب اومد امیدواردم بدردتون بخوره

این متد برای خوندن از رجیستری ورودی نام زیرکلید

public string Read(string KeyName)
{
// Opening the registry key
RegistryKey rk = baseRegistryKey ;
// Open a subKey as read-only
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistrySubKey doesn't exist -> (null)
if ( sk1 == null )
{
return null;
}
else
{
try
{
// If the RegistryKey exists I get its value
// or null is returned.
return (string)sk1.GetValue(KeyName.ToUpper());
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
return null;
}
}
}


متد بعدی برای نایجاد یک مقدار در یک زیر کلید ورودی نام و مقدار برای value


public string Read(string KeyName)
{
// Opening the registry key
RegistryKey rk = baseRegistryKey ;
// Open a subKey as read-only
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistrySubKey doesn't exist -> (null)
if ( sk1 == null )
{
return null;
}
else
{
try
{
// If the RegistryKey exists I get its value
// or null is returned.
return (string)sk1.GetValue(KeyName.ToUpper());
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
return null;
}
}
}


متد بعدی برای حذف کلید ورودی نام کلید هستش

public bool DeleteKey(string KeyName)
{
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
RegistryKey sk1 = rk.CreateSubKey(subKey);
// If the RegistrySubKey doesn't exists -> (true)
if ( sk1 == null )
return true;
else
sk1.DeleteValue(KeyName);

return true;
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Deleting SubKey " + subKey);
return false;
}
}


متد بعدی برای حذف زیر کلید

public bool DeleteSubKeyTree()
{
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistryKey exists, I delete it
if ( sk1 != null )
rk.DeleteSubKeyTree(subKey);

return true;
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Deleting SubKey " + subKey);
return false;
}
}


متد بعدی شمارش زیر کلید های یک کلید

public int SubKeyCount()
{
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistryKey exists...
if ( sk1 != null )
return sk1.SubKeyCount;
else
return 0;
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Retriving subkeys of " + subKey);
return 0;
}
}


متد بعدی برای شمارش مقادیر یک کلید


public int SubKeyCount()
{
try
{
// Setting
RegistryKey rk = baseRegistryKey ;
RegistryKey sk1 = rk.OpenSubKey(subKey);
// If the RegistryKey exists...
if ( sk1 != null )
return sk1.SubKeyCount;
else
return 0;
}
catch (Exception e)
{
// AAAAAAAAAAARGH, an error!
ShowErrorMessage(e, "Retriving subkeys of " + subKey);
return 0;
}
}


و اما متد آخر برای نمایش متن خطا در صورت بروز

private void ShowErrorMessage(Exception e, string Title)
{ if (showError == true) MessageBox.Show(e.Message, Title ,MessageBoxButtons.OK ,MessageBoxIcon.Error);
}


اینم لینک دانلود کلاس

http://www.uploadtak.com/images/t1542_modifyregistry.zip

ordebehesht
دوشنبه 25 دی 1391, 13:25 عصر
یه نمونه کد که نرمافزار که زحمت تحلیل رو دوش شما میوفته مرسی از توجهتون
public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;

// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal l");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}

// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstal l");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}

// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVers ion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}

// NOT FOUND
return false;
}


لازم به توضیح که StringComparison.OrdinalIgnoreCase دو تا رشته رو بدون حساسیت به حروف کوچک وبزرگ بررسی میکنه و p_name نام نرم افزاری که ببینه تو رجیستری هست یا نه

Y_Safaiee
دوشنبه 25 دی 1391, 15:41 عصر
سلام دوست من

ازت به خاطر قرار دادن این آموزش در سایت سپاسگزارم,انشاالله باز هم شاهد آموزش های پربار و غنی ای از طرف شما باشم.

موفق باشی
بایت بایت

محسن مرادیmm
جمعه 11 مهر 1393, 08:56 صبح
با تشکر از همه
سئوالی که داشتم اینه که کسی میتونه که بگه چطوری میشه مقدار وارد شده در تکس باکس را در ریجستری ثبت کنیم واز ان برای قفل استفاده کنیم در سی شارپ