عملیات مورد نظر شما مختل خواهد شد و کار بهدرستی انجام نمیشود و طبعا بخشهای دیگر برنامه شما هم درست کار نخواهند کرد. بسیارخوب، این مشکل را چگونه حل کنیم؟
اولین راهی که پیش روی ماست غیرفعالکردن 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 را برای اجرای برنامه انتخاب کردهایم. بهاین ترتیب، برنامه بدون مشکل تمام کارها را انجام میدهد.
منبع:
http://www.codeproject.com/KB/vista-security/UAC_Shield_for_Elevation.aspx
پاورقی:
شیوه غیرفعال کردن UAC:
http://en.wikipedia.org/wiki/User_Account_Control
استفاده از دستور runas
http://en.wikipedia.org/wiki/Runas
امیربهاالدین سبط الشیخ