Прокачай свой UAC и несколько вопросов по этому поводу
У меня есть это приложение, которое должно делать некоторые вещи в защищенных путях (например,%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, с логотипом программы и всеми этими вещами, позвольте мне показать вам пример:
Как я могу сделать это для моей программы?
3) Чтобы избежать входа в цикл, когда он работает с повышенными привилегиями, он получает еще одно исключение UnauthorizedAccessException, которое я сделал, передавая любые аргументы. Что бы вы сделали, чтобы достичь той же цели?
Я думаю, что пока все. Спасибо за ваше время.
2 ответа
1 вы не можете контролировать режим повышения прав процесса размещения вашей DLL. Вы можете предоставить разрешение на целевую папку или реестр для всех во время процесса установки, если вы можете контролировать процесс установки.
2 вам необходимо подписать программу сертификатом, опубликованным центром сертификации, которому доверяет клиент. Посетите местный магазин сертификатов (панель управления-> параметры Интернета, вкладка контента, издатели), чтобы увидеть общие центры сертификации.
3 когда вы получаете UnauthorizedAccessExceotion, бросьте его в exe-хостинг или верните значение ошибки, указывающее на проблему безопасности. Затем вызывающая сторона вашей DLL решает, что делать, например, выводит на экран диалоговое окно с сообщением об ошибке безопасности, информирующее пользователя, если программа уже повышена (разрешение не предоставлено контроллером домена?), Или перезапускает процесс в режиме повышенных прав, используя команду runas, если он не повышен.
У меня были такие же проблемы. Погуглив около 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;
}