天天看點

【C#】在IIS7.5中調用執行cmd指令生成檔案失敗

項目是這樣的,C++人員寫了一個dll,便于跨平台調用,是以用的是控制台界面傳參調用,目的是生成一個檔案。代碼編寫完成後,本機沒問題,釋出到阿裡雲伺服器始終調用不成功,而直接在cmd界面是可以調用執行成功的。代碼主要如下:

/// <summary>
        /// 執行cmd指令
        /// </summary>
        /// <param name="cmdS">cmd指令</param>
        /// <returns>執行結果是否成功</returns>
        public bool ExecuteCmd(string cmdS)
        {
            bool result = false;
            Process CmdProcess = new Process();
            try
            {
                CmdProcess.StartInfo.FileName = "cmd.exe";
                CmdProcess.StartInfo.CreateNoWindow = true;         // 建立新視窗  
                CmdProcess.StartInfo.UseShellExecute = false;       // 不啟用shell啟動程序
                CmdProcess.StartInfo.RedirectStandardInput = true;  // 重定向輸入  
                CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向标準輸出  
                CmdProcess.StartInfo.RedirectStandardError = true;  // 重定向錯誤輸出 
                CmdProcess.StartInfo.Arguments = "/c " + cmdS;      //“/C”表示執行完指令後馬上退出
                CmdProcess.Start();//執行
                string fff = CmdProcess.StandardOutput.ReadToEnd(); //輸出
                CmdProcess.WaitForExit();//等待程式執行完退出程序
                CmdProcess.Close();//結束
                result = true;
            }
            catch (Exception ex)
            {
                CmdProcess.Close();//結束
                throw;
            }
            return result;
        }
           

于是嘗試了以下的解決方案:

在執行cmd代碼中添加日志,将執行記錄添加到txt檔案中,發現實際效果就是代碼執行了,也沒有抛出異常,但是卻沒有起任何作用,相當于沒有得到執行。于是猜測,大概是權限或者環境的問題。順着這個思路,有了以下的各種處理方式:

1.将IIS裡面你程式用到的程式池的進階設定中“啟用32位應用程式”置為true,“加載使用者配置檔案”置為true。

2.将調用的dll檔案,以及生成檔案的路徑添加IIS使用者完全控制權限。

3.将調用的dll檔案全部拷貝到bin執行檔案夾下,或者windows路徑下。

4.在使用者管理中建立一個IIS使用者,接着找到發步站點的應用程式池,右鍵進階設定,找到程序模型-标志,點選後面...按鈕,選擇自定義賬戶,打開設定,填寫前面建立的IIS使用者和密碼

5.同上面一點,更改程序模型-标志,将内置賬戶的類型由ApplicationPoolIdentity,分别重新選擇為LocalService、LocalSystem、NetworkService進行嘗試。

6.打開 IIS 管理器,然後導航至您要管理的級别,在“功能視圖”的“server首頁”、“site 首頁”或“application 首頁”頁上,輕按兩下“處理程式映射”,接着在“操作”頁上,單擊“編輯功能權限”,全部勾選後點選确定,給予盡量大的腳本權限。

7.檢視配置檔案是否給予權限配置:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
           

8.終極殺器,嘗試将能夠運作的iis伺服器配置,遷移到該機來運作。操作步奏就是點選IIS伺服器,在右邊的管理框内,點選共享的配置,導出配置。然後在新主機的iis伺服器上,同樣進入“共享的配置”,勾選啟用共享的配置,選擇實體路徑,點選右邊的“應用”後才輸入密碼,而不是直接填寫完了各項參數後點選應用。

這裡進行完上面8項解決方式的嘗試後,也跟阿裡雲工程師送出了工單,依舊沒有解決此問題。後經提醒,可能是基礎環境變量導緻。其實也有想過是這個問題,但由于考慮到cmd視窗能夠執行,且即便在IIS中,上面函數試着執行ipconfig > D:test.txt語句也是完全沒有問題的,也就掉以輕心了。

【C#】在IIS7.5中調用執行cmd指令生成檔案失敗

解決方式:打開環境變量,找到path變量,添加%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;之後重新開機IIS即可,根本原因還是底層cmd執行權限受到限制,無法通過cmd調用dll生成檔案,因而執行其它的cmd指令沒有出現問題。最後嘗試了上面各種解決方案,問題得到處理。