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

我希望以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; } } 

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

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

应该:

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

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

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

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

然后在C#上打开它。

在此处输入图像描述

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

在此处输入图像描述

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

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

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

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

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

我一直在使用这段代码:

  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