使用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