TAHA
08-09-2010, 09:59 PM
http://pnu-club.com/imported/2010/08/385.jpg
ستون پنجم
از ويندوز ويستا به اين طرف، سيستم امنيتي جديدي به نام User Account Control به ويندوز اضافه شد. اين سيستم در نسخههاي قبلي هم بود، اما كاربرد فعلي را نداشت. اين سيستم امنيتي در روزهاي ابتدايي کار با ويندوز ويستا 7، آزاردهنده بهنظر نميرسد، ولي بعد از مدتي به يك مزاحم تبديل ميشود و بيشتر كاربران، اين سيستم را غيرفعال ميکنند. براي آشنايي بيشتر با آن و نحوه غيرفعالکردن آن به لينكهاي پاورقي مراجعه كنيد.
بحث ما درباره نوشتن برنامههايي است كه در ويندوز ويستا و 7 نوشته ميشوند و قرار است با UAC دست و پنجه نرم كنند. اجازه دهيد با يک مثال اين موضوع را بيشتر روشن کنيم. ممکن است شما در برنامه خود نياز به تغييراتي در رجيستري داشته باشيد يا اينکه يک فايل را در درايو اصلي ويندوز، تغيير دهيد. اگر UAC شما غيرفعال نباشد با يک پيغام خطا مواجه ميشويد (اين خطا ناشي از رخدادن استثنا UnAuthorize Exception است).
عمليات مورد نظر شما مختل خواهد شد و کار بهدرستي انجام نميشود و طبعا بخشهاي ديگر برنامه شما هم درست کار نخواهند کرد. بسيارخوب، اين مشکل را چگونه حل کنيم؟
اولين راهي که پيش روي ماست غيرفعالکردن UAC است. اما بزرگترين مشكل اين است كه نميتوانيد به مشتري بگوييد حتما UAC را غيرفعال كند. ضمن اينكه غيرفعالکردن آن، خود نياز بهدسترسي ادمين دارد و ممكن است كاربر دسترسي به ادمين نداشته باشد. راه ديگر ايناست كه بهکاربر اطلاع دهيم يا خودش UAC را غيرفعال کند يا زمان اجراي برنامه از گزينه Run as administrator را انتخاب کند.
اين روشها، روشهاي درستي هستند، اما بهترين نيستند. در اينجا ما روش سومي را به شما معرفي ميکنيم. در اين روش اين برنامه خود را، بهصورت Administrator اجرا ميکند.
براي شروع، نكتهاي در مورد يکي از دستورات خطفرمان ويندوز بدانيد. در خطفرمان ويندوز دستوري به نام runas موجود است. اين دستور بهويندوز ميفهماندكه فلان برنامه (که آدرس آن را به عنوان آرگومان به runas دادهايم) در چه حالتي(Mode) قرار است اجرا شود يا با چه سطح دسترسي بايد اجرا شود. براي اطلاعات بيشتر در مورد اين دستور کافي است از Help آن استفاده كنيد. براي مطالعه Help دستور را با آرگومان /? اجرا کنيد: (runas /?) يا به لينك پاورقي مراجعه كنيد.
براي غلبه به اين مشكل چه كنيم؟ اولين کاري که بايد انجام شود، بررسي حالت اجراي برنامه است. بايد متوجه شويم كه آيا برنامه به سيستم دسترسي کامل دارد؟ براي اينكار از متد زير استفاده ميکنيم.
static internal bool IsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal p = new WindowsPrincipal(id);
return p.IsInRole(WindowsBuiltInRole.Administrator);
{
اين متد ابتدا مشخصات کاربر جاري را از سيستم ميگيرد و با استفاده از IsInRole مشخص ميکند که کاربر جزو دسته Administrator است يا خير. براي اطلاعات بيشتر در مورد متدها و کلاسهاي استفاده شده به MSDN مراجعه كنيد. اگر متد بالا مقدار true را برگرداند، يعني کاربر ادمين است و دسترسي کامل و نامحدود بهسيستم دارد و ميتواند هر عملي را انجام دهد.
نکته: وقتي شما از گزينه Run As Administrator براي اجراي برنامه استفاده ميکنيد، مثل اين است که کاربر ادمين برنامه را اجرا کرده است يا اينکه وقتي UAC را غيرفعال ميکنيد، بدين معناست که همه کاربران ادمين هستند.
اگر کاربر ادمين نبود، يعني متد IsAdmin مقدار false را برگرداند، چه بايد كرد؟
در اين شرايط شما بايد برنامه را با استفاده از دستور runas که پيشتر توضيح داده شد اجرا كنيد. اينکار با استفاده از متد زير انجام ميشود:
internal static void RestartElevated()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = Application.ExecutablePath;
startInfo.Verb = "runas";
try
{
Process p = Process.Start(startInfo);
}
catch(System.ComponentModel.Win32Exception ex)
{
return; //If cancelled, do nothing
}
Application.Exit();
}
کاري که اين متد انجام ميدهد اين است که نمونه ديگري از برنامه ما را با دستور runas اجرا ميکند و سپس نمونه قبلي را با استفاده از Application.Exit ميبندد. بعد از اجراي اين متد، برنامه ما با سطح دسترسي ادمين اجرا ميشود، درست مانند زماني که ما گزينه Run as administrator را براي اجراي برنامه انتخاب کردهايم. بهاين ترتيب، برنامه بدون مشکل تمام کارها را انجام ميدهد.
منبع:
CodeProject: Add a UAC shield to a button when elevation is required for admin tasks. Free source code and programming help
پاورقي:
شيوه غيرفعال كردن UAC:
User Account Control - Wikipedia, the free encyclopedia
استفاده از دستور runas
runas - Wikipedia, the free encyclopedia
ستون پنجم
از ويندوز ويستا به اين طرف، سيستم امنيتي جديدي به نام User Account Control به ويندوز اضافه شد. اين سيستم در نسخههاي قبلي هم بود، اما كاربرد فعلي را نداشت. اين سيستم امنيتي در روزهاي ابتدايي کار با ويندوز ويستا 7، آزاردهنده بهنظر نميرسد، ولي بعد از مدتي به يك مزاحم تبديل ميشود و بيشتر كاربران، اين سيستم را غيرفعال ميکنند. براي آشنايي بيشتر با آن و نحوه غيرفعالکردن آن به لينكهاي پاورقي مراجعه كنيد.
بحث ما درباره نوشتن برنامههايي است كه در ويندوز ويستا و 7 نوشته ميشوند و قرار است با UAC دست و پنجه نرم كنند. اجازه دهيد با يک مثال اين موضوع را بيشتر روشن کنيم. ممکن است شما در برنامه خود نياز به تغييراتي در رجيستري داشته باشيد يا اينکه يک فايل را در درايو اصلي ويندوز، تغيير دهيد. اگر UAC شما غيرفعال نباشد با يک پيغام خطا مواجه ميشويد (اين خطا ناشي از رخدادن استثنا UnAuthorize Exception است).
عمليات مورد نظر شما مختل خواهد شد و کار بهدرستي انجام نميشود و طبعا بخشهاي ديگر برنامه شما هم درست کار نخواهند کرد. بسيارخوب، اين مشکل را چگونه حل کنيم؟
اولين راهي که پيش روي ماست غيرفعالکردن UAC است. اما بزرگترين مشكل اين است كه نميتوانيد به مشتري بگوييد حتما UAC را غيرفعال كند. ضمن اينكه غيرفعالکردن آن، خود نياز بهدسترسي ادمين دارد و ممكن است كاربر دسترسي به ادمين نداشته باشد. راه ديگر ايناست كه بهکاربر اطلاع دهيم يا خودش UAC را غيرفعال کند يا زمان اجراي برنامه از گزينه Run as administrator را انتخاب کند.
اين روشها، روشهاي درستي هستند، اما بهترين نيستند. در اينجا ما روش سومي را به شما معرفي ميکنيم. در اين روش اين برنامه خود را، بهصورت Administrator اجرا ميکند.
براي شروع، نكتهاي در مورد يکي از دستورات خطفرمان ويندوز بدانيد. در خطفرمان ويندوز دستوري به نام runas موجود است. اين دستور بهويندوز ميفهماندكه فلان برنامه (که آدرس آن را به عنوان آرگومان به runas دادهايم) در چه حالتي(Mode) قرار است اجرا شود يا با چه سطح دسترسي بايد اجرا شود. براي اطلاعات بيشتر در مورد اين دستور کافي است از Help آن استفاده كنيد. براي مطالعه Help دستور را با آرگومان /? اجرا کنيد: (runas /?) يا به لينك پاورقي مراجعه كنيد.
براي غلبه به اين مشكل چه كنيم؟ اولين کاري که بايد انجام شود، بررسي حالت اجراي برنامه است. بايد متوجه شويم كه آيا برنامه به سيستم دسترسي کامل دارد؟ براي اينكار از متد زير استفاده ميکنيم.
static internal bool IsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal p = new WindowsPrincipal(id);
return p.IsInRole(WindowsBuiltInRole.Administrator);
{
اين متد ابتدا مشخصات کاربر جاري را از سيستم ميگيرد و با استفاده از IsInRole مشخص ميکند که کاربر جزو دسته Administrator است يا خير. براي اطلاعات بيشتر در مورد متدها و کلاسهاي استفاده شده به MSDN مراجعه كنيد. اگر متد بالا مقدار true را برگرداند، يعني کاربر ادمين است و دسترسي کامل و نامحدود بهسيستم دارد و ميتواند هر عملي را انجام دهد.
نکته: وقتي شما از گزينه Run As Administrator براي اجراي برنامه استفاده ميکنيد، مثل اين است که کاربر ادمين برنامه را اجرا کرده است يا اينکه وقتي UAC را غيرفعال ميکنيد، بدين معناست که همه کاربران ادمين هستند.
اگر کاربر ادمين نبود، يعني متد IsAdmin مقدار false را برگرداند، چه بايد كرد؟
در اين شرايط شما بايد برنامه را با استفاده از دستور runas که پيشتر توضيح داده شد اجرا كنيد. اينکار با استفاده از متد زير انجام ميشود:
internal static void RestartElevated()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = Application.ExecutablePath;
startInfo.Verb = "runas";
try
{
Process p = Process.Start(startInfo);
}
catch(System.ComponentModel.Win32Exception ex)
{
return; //If cancelled, do nothing
}
Application.Exit();
}
کاري که اين متد انجام ميدهد اين است که نمونه ديگري از برنامه ما را با دستور runas اجرا ميکند و سپس نمونه قبلي را با استفاده از Application.Exit ميبندد. بعد از اجراي اين متد، برنامه ما با سطح دسترسي ادمين اجرا ميشود، درست مانند زماني که ما گزينه Run as administrator را براي اجراي برنامه انتخاب کردهايم. بهاين ترتيب، برنامه بدون مشکل تمام کارها را انجام ميدهد.
منبع:
CodeProject: Add a UAC shield to a button when elevation is required for admin tasks. Free source code and programming help
پاورقي:
شيوه غيرفعال كردن UAC:
User Account Control - Wikipedia, the free encyclopedia
استفاده از دستور runas
runas - Wikipedia, the free encyclopedia