使用C#中的参数以管理员身份运行CMD

时间:2013-05-13 19:30:21

标签: c# cmd installation admin

我希望以C#的参数作为管理员运行cmd.exe,以防止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;
    }
}

5 个答案:

答案 0 :(得分:7)

那些找不到问题解决方案的人我找到了这个解决方案: 在解决方案文件中,选择

添加=>新商品=>应用程序清单文件

然后在C#上打开它。

enter image description here

在应用程序清单文件中将“asInvoker”重命名为“requireAdministrator”。 最后,应用程序清单文件应如下所示:

enter image description here

现在,构建您的解决方案。 然后,您将能够以管理员权限打开所有应用程序。

答案 1 :(得分:6)

您的命令至少存在一个问题,这一行:

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

应该是:

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

此外,这不会作为完全自动化的过程运行,因为它会询问管理员的密码,在Windows Vista及更新版本中,密码未知。

答案 2 :(得分:1)

将根据“用户帐户控制设置”中的用户设置弹出UAC。程序无法绕过它。只有当用户具有“从不通知”设置时,您的程序才会执行您要执行的操作。

答案 3 :(得分:1)

两种解决方案: 首先,您可以使用用户的appdata目录。这样可以避免您首先需要管理员权限。 (用更通用的方法 - 仔细考虑是否真的需要这些特权)

我们创建具有这些权限的Windows服务的另一种解决方案。首次安装该服务需要管理员权限,但之后,您可以将您的工作委托给该服务。

第二种解决方案是潜在的安全漏洞 - 因此您必须仔细考虑该服务能够做什么。

答案 4 :(得分:0)

我一直在使用这段代码:

        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