6

我想使用来自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;
    }
}
4

5 回答 5

8

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

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

然后在 C# 上打开它。

在此处输入图像描述

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

在此处输入图像描述

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

于 2015-04-18T21:28:15.290 回答
6

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

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

应该:

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

此外,这不会作为一个完全自动化的过程来工作,因为它会要求提供在 Windows Vista 和更新版本中未知的管理员密码。

于 2013-05-13T19:38:29.127 回答
1

UAC 将根据“用户帐户控制设置”中的用户设置弹出。程序无法绕过它。只有当用户设置了“从不通知”时,你的程序才会做你想做的事情。

于 2013-05-13T19:38:10.790 回答
1

两种解决方法:一是你可能是用户的appdata目录。这将使您从一开始就不需要管理员权限。(以更一般的方法 - 如果您真的需要这些特权,请仔细考虑)

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

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

于 2014-03-05T16:29:53.757 回答
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
于 2017-10-06T15:02:47.407 回答