Ответ 1
Попробуйте следующее:
//Vista or higher check
if (System.Environment.OSVersion.Version.Major >= 6)
{
p.StartInfo.Verb = "runas";
}
В качестве альтернативы выберите маршрут манифеста для своего приложения.
У меня есть проект приложения Visual Studio Windows. Я добавил код для загрузки файла обновления установщика. Установщик после завершения загрузки потребует прав администратора для запуска. Я добавил файл манифеста.
Когда пользователь нажимает на DownloadUpdate.exe, UAC запрашивает у пользователя разрешения администратора. Поэтому я предположил, что все процессы, созданные и вызванные в DownloadUpdate.exe, будут запускаться в качестве администратора. Поэтому я сделал установочный вызов для моего загруженного файла со следующим кодом:
Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = strFile;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
Попробуйте следующее:
//Vista or higher check
if (System.Environment.OSVersion.Version.Major >= 6)
{
p.StartInfo.Verb = "runas";
}
В качестве альтернативы выберите маршрут манифеста для своего приложения.
Это работает, когда я пытаюсь. Я дважды проверил две тестовые программы:
using System;
using System.Diagnostics;
namespace ConsoleApplication1 {
class Program {
static void Main(string[] args) {
Process.Start("ConsoleApplication2.exe");
}
}
}
using System;
using System.IO;
namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
try {
File.WriteAllText(@"c:\program files\test.txt", "hello world");
}
catch (Exception ex) {
Console.WriteLine(ex.ToString());
Console.ReadLine();
}
}
}
}
Сначала подтвердили, что я получаю бомбу UAC:
System.UnauthorizedAccessException: Доступ к пути c:\program files\test.txt ".
// и т.д..
Затем добавлен манифест в ConsoleApplication1 с фразой:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Нет бомбы. И файл, который я не могу легко удалить:) Это согласуется с несколькими предыдущими тестами на разных машинах с Vista и Win7. Запущенная программа наследует токен безопасности из стартовой программы. Если стартер приобрел привилегии администратора, запущенная программа также имеет их.
Это четкий ответ на ваш вопрос: Как заставить приложение .NET работать под управлением администратора?
Резюме:
Щелкните правой кнопкой мыши по проекту → Добавить новый элемент → Файл манифеста приложений
Затем в этом файле измените строку следующим образом:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
Скомпилируйте и запустите!
var pass = new SecureString();
pass.AppendChar('s');
pass.AppendChar('e');
pass.AppendChar('c');
pass.AppendChar('r');
pass.AppendChar('e');
pass.AppendChar('t');
Process.Start("notepad", "admin", pass, "");
Работает также с ProcessStartInfo:
var psi = new ProcessStartInfo
{
FileName = "notepad",
UserName = "admin",
Domain = "",
Password = pass,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
Process.Start(psi);
Прежде всего, вам нужно включить в свой проект
using System.Diagnostics;
После этого вы можете написать общий метод, который вы можете использовать для разных файлов .exe, которые вы хотите использовать. Это будет выглядеть следующим образом:
public void ExecuteAsAdmin(string fileName)
{
Process proc = new Process();
proc.StartInfo.FileName = fileName;
proc.StartInfo.UseShellExecute = true;
proc.StartInfo.Verb = "runas";
proc.Start();
}
Если вы хотите, например, выполнить notepad.exe, тогда все, что вы делаете, вы вызываете этот метод:
ExecuteAsAdmin("notepad.exe");
Вот пример запуска процесса как администратора без Windows Prompt
Process p = new Process();
p.StartInfo.FileName = Server.MapPath("process.exe");
p.StartInfo.Arguments = "";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.Verb = "runas";
p.Start();
p.WaitForExit();
Вероятно, вам нужно установить приложение в качестве приложения x64.
IIS Snap In работает только в 64-битном режиме и не работает в 32-битном режиме, а процесс, созданный из 32-разрядного приложения, кажется, работает 32-битным процессом, и то же самое относится к 64-разрядным приложениям.
Посмотрите: Запустите процесс как 64 бит
Используйте этот метод:
public static int RunProcessAsAdmin(string exeName, string parameters)
{
try {
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = CurrentDirectory;
startInfo.FileName = Path.Combine(CurrentDirectory, exeName);
startInfo.Verb = "runas";
//MLHIDE
startInfo.Arguments = parameters;
startInfo.ErrorDialog = true;
Process process = System.Diagnostics.Process.Start(startInfo);
process.WaitForExit();
return process.ExitCode;
} catch (Win32Exception ex) {
WriteLog(ex);
switch (ex.NativeErrorCode) {
case 1223:
return ex.NativeErrorCode;
default:
return ErrorReturnInteger;
}
} catch (Exception ex) {
WriteLog(ex);
return ErrorReturnInteger;
}
}
Надеюсь, что это поможет.
Process proc = new Process();
ProcessStartInfo info =
new ProcessStartInfo("Your Process name".exe, "Arguments");
info.WindowStyle = ProcessWindowStyle.Hidden;
info.UseShellExecute =true;
info.Verb ="runas";
proc.StartInfo = info;
proc.Start();