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