1. 程式人生 > >C#以管理員(Run as Administrator)的許可權開啟cmd.exe程指定序並執行命令

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" />

,將其改為:<requestedExecutionLevel level="requireAdministrator" 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執行了命令。