本文实现以管理员权限打开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();
}
}
}
}