以管理员身份运行 cmd.exe 以使用 c#

问题描述

使用的技术

语言: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

为提议的解决方案尝试的方法

  1. 关注这篇文章https://code-ai.mk/execute-command-prompt-commands-from-c/
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 ,那么我的软件 安装失败。

查询在这种情况下我如何以管理员身份运行 cmd.exe

  1. 方法 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...