it-swarm.asia

كيف أجبر تطبيق .NET على العمل كمسؤول؟

بمجرد تثبيت البرنامج على جهاز عميل ، كيف أجبر البرنامج على العمل كمسؤول على نظام التشغيل Windows 7؟

802
Gold

ستحتاج إلى تعديل البيان الذي يتم تضمينه في البرنامج. هذا يعمل على Visual Studio 2008 والإصدارات الأحدث: Project + إضافة عنصر جديد ، حدد "ملف بيان التطبيق". تغيير عنصر <requestedExecutionLevel> إلى:

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

يحصل المستخدم على UAC موجه عند بدء تشغيل البرنامج. استخدم بحكمة؛ صبرهم يمكن أن تبلى بسرعة.

1050
Hans Passant

إضافة عنصر requestedExecutionLevel إلى البيان الخاص بك هو نصف المعركة فقط ؛ عليك أن تتذكر أنه يمكن إيقاف تشغيل UAC . إذا كان الأمر كذلك ، يجب عليك إجراء التحقق من طريقة المدرسة القديمة ووضع مربع حوار خطأ إذا لم يكن المستخدم مسؤولاً
(استدعاء IsInRole(WindowsBuiltInRole.Administrator) في سلسلة الرسائل CurrentPrincipal).

148
Anders

قمت بتنفيذ بعض التعليمات البرمجية للقيام بذلك يدويًا:

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}
55
NG.

الخطوات التفصيلية هي على النحو التالي.

  1. إضافة ملف البيان التطبيق إلى الحل
  2. تغيير إعداد التطبيق إلى "app.manifest"
  3. تحديث علامة "requestExecutionLevel" لتطلب مسئول.

 Adding file in Solution

 Select Application Manifest File

 Select Manifest option

 Update Manifest file

لاحظ أنه باستخدام هذا الرمز ، تحتاج إلى إيقاف تشغيل إعدادات الأمان في ClickOnce ، للقيام بذلك ، انتقل إلى خصائص -> الأمان -> ClickOnce Security

54
Hassan Rahman

يمكنك تضمين ملف بيان في ملف EXE ، مما يؤدي إلى تشغيل Windows (7 أو أعلى) للبرنامج دائمًا كمسؤول.

يمكنك العثور على مزيد من التفاصيل فيالخطوة 6: إنشاء وضمّن بيان تطبيق (UAC)(MSDN).

42
David

أثناء العمل على Visual Studio 2008 ، انقر بزر الماوس الأيمن على Project -> Add New Item ثم اختر Application Manifest File.

في ملف البيان ، ستجد العلامة requestedExecutionLevel ، ويمكنك ضبط المستوى على ثلاث قيم:

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

OR

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

OR

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

لتعيين التطبيق الخاص بك لتشغيله كمسؤول ، يجب عليك اختيار التطبيق الأوسط.

19
Rashad Maqsood

حسب

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

ستحتاج إلى إضافة بيان تطبيق ما إذا لم يكن لديك بالفعل بيان أو لا تعرف كيفية إضافة ملف. نظرًا لأن بعض المشروعات لا تضيف تلقائيًا ملف بيان منفصل ، انتقل أولاً إلى خصائص المشروع ، وانتقل إلى التطبيق علامة التبويب وتحقق للتأكد من أن مشروعك لا يستبعد البيان في أسفل الصنبور.

  • بعد ذلك ، انقر بزر الماوس الأيمن على المشروع
  • أضف أداة جديدة
  • أخيرًا ، ابحث وانقر فوق ملف بيان التطبيق
13
Justin Mcconnell

في Visual Studio 2010 ، انقر بزر الماوس الأيمن على اسم مشروعك. اضغط على "عرض إعدادات ويندوز" ، وهذا يولد ويفتح ملف يسمى "app.manifest". ضمن هذا الملف ، استبدل "asInvoker" بـ "requireAdministrator" كما هو موضح في الأقسام التي تم التعليق عليها داخل الملف.

12
Evolved

هناك طريقة أخرى للقيام بذلك ، في الكود فقط ، وهي اكتشاف ما إذا كانت العملية تعمل كمسؤول مثل الإجابة منNG. . ثم افتح التطبيق مرة أخرى وأغلق التطبيق الحالي.

أستخدم هذا الرمز عندما يحتاج التطبيق إلى امتيازات المسؤول فقط عند تشغيله في ظروف معينة ، مثل عند تثبيت نفسه كخدمة. لذلك لا تحتاج إلى تشغيل كمسؤول في كل وقت مثل الإجابات الأخرى تفرضه أيضًا.

ملاحظة في الكود أدناه NeedsToRunAsAdmin هي طريقة تكتشف ما إذا كانت امتيازات المسؤول مطلوبة في ظل الظروف الحالية. في حالة إرجاع هذا false ، لن يرتفع الرمز نفسه. هذه هي ميزة كبيرة لهذا النهج على الآخرين.

على الرغم من أن هذا الرمز له المزايا المذكورة أعلاه ، إلا أنه يحتاج إلى إعادة تشغيل نفسه كعملية جديدة لا تريدها دائمًا.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
9
TheLethalCoder

يمكنك إنشاء البيان باستخدام ClickOnce Security Settings ، ثم تعطيله:

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

بعد النقر فوقه ، سيتم إنشاء ملف تحت مجلد خصائص المشروع يسمى app.manifest بمجرد إنشاء هذا ، يمكنك إلغاء تحديد الخيار Enable ClickOnce Security Settings

افتح هذا الملف وقم بتغيير هذا الخط:

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

إلى:

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

هذا سيجعل البرنامج يتطلب امتيازات المسؤول.

7
Yochai Timmer

هذه نسخة مبسطة من هذا answer ، أعلاه بواسطةNG

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}
7
Hakam Fostok