Как повысить разрешения приложений .net? - PullRequest
1 голос
/ 08 сентября 2011

У меня есть приложение, которое проверяет наличие обновлений при запуске, и, если обновления найдены, оно копирует некоторые файлы по сети в папку программных файлов. Очевидно, что такая задача не может быть выполнена Standard Users при нормальных сценариях.

Я попытался создать службу для процесса обновления, но у меня возникли некоторые проблемы с безопасностью, и я задал этот вопрос об этом в суперпользователях.

Теперь, учитывая тот факт, что большинству приложений требуются повышенные привилегии для выполнения такой задачи, я думаю, что это может быть правильным подходом. Но как запросить повышение прав для программы обновления под всеми версиями Windows начиная с XP, включены. Я нашел много тем о файле манифеста, но так как мне нужно это для работы с XP, я не могу создать решение специально для UAC .

1 Ответ

2 голосов
/ 08 сентября 2011

Привилегии могут быть повышены только при запуске процесса;привилегии запущенного процесса не могут быть повышены.Чтобы поднять существующее приложение, необходимо создать новый экземпляр процесса приложения с глаголом «runas»:

private static string ElevatedExecute(NameValueCollection parameters)
{
    string tempFile = Path.GetTempFileName();
    File.WriteAllText(tempFile, ConstructQueryString(parameters));

    try
    {
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.UseShellExecute = true;
        startInfo.WorkingDirectory = Environment.CurrentDirectory;
        Uri uri = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase);
        startInfo.FileName = uri.LocalPath;
        startInfo.Arguments = "\"" + tempFile + "\"";
        startInfo.Verb = "runas";
        Process p = Process.Start(startInfo);
        p.WaitForExit();
        return File.ReadAllText(tempFile);
    }
    catch (Win32Exception exception)
    {
        return exception.Message;
    }
    finally
    {
        File.Delete(tempFile);
    }
}

После того, как пользователь подтвердит выполнение программы в качестве администратора, еще один экземплярто же самое приложение выполняется без пользовательского интерфейса;один может отображать пользовательский интерфейс, работающий без повышенных привилегий, а другой - в фоновом режиме с повышенными привилегиями.Первый процесс ожидает, пока второй не завершит свое выполнение.Для получения дополнительной информации и рабочего примера вы можете проверить архив MSDN .

Чтобы предотвратить все это диалоговое махинации во время какого-то длительного процесса, вам нужно будет запустить весь хостпроцесс с повышенными правами доступа путем встраивания соответствующего манифеста в ваше приложение с требованием уровня выполнения «наивысший доступный»: это приведет к появлению приглашения UAC, как только ваше приложение будет запущено, и к запуску всех дочерних процессовс повышенными разрешениями без дополнительных запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...