Прокачай свой UAC и несколько вопросов по этому поводу - PullRequest
6 голосов
/ 27 октября 2009

У меня есть это приложение, которое должно выполнять некоторые действия в защищенных путях (например,% 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, которое я сделал, передавая любые аргументы. Что бы вы сделали для достижения той же цели?

Я думаю, это пока все. Спасибо за ваше время.

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

У меня были такие же проблемы. Погуглив около 2 дней я нашел единственное решение, которое соответствует моим потребностям - запустить приложение с правами администратора. Я запускаю приложение, проверяю, запускается ли оно от имени администратора. А если нет - перезапустите с правами администратора.

    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;
    }
4 голосов
/ 27 октября 2009

1 Вы не можете управлять режимом повышения прав процесса, в котором размещена ваша DLL. Вы можете предоставить разрешение целевой папке или реестру для всех во время процесса установки , если вы можете контролировать процесс установки.

2 вам необходимо подписать программу сертификатом, опубликованным центром сертификации, которому клиент будет доверять . Посетите местный магазин сертификатов (панель управления-> параметры Интернета, вкладка содержимого, издатели), чтобы увидеть общие центры сертификации.

3 когда вы получаете UnauthorizedAccessExceotion, выбросьте его в исполняемый файл хостинга или верните значение ошибки, указывающее на проблему безопасности. Затем вызывающая сторона вашей DLL решает, что делать, например, выводит на экран диалоговое окно с сообщением об ошибке безопасности, информирующее пользователя, если программа уже повышена (разрешение не предоставлено контроллером домена?), Или перезапускает процесс в режиме повышенных прав, используя команда runas , если она не повышена.

...