چگونه از شر UAC در برنامه های خود خلاص شویم؟

ستون پنجم

از ویندوز ویستا به این طرف، سیستم امنیتی جدیدی به نام 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 را برای اجرای برنامه انتخاب کرده‌ایم. به‌این ترتیب، برنامه بدون مشکل تمام کارها را انجام می‌دهد.

منبع:

 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

امیربهاالدین سبط ‌الشیخ

newsQrCode
ارسال نظرات در انتظار بررسی: ۰ انتشار یافته: ۰

نیازمندی ها