我希望以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;
}
}
答案 0 :(得分:7)
那些找不到问题解决方案的人我找到了这个解决方案: 在解决方案文件中,选择
添加=>新商品=>应用程序清单文件
然后在C#上打开它。
在应用程序清单文件中将“asInvoker”重命名为“requireAdministrator”。 最后,应用程序清单文件应如下所示:
现在,构建您的解决方案。 然后,您将能够以管理员权限打开所有应用程序。
答案 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