运行CMD以管理员身份从C#参数(Running CMD as administrator with

2019-09-02 23:08发布

我想要运行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;
    }
}

Answer 1:

至少有一个问题,你的命令,这条线:

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

应该:

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

此外,这将无法工作作为一个完全自动化的过程,因为它会问在Windows Vista和较新的是不知道管理员密码。



Answer 2:

这些谁也找不到解决他们的问题,我发现这个解决方案对我来说:在解决方案文件,选择

添加=>新项目=>应用程序清单文件

然后打开它在C#。

在应用程序清单文件重命名“asInvoker”为“requireAdministrator”。 最后,应用程序清单文件应该是这样:

现在,建立自己的解决方案。 然后,你就可以打开所有的应用程序作为管理员权限。



Answer 3:

UAC的弹出取决于用户设置“用户帐户控制设置”。 程序无法绕过。 只有当用户有设置“从不通知”,将你的程序做你正在尝试做的。



Answer 4:

两种解决方案:首先,你可以将用户的AppData目录。 这将节省您需要摆在首位的管理权限。 (在一个更通用的方法 - 仔细想想,如果你真的需要那些特权)

另一种解决方案我们创建一个Windows服务,这将有那些特权。 该服务的第一次安装需要管理员权限,但在那之后,你可以委托你的作品与服务。

第二种解决方案是一个潜在的安全漏洞 - 所以你得想想该服务将能够认真做。



Answer 5:

我一直用这个代码:

        string[] commands = File.ReadAllLines(commandFile);
        foreach (string command in commands)
        {
            Process process = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo();
            //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


文章来源: Running CMD as administrator with an argument from C#