c# 以管理员身份打开exe可执行文件

之前用c#写过一个上位机,其中有一个需求是能使用cmd命令提示符的ping指令对远程设备执行ping命令,对带有IP地址的远程设备进行ping,以此判断设备是否能在网络中建立通信通道。但是cmd命令提示符需要以管理员的身份才能执行成功,于是我就在网上查找资料,最后找到了方法。 在此记录一下,防止以后忘记了还要百度找。

首先需要以管理员的身份运行c#工程,然后打开visual studio - 解决方案资源管理器 -右键项目名称 - 属性 ,弹出下面的窗口

c# 以管理员身份打开exe可执行文件

点击选择左侧的“安全性”,在“启用ClickOnce安全设置”前面打勾,然后再返回解决方案资源管理器界面,这时,在项目名称里的“Properties”下面会多出一个“app.manifest”的文件,如下图所示:

c# 以管理员身份打开exe可执行文件

左键单击app.manifest,然后右侧出现下图所示的内容:
c# 以管理员身份打开exe可执行文件

根据上图绿色字体的提示,将红色方框内的内容进行替换,即将 asInvoker 替换为 requireAdministrator ,即为管理员的意思。之后点击保存。改过后,不要急于重新编译生成,我们重新返回上图那个界面,将“启用ClickOnce安全设置”前面的勾去掉后再编译运行,不然程序会报错无法运行。

c# 以管理员身份打开exe可执行文件

最后,选择重新生成解决方案。点击启动就可以以管理员的身份运行了。另外,最近发现win7的系统在双击exe可执行文件时不会提示用户以管理员的身份运行,需要每次都右键选择管理员身份;而win10系统双击exe可执行文件时直接会询问用户是否启用管理员。

C#程序程序中调用CMD的代码

public class RunCmd
{
    public RunCmd()
    {

    }
    private static string CmdPath = @"C:\Windows\System32\cmd.exe";

    /// <summary>
    /// 执行cmd命令
    /// 多命令请使用批处理命令连接符:
    /// <![CDATA[
    /// &:同时执行两个命令
    /// |:将上一个命令的输出,作为下一个命令的输入
    /// &&:当&&前的命令成功时,才执行&&后的命令
    /// ||:当||前的命令失败时,才执行||后的命令]]>
    /// 其他请百度
    /// </summary>
    /// <param name="cmd"></param>
    /// <param name="output"></param>
    public static void run(string cmd, out string output)
    {
        cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
        using (Process p = new Process())
        {
            p.StartInfo.FileName = CmdPath;
            p.StartInfo.UseShellExecute = false;        //是否使用操作系统shell启动
            p.StartInfo.RedirectStandardInput = true;   //接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardOutput = true;  //由调用程序获取输出信息
            p.StartInfo.RedirectStandardError = true;   //重定向标准错误输出
            p.StartInfo.CreateNoWindow = false;          //不显示程序窗口
            p.Start();//启动程序

            //向cmd窗口写入命令
            p.StandardInput.WriteLine(cmd);
            p.StandardInput.AutoFlush = true;
            //p.StandardInput.WriteLine("exit");
            //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
            //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令

            //获取cmd窗口的输出信息
            output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();//等待程序执行完退出进程
            p.Close();
        }
    }
}

调用命令如下:

    string commond, output;
            commond = "\""+ @"C:\Program Files\XXX\" + @"xxx.exe" + "\"" + @" --install";
            RunCmd.run(commond, out output);
            MessageBox.Show("output=" + output);

这几个步骤下来,成功以管理员的权限调出CMD执行了命令。

参考文章:https://blog.csdn.net/wm111/article/details/77990745