问题描述
使用的技术
语言:C#
脚本:cmd.exe 和命令
前端:WIN UI、Xaml
框架:.Net 5
- 我想安装一堆 10 个软件作为一个自动化过程 C#。
- 目前为了安装软件,我使用 cmd.exe 作为进程,使用 C# Process 类和 这应该以管理员身份运行,否则我的安装将失败 由于管理员权限。
- 这里的问题是当我的自动化开始时,系统总是 问我 UAC(用户帐户控制)弹出来安装每个软件(我想跳过 UAC 弹出) 总是)。
查询:当我从 C# 进程类使用 cmd.exe 作为管理员时如何避免这种 UAC 弹出。
其他人提出的解决方案:在我的应用程序(WIN UI)启动时,创建一个以管理员身份提升 cmd.exe/powershell.exe 的单例进程,并使用此进程安装所有软件。 (在这种情况下,我们会弹出一次 UAC,这没关系)。所以我可以调用这个进程/服务来执行我的所有命令,以避免在这个进程以管理员身份运行时弹出 UAC
public class Cmdservice : Idisposable
{
private Process _cmdProcess;
private StreamWriter _streamWriter;
private AutoResetEvent _outputWaitHandle;
private string _cmdOutput;
public Cmdservice(string cmdpath)
{
_cmdProcess = new Process();
_outputWaitHandle = new AutoResetEvent(false);
_cmdOutput = String.Empty;
processstartinfo processstartinfo = new processstartinfo();
processstartinfo.FileName = cmdpath;
processstartinfo.UseShellExecute = false;
processstartinfo.RedirectStandardOutput = true;
processstartinfo.RedirectStandardInput = true;
processstartinfo.Verb = "runas";
processstartinfo.CreateNowindow = true;
_cmdProcess.OutputDataReceived += _cmdProcess_OutputDataReceived;
_cmdProcess.StartInfo = processstartinfo;
_cmdProcess.Start();
_streamWriter = _cmdProcess.StandardInput;
_cmdProcess.BeginoutputReadLine();
}
public string ExecuteCommand(string command)
{
_cmdOutput = String.Empty;
_streamWriter.WriteLine(command);
_streamWriter.WriteLine("echo end");
_outputWaitHandle.WaitOne();
return _cmdOutput;
}
private void _cmdProcess_OutputDataReceived(object sender,DataReceivedEventArgs e)
{
if (e.Data == null || e.Data == "end")
_outputWaitHandle.Set();
else
_cmdOutput += e.Data + Environment.NewLine;
}
public void dispose()
{
_cmdProcess.Close();
_cmdProcess.dispose();
_streamWriter.Close();
_streamWriter.dispose();
}
}
}
- 在这种方法中,由于 useShellExecute 设置为 false,cmd.exe 进程不会以管理员身份运行。
- 如果你将 useShellExecute 设置为 false Process is running under non admin mode ,那么我的软件 安装失败。
-
方法 2:通过设置 useShellExecute = true,创建一个以管理员身份打开 cmd.exe 的进程;
startInfo.FileName = "cmd.exe"; startInfo.Verb = "runas"; startInfo.UseShellExecute = true; startInfo.RedirectStandardInput = false; startInfo.Arguments = @"msiexec.exe /qn /norestart /i C:\Temp\somesoftware.msi INSTALLDIR=c:\tep\somesoftware ALLUSERS=1 REBOOT=ReallySupress /log C:\Logs\somesoftwarelog.txt"; var pro = new Process(); pro.StartInfo = startInfo; pro.Start();
问题:在这种方法中,由于 UseShellExecute 属性为 true,我无法通过标准输入执行命令。由于如果您使用 UseShellExecute 为 true 存在限制,我们无法将标准输入/输出重定向到进程。
查询:当 UseShellExecute 为 true 时,我如何向 cmd.exe 提供输入命令
注意:由于 WIN UI(https://github.com/microsoft/microsoft-ui-xaml/issues/3046) 中的问题,我无法以管理员身份运行我的 WIN UI 应用程序。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)