实现以管理员权限打开window终端cmd,并在终端里执行多条指令的功能


本文实现以管理员权限打开window终端cmd,并在终端里执行多条指令的功能。

以挂载vhd虚拟盘、卸载vhd虚拟盘为例。

一、挂载vhd虚拟盘
C#工程 vhdAttach, 生成vhdAttach.exe,vhdAttach.exe的功能为:启动windows终端cmd.exe,读取attach-vhd.txt中的内容,并在终端里执行attach-vhd.txt中的多条指令。
注意:要设置vhdAttach.exe的权限(右键点击vhdAttach.exe,属性,兼容性,勾选"以管理员身份运行此程序")。
attach-vhd.txt的内容如下:
/K runas /savecred /user:administrator cmd
diskpart
select vdisk file="E:\1.vhd"
attach vdisk
exit
工程使用的参数在App.config里可配置,配置参数如下:
     
        
        
        
   

以管理员权限运行vhdAttach.exe的命令,第一次运行时提示输入管理员密码,之后不必再输入:runas /user:administrator /savecred vhdAttach
执行效果,挂载vhd虚拟盘(注意vhd虚拟盘的路径,vhd虚拟盘的初始化见相关教程)。

vhdAttach工程的主要代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Diagnostics;
using System.IO;
using System.Threading;

namespace vhdAttach
{
    class Program
    {

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


        /// 执行cmd命令 返回cmd窗口显示的信息
        /// 多命令请使用批处理命令连接符:
        ///         /// &:同时执行两个命令
        /// |:将上一个命令的输出,作为下一个命令的输入
        /// &&:当&&前的命令成功时,才执行&&后的命令
        /// ||:当||前的命令失败时,才执行||后的命令]]>
        ///

        ///执行的命令
        public static string RunCmd(string[] cmdList)  //List cmdList
        {            
            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 = true; //不显示程序窗口
                
                var pp = p.Start();//启动程序
                
                foreach(string cmdline in cmdList)
                {
                    p.StandardInput.WriteLine(cmdline);
                }

                p.StandardInput.AutoFlush = true;

                //获取cmd窗口的输出信息
                string output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();//等待程序执行完退出进程
                p.Close();
                
                return output;
            }
        }
               
        static void Main(string[] args)
        {
            Action exit_delegate = killProcess;            
            exit_delegate.BeginInvoke(null,null);

            try
            {                
                string filePath = System.Configuration.ConfigurationSettings.AppSettings.Get("filePath");
                
                string[] paramList = File.ReadAllLines(filePath);
                                
                string put = RunCmd(paramList);    //执行命令                
                Console.WriteLine(put);        //控制台输出返回结果

            }
            catch(Exception ex)
            {

            }

        }

        static void killProcess()
        {            
            string waitTimeStr = System.Configuration.ConfigurationSettings.AppSettings.Get("waitTime");
            int waitTime = int.Parse(waitTimeStr);

            try
            {
                Thread.Sleep(waitTime);
            }
            catch (Exception ex)
            {

            }
            
            string processName = System.Configuration.ConfigurationSettings.AppSettings.Get("processName");

            Process[] pros = Process.GetProcessesByName(processName);

            foreach (Process p in pros)
            {
                p.Kill();
            }
        }

    }
}


二、卸载vhd虚拟盘
C#工程 vhdDetach, 生成vhdDetach.exe,vhdDetach.exe的功能为:启动windows终端cmd.exe,读取detach-vhd.txt中的内容,并在终端里执行detach-vhd.txt中的多条指令。
注意:要设置vhdDetach.exe的权限(右键点击vhdDetach.exe,属性,兼容性,勾选"以管理员身份运行此程序")
detach-vhd.txt的内容如下:
/K runas /savecred /user:administrator cmd
diskpart
select vdisk file="E:\1.vhd"
detach vdisk
exit
工程使用的参数在App.config里可配置,配置参数如下:
     
        
        
        
   

以管理员权限运行vhdDetach.exe的命令,第一次运行时提示输入管理员密码,之后不必再输入:runas /user:administrator /savecred vhdDetach
执行效果,卸载vhd虚拟盘(注意vhd虚拟盘的路径,vhd虚拟盘的初始化见相关教程)。

vhdDetach工程的主要代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Diagnostics;
using System.IO;
using System.Threading;

namespace vhdDetach
{
    class Program
    {
        //private static string CmdPath = @"C:\Windows\System32\cmd.exe";
        private static string CmdPath = "cmd.exe";
        ///


        /// 执行cmd命令 返回cmd窗口显示的信息
        /// 多命令请使用批处理命令连接符:
        ///         /// &:同时执行两个命令
        /// |:将上一个命令的输出,作为下一个命令的输入
        /// &&:当&&前的命令成功时,才执行&&后的命令
        /// ||:当||前的命令失败时,才执行||后的命令]]>
        ///

        ///执行的命令
        public static string RunCmd(string[] cmdList)  //List cmdList
        {
            //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 = true; //不显示程序窗口

                var pp = p.Start();//启动程序

                //向cmd窗口写入命令
                
                foreach (string cmdline in cmdList)
                {
                    p.StandardInput.WriteLine(cmdline);
                }

                p.StandardInput.AutoFlush = true;

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

                return output;
            }
        }

        static void Main(string[] args)
        {
            Action exit_delegate = killProcess;
            exit_delegate.BeginInvoke(null, null);

            try
            {                
                string filePath = System.Configuration.ConfigurationSettings.AppSettings.Get("filePath");

                string[] paramList = File.ReadAllLines(filePath);
                string put = RunCmd(paramList);    //执行命令                
                Console.WriteLine(put);        //控制台输出返回结果
            }
            catch (Exception ex)
            {

            }

        }

        static void killProcess()
        {            
            string waitTimeStr = System.Configuration.ConfigurationSettings.AppSettings.Get("waitTime");
            int waitTime = int.Parse(waitTimeStr);

            try
            {
                Thread.Sleep(waitTime);  //
            }
            catch (Exception ex)
            {

            }
            
            string processName = System.Configuration.ConfigurationSettings.AppSettings.Get("processName");

            Process[] pros = Process.GetProcessesByName(processName);

            foreach (Process p in pros)
            {
                p.Kill();
            }
        }

    }
}

你可能感兴趣的:(管理员权限,cmd,挂载,卸载,vhd,虚拟盘)