1. 程式人生 > >在IIS7.5中呼叫執行cmd命令生成檔案失敗

在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語句也是完全沒有問題的,也就掉以輕心了。

阿里系統維護客戶

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