C#以管理員(Run as Administrator)的許可權開啟cmd.exe程指定序並執行命令
專案需要用wix#(wix sharp)打包程式,使用wix中的ServiceInstaller安裝一個WINDOWS SERVICE ,服務可以正常啟動,但是使用的時候有問題(目前還不清楚原因),但是服務如果使用原來的CMD安裝方式是可以正常工作的。 所以我就改變方向在WIX#打包程式碼裡面修改以ADMINISTARTOR許可權調出CMD並執行安裝服務。
路漫漫其修遠兮,吾將上下而求索。在網路上搜了一堆資料,基本的方法都是如下(參考文章:http://www.yishimei.cn/network/296.html):
VS以管理員模式啟動
注意一定要用管理員(Run as Administrator)許可權開啟VS,這樣才能以管理員的許可權啟動應用程式(從而調出來的CMD才是Administrator許可權的) 必須這麼做:
右鍵VS的快捷方式->“以管理員方式執行
以管理員身份執行程式
其實要以管理員的身份執行cmd命令提示符,我們只需要讓c#開發的程式自身以管理員身份執行就可以了,我們開啟visual studio - 解決方案資源管理器 -右鍵專案名稱 - 屬性 ,彈出下面的視窗:
點選選擇左側的“安全性”,我們在“啟用ClickOnce安全設定”前面打勾,然後再返回解決方案資源管理器介面,這時,在專案名稱裡的“Properties”下面會多出一個“app.manifest”的檔案,如下圖所示:
我們點選選中它,看左側視窗中程式碼,如下:
我們找到程式碼段: <requestedExecutionLevel level="asInvoker" uiAccess="false" />
改過後,不要急於重新編譯生成,我們重新返回上圖那個介面,將“啟用ClickOnce安全設定”前面的勾去掉後再編譯執行,不然程式會報錯無法執行。
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執行了命令。