بدست آوردن سطح دسترسی Administrator در ویندوز

6 09 2009
VistaUAC

از ویندوز ویستا به بعد و همچنین در ویندوز 7 مدیریت UAC قوانین سخت گیرانه ای رو برای سطح دسترسی کاربر و برنامه های کاربر به منابع سیسیتم و سیستم عامل در نظر گرفته است. این قوانین شامل اجرای تمامی برنامه ها در سطح دسترسی کاربر معمولی است و به همه آنها اعمال می شود. یعنی اگر کاربر فعلی دسترسی administrator داشته باشد باز هم برنامه های اجرا شد توسط آن با سطح user معمولی اجرا خواهد شد.

این سیاست که البته مدتهاست لینوکس از آن استفاده می کنه سبب خواهد شد بدافزارها نتوانند به راحتی به سیستم دسترسی داشته باشند. همچنین کنترل دسترسی نرم افزارها به منابع سیستم راحتتر خواهد بود.

این سیاست در ویندوزهای جدید ممکن است مشکلاتی رو برای برنامه های کاربردی پیش بیاره که از جمله عدم دسترسی نوشتن و بعضا خواندن برخی منابع سیستم است. توجه کنید که برنامه های عادی هیچ گاه نیاز دسترسی به منابع حیاتی سیستم نخواهد داشت. این مورد باید یک اصل در طراحی نرم افزارهای خود قرار بدید. مانند زمانی که دسترسی بی مورد به بخش های حساس ریجستری و یا شاخه ویندوز.

UAC-prompt

UAC

به هر حال شرایطی را در نظر بگیرید که به هر حال دسترسی به این منابع مورد نیاز باشد. در این صورت چند راه حل برای دستیابی به مجوز administrator وجود دارد.

راه حل اول– اولین و ساده ترین راه این است که از کاربر بخواهید با راست کلیک کردن بر روی برنامه شما و انتخاب Run as Administrator به برنامه این سطح دسترسی را بدهد. این راه حل مناسب و کاربر پسندی نخواهد بود.

راه حل دوم– در صورتی که از Visual Studio استفاده می کنید، دومین راه حل همراه با نسخه 2008 آن عرضه شده. این مورد بر این اساس هست که برنامه ها در صورتی که از یک manifest خاص استفاده کنند، ویندوز تشخیص خواهد داد که آن برنامه نیاز به مجوز admin دارد و این مورد توسط درخواستی از کاربر اعلام خواهد شد.

به این منظور نیاز به یک Application Manifest خواهد بود. برای افزودن آن به پروژه روی نام پروژه کلیک راست کرده و Add -> New Item رو انتخاب کنید. از این پنجره آیتم Application Manifest File رو انتخاب کنید. فایلی با نام app.manifest به پروژه اضافه خواهد شد. محتویات این فایل مانند زیر است:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
 </requestedPrivileges>
 </security>
 </trustInfo>
</asmv1:assembly>

تنها قسمت مهم برای ما requestedExecutionLevel هست که درخواست مجوز مورد نیاز رو مشخص می کنه. در ادامه آن، مقدار level نشان دهنده مجوز درخواستی است. این مقدار شامل موارد زیر است:

asInvoker: حالت پیش فرض سیستم که همان کاربر معمولی خواهد بود.

requireAdministrator: درخواست مجوز admin را مطرح می کنه. این درخواست باید برآورده بشه و برنامه حتما باید با این مجوز اجرا بشه در غیر اینصورت و درصورت عدم پذیرش کاربر برنامه اجرا نخواهد شد.

highestAvailable: درخواست بالاترین مجوز قابل دسترسی را مطرح می کند. دقت کنید که تفاوت این گزینه با requireAdministrator در این است که در صورتیکه امکان اجرای برنامه با دسترسی های پایین تری مانند PowerUser وجود باشد این انتخاب به کاربر واگذار خواهد شد. همچنین ممکن است که در این گزینه فقط کلمه عبور برای دسترسی های کمی بالاتر درخواست شود.

پس یکی از موارد requireAdministrator یا highestAvailable را با توجه به نیاز خود انتحاب کنید و فایل مذکور رو تغییر بدید. همچنین در بخش assemblyIdentity اطلاعات برنامه شما قرار دارد که تغییر آن اختیاری است.

در نهایت فایل app.manifest به این صورت خواهد بود:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="SalarBlog.AdministratorElevate.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

 </requestedPrivileges>
 </security>
 </trustInfo>
</asmv1:assembly>

راه حل سوم– این دو مورد روشهایی بودند که قبل از اجرای برنامه اتفاق می افتادند. در صورتی که در شرایطی لازم باشه که دسترسی از درون برنامه تعیین بشه موارد فوق موثر نخواهند بود.

در روش شوم این مشکل حل شده و پس از بررسی سطح دسترسی اقدام به درخواست آن خواهیم کرد. البته همچنان برای درخواست دسترسی نیاز خواهد بود تا برنامه دوباره اجرا شود.

ابتدا لازم است تا سطح دسترسی کاربر فعلی را بررسی کنیم:

public static bool AdministratorIsInRole()
{
 return new WindowsPrincipal(WindowsIdentity.GetCurrent())
 .IsInRole(WindowsBuiltInRole.Administrator);
}

در این تابع موجز دسترسی Administrator بررسی شده است. سپس با استفاده از تابع ShellExecute ویندوز و پارامترهای آن درخواست اجرا را مشخص می کنیم:

public static void Elevate()
{
 ShellExecute(IntPtr.Zero, "runas",
 Application.ExecutablePath + "", "", "", 1);
}

[DllImport("shell32.dll")]
private static extern void ShellExecute(IntPtr intPtr, string p, string p3, string p4, string p5, int p6);

و سرانجام کافی هست تا اینها را یکجا و در کد برنامه قرار دهید. برنامه نهایی مانند زیر خواهد بود:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Security.Principal;
using System.Runtime.InteropServices;

namespace AdminElvate
{
 static class Program
 {

 [STAThread]
 static void Main()
 {
 if (!AdministratorIsInRole())
 {
 Elevate();
 return;
 }

 Application.EnableVisualStyles();
 Application.SetCompatibleTextRenderingDefault(false);
 Application.Run(new Form1());
 }

 static bool AdministratorIsInRole()
 {
 return new WindowsPrincipal(WindowsIdentity.GetCurrent())
 .IsInRole(WindowsBuiltInRole.Administrator);
 }
 static void Elevate()
 {
 ShellExecute(IntPtr.Zero, "runas",
 Application.ExecutablePath + "", "", "", 1);
 }

 [DllImport("shell32.dll")]
 private static extern void ShellExecute(IntPtr intPtr, string p, string p3, string p4, string p5, int p6);

 }
}

و تمام. این کد رو می تونید در تمام قسمتهای برنامه استفاده کنید، ولی به هر حال برای بدست آوردن مجوز بالاتر باید برنامه مجددا اجرا بشه.


کارها

Information

One response

20 12 2009
هادی

سلام
خیلی ممنون از مقاله زیبات.
میشه کد ها رو به دلفی هم بنویسی؟

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s




%d وب‌نوشت‌نویس این را دوست دارند: