سؤال

لدي هذا التطبيق الذي يحتاج إلى القيام ببعض الأشياء في المسارات المحمية (مثل %PROGRAMFILES%)، أعلم أنه يجب علي استخدام %APPDATA%، لكن لا يمكنني تغيير ذلك في الوقت الحالي.لقد قمت بعزل كل الأشياء التي قد تتطلب ظهور UAC في مشروع آخر، وإليك نموذج التعليمات البرمجية:

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

class Class1
{
    static void Main(string[] args)
    {
        try
        {
            File.CreateText(Path.Combine(Application.StartupPath, "something.txt"));
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(ex.Message, "UnauthorizedAccessException", MessageBoxButtons.OK, MessageBoxIcon.Error);

            if (args.Length == 0)
            {
                Process proc = new Process();
                proc.StartInfo.FileName = Application.ExecutablePath;
                proc.StartInfo.Arguments = "not again";
                proc.StartInfo.Verb = "runas";
                proc.Start();
            }
            else
            {
                MessageBox.Show("Exit to avoid loop.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

لذلك، أسمي هذا الملف قابلاً للتنفيذ من برنامجي الرئيسي، وإذا فشل بسبب وصول غير مصرح به، فسوف يبدأ تشغيل نفسه ليظهر طلب UAC.

أسئلتي هي:

1) اضطررت إلى تحويل مخرجات المشروع من ملف DLL إلى ملف EXE لأنني لم أتمكن من العثور على أي طريقة لطلب رفع UAC من ملف DLL، فهل هناك أي طريقة سهلة للقيام بذلك؟

2) لاحظت أيضًا أن بعض البرامج تعرض رسالة UAC مخصصة، مع شعار البرنامج وكل تلك الأشياء، دعوني أعرض لكم مثالاً:

Ugly UAC

Personalized UAC

كيف يمكنني أن أفعل ذلك لبرنامجي؟

3) لتجنب الدخول في حلقة عند تشغيلها بامتيازات مرتفعة، فإنها تحصل على UnauthorizedAccessException آخر، لقد فعلت هذا الشيء بتمرير أي وسيطات.ماذا ستفعل لتحقيق نفس الهدف؟

أعتقد أن هذا كل شيء في الوقت الراهن.شكرا على وقتك.

هل كانت مفيدة؟

المحلول

1 لا يمكنك السيطرة على الوضع ارتفاع عملية استضافة DLL الخاص بك. يمكنك إلى المجلد الهدف أو التسجيل أثناء عملية تثبيت إذا يمكنك التحكم في عملية التثبيت.

و2 تحتاج إلى <لأ href = "http://social.msdn.microsoft.com/Forums/en-US/windowssecurity/thread/50a72eb8-298b-4302-9651-aed0169de1c9/" يختلط = "نوفولو noreferrer "> توقيع البرنامج مع شهادة نشرتها سلطة الشهادة التي سيتم موثوق بها من قبل العميل . زيارة مخزن الشهادات المحلي (لوحة التحكم-> خيارات الإنترنت، علامة التبويب المحتوى والناشرين) لمعرفة السلطات شهادة مشتركة.

و3 عندما تحصل UnauthorizedAccessExceotion، ورميها إلى إكس استضافة أو إرجاع قيمة خطأ تشير إلى مشكلة أمنية. المتصل من DLL الخاص بك، ثم تقرر ما يجب القيام به، مثل عرض مربع حوار خطأ أمان لإعلام المستخدم إذا تم رفع البرنامج بالفعل (إذن لا تمنحها تحكم المجال؟)، أو <وأ href = "HTTP: // بلوق. msdn.com/vistacompatteam/archive/2006/09/25/771232.aspx "يختلط =" نوفولو noreferrer "> استئناف عملية في وضع مرتفعة باستخدام الأمر runas إذا لم يتم رفع ذلك.

نصائح أخرى

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

    static void Main(string[] args)
    {
        if (NeedElevation(args) && Elevate(args))
        { // If elevastion succeeded then quit.
            return;
        }
        // your code here
    }

    public static bool Elevate(string[] args)
    {
        try
        {
            ProcessStartInfo info = Process.GetCurrentProcess().StartInfo;
            info.Verb = "runas";
            info.Arguments = NoElevateArgument;
            foreach (string arg in args)
            {
                info.Arguments += ' ' + arg;
            }
            info.FileName = Assembly.GetEntryAssembly().Location;

            Process process = new System.Diagnostics.Process();
            process.StartInfo = info;

            process.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.",
                "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return false;
        }

        return true;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top