Вопрос по c#, cmd, admin, installation – Запуск CMD в качестве администратора с аргументом из C #

4

Я хочу бежатьcmd.exe как администратор с аргументами отC # для того, чтобы предотвратитьUAC неожиданно возникнуть. Это необходимо для того, чтобы использовать его как процесс автоматической установки. Команда, которую я передаю, это просто путь к установочному файлу (.exe) с/q для тихой установки.

Когда я запускаю этот код, появляется всплывающее окно CMD, но оно работает так, как будтоне могу ничего выполнить.

public static string ExecuteCommandAsAdmin(string command)
{

    ProcessStartInfo procStartInfo = new ProcessStartInfo()
    {
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        UseShellExecute = false,
        CreateNoWindow = true,
        FileName = "runas.exe",
        Arguments = "/user:Administrator cmd /K " + command
    };

    using (Process proc = new Process())
    {
        proc.StartInfo = procStartInfo;
        proc.Start();

        string output = proc.StandardOutput.ReadToEnd();

        if (string.IsNullOrEmpty(output))
            output = proc.StandardError.ReadToEnd();

        return output;
    }
}
Wouldn»проще поднять MSI:stackoverflow.com/questions/8721349/...  но помни, что ты можешьт пропустить UAC .... rene
и именно поэтому UAC существует, чтобы предотвратить молчаливое нежелательное / потенциально враждебное повышение привилегий. Marc B

Ваш Ответ

5   ответов
6

В вашей команде есть по крайней мере одна проблема:

Arguments = "/user:Administrator cmd /K " + command

Должно быть:

Arguments = "/user:Administrator \"cmd /K " + command + "\""

Кроме того, это выигралоработать как полностью автоматизированный процесс, потому что он попросит администратораПароль, который в Windows Vista и новее не известен.

как это может быть полностью автоматизировано. Anoop Mishra
1

UAC появится в зависимости от настроек пользователя в "Настройки контроля учетных записей. " Программа не может обойти это. Только если у пользователя есть настройки "Никогда не оповещайте Будет ли ваша программа делать то, что вы пытаетесь сделать.

Согласно документам MSFT: «Никогда не уведомлять»Ты выиграл'не получать уведомления до внесения каких-либо изменений в ваш компьютер. Если ты'Если вы вошли в систему как администратор, программы могут вносить изменения в ваш компьютер, не зная об этом ».   Если ты'При входе в систему в качестве обычного пользователя любые изменения, для которых требуются разрешения администратора, будут автоматически отклонены. edtheprogrammerguy
На самом деле "Никогда не оповещайте заставит программу терпеть неудачу молча. Rafael
0

Я использовал этот код:

        string[] commands = File.ReadAllLines(commandFile);
        foreach (string command in commands)
        {
            Process process = new Process();
            ProcessStartInfo startInfo = new Pro,cessStartInfo();
            //startInfo.WindowStyle = ProcessWindowStyle.Hidden;
            startInfo.WorkingDirectory = @"C:\Windows\System32";
            startInfo.FileName = "cmd.exe";
            startInfo.Arguments = "/user:Administrator \"cmd /K " + command + "\"";
            process.StartInfo = startInfo;
            process.Start();
        }

Как вы можете видеть: пробуем этот код из 'Бежать' в VS не выдаст админа, но если вы скомпилируете эту программу и запустите ее извне как админ, это будет Я использовал этот командный файл для проверки уровня привилегий.

@echo off
goto check_Permissions

:check_Permissions
echo Administrative permissions required. Detecting permissions...

net session >nul 2>&1
if %errorLevel% == 0 (
    echo Success: Administrative permissions confirmed.
) else (
    echo Failure: Current permissions inadequate.
)

pause >nul
1

Два решения: во-первых, вы можетекаталог приложений. Это избавит вас от необходимости иметь права администратора. (в более общем подходе - тщательно продумайте, действительно ли вам нужны эти привилегии)

Другое решение - создание службы Windows, которая имела бы эти привилегии. Первая установка этой службы потребует прав администратора, но после этого вы можете делегировать свою работу этой службе.

Второе решение - это потенциальное нарушение безопасности.Я должен подумать о том, что эта служба сможет сделать осторожно.

7

Те, кто не мог найти решение своих проблем, я нашел это решение для себя: В файле решения выберите

Добавить => Новый предмет => Файл манифеста приложения

затем откройте его на C #.

По манифесту приложения переименовать файл "asInvoker» как "requireAdministrator», В конце файл манифеста приложения должен выглядеть так:

Теперь создайте свое решение. Тогда вы сможете открыть все приложения с правами администратора.

Добро пожаловать. user4805530
Работает для меня. Спасибо Jeterson Miranda Gomes

Похожие вопросы