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

news/2024/12/29 14:02:34/


本文实现以管理员权限打开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里可配置,配置参数如下:
     <appSettings>
        <add key="filePath" value="D:/attach-vhd.txt"/>
        <add key="processName" value="vhdAttach"/>
        <add key="waitTime" value="3000"/>
    </appSettings>

以管理员权限运行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";
        /// <summary>
        /// 执行cmd命令 返回cmd窗口显示的信息
        /// 多命令请使用批处理命令连接符:
        /// <![CDATA[
        /// &:同时执行两个命令
        /// |:将上一个命令的输出,作为下一个命令的输入
        /// &&:当&&前的命令成功时,才执行&&后的命令
        /// ||:当||前的命令失败时,才执行||后的命令]]>
        /// </summary>
        ///<param name="cmd">执行的命令</param>
        public static string RunCmd(string[] cmdList)  //List<string> 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里可配置,配置参数如下:
     <appSettings>
        <add key="filePath" value="D:/detach-vhd.txt"/>
        <add key="processName" value="vhdDetach"/>
        <add key="waitTime" value="3000"/>
    </appSettings>

以管理员权限运行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";
        /// <summary>
        /// 执行cmd命令 返回cmd窗口显示的信息
        /// 多命令请使用批处理命令连接符:
        /// <![CDATA[
        /// &:同时执行两个命令
        /// |:将上一个命令的输出,作为下一个命令的输入
        /// &&:当&&前的命令成功时,才执行&&后的命令
        /// ||:当||前的命令失败时,才执行||后的命令]]>
        /// </summary>
        ///<param name="cmd">执行的命令</param>
        public static string RunCmd(string[] cmdList)  //List<string> 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();
            }
        }

    }
}


http://www.ppmy.cn/news/501504.html

相关文章

内裤紧身还是宽松

紧一点的内裤&#xff0c;即使弹力很好穿起来并不舒服太紧的内裤&#xff0c;可能影响血液循环&#xff0c;不利于身体健康宽松的内裤内裤的功效除了保护&#xff0c;还有承托穿过大的内裤&#xff0c;松垮垮的没有什么承托作用可能皱在里面缩成一团&#xff0c;穿起来不舒服

一条破的裤子

橘子上有些磨损了&#xff0c;不小心一扯了&#xff0c;裂开了一个缝隙&#xff0c;孩子看见了&#xff0c;说不要穿破橘子出门啊&#xff0c;我说这个凉快&#xff0c;没事的。

裤子破了_裤子

裤子破了 So … I don’t post for two months, and when I do, it is for the sole purpose of showing you my pants. 所以……我两个月都没有发布信息&#xff0c;当我这样做时&#xff0c;它只是为了向您展示我的裤子。 翻译自: https://rachelandrew.co.uk/archives/2005…

男朋友的内裤旧了不要扔,关键时刻有大用......

1 女生没有运动内衣不用愁 翻翻衣柜总有办法 ▼ 2 孩子&#xff0c;你这家庭咋这么散装呢&#xff1f; ▼ 3 这个原地打滑的本领也是一门技术 ▼ 4 三轮车夫&#xff1a;我顶不住了...... ▼ 5 有空不仅可以一起洗澡 还可以一起拉屎 ▼ 6 哟&#xff01;哥们儿&…

啊破了

破700百分 还有100分就可以换奖品 嗯,不错不错!

百度云的“链接不存在或失效”怎么破?

哈哈&#xff0c;相信大家不管是领取干货资料还是通过百度云发送文档给伙伴&#xff0c;都会碰到一下问题&#xff1a; 你打开的文件已失效&#xff1b; 啊哦&#xff0c;你来晚了&#xff0c;分享的文件已经被取消了&#xff0c;下次要早点哟&#xff1b; 你所打开的链接不存在…

破事儿

这两天看了两部电影&#xff0c;《男人四十》和《破事儿》&#xff0c;都是那种因为真实而显得有点灰暗的作品&#xff0c;看完以后需要再看一部《怪物史瑞克2》才能平衡。 有时候&#xff0c;用包装判断价格的经验是靠不住的。去超市买东西&#xff0c;顺便买雪糕&#xff0c…