Как запустить процесс как режим администратора в С#

У меня есть проект приложения 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;

Ответ 2

Это работает, когда я пытаюсь. Я дважды проверил две тестовые программы:

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. Запущенная программа наследует токен безопасности из стартовой программы. Если стартер приобрел привилегии администратора, запущенная программа также имеет их.

Ответ 3

Это четкий ответ на ваш вопрос: Как заставить приложение .NET работать под управлением администратора?

Резюме:

Щелкните правой кнопкой мыши по проекту → Добавить новый элемент → Файл манифеста приложений

Затем в этом файле измените строку следующим образом:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Скомпилируйте и запустите!

Ответ 4

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);

Ответ 5

Прежде всего, вам нужно включить в свой проект

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");

Ответ 6

Вот пример запуска процесса как администратора без 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();

Ответ 7

Вероятно, вам нужно установить приложение в качестве приложения x64.

IIS Snap In работает только в 64-битном режиме и не работает в 32-битном режиме, а процесс, созданный из 32-разрядного приложения, кажется, работает 32-битным процессом, и то же самое относится к 64-разрядным приложениям.

Посмотрите: Запустите процесс как 64 бит

Ответ 8

Используйте этот метод:

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;
        }
    }

Надеюсь, что это поможет.

Ответ 9

 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();