none
為什麼執行外部程式會失敗?

    問題

  • 我在ASP.Net去執行外部程式﹐在兩部機器上執行同樣的程式卻出現了不同的情況。

    A和B兩部主機都是Win2K+.Net Framework 1.1

    在ASP.NET的程式上去呼叫一個外部的程式(.Net寫的WinForm)﹐在Web.Config中都加入了

      <identity
            impersonate="true"
            userName="具有Administrator的權限帳號"
            password="密碼"/>

    在A的機器很正確的執行完外部的程式﹐
    但是在B的機器執行到Application.Run()就停了﹐變成一直掛在記憶體當中﹐就像是沒有模擬Administrator的情形一樣。

    然而在web程式中我還有一行程式用來判斷外部程式是否正在執行
      if (System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length > 0) {
          showMsg.Text = "程式正被執行中﹐請稍後再執行。";
          showMsg.ForeColor = System.Drawing.Color.Red;
          return;
        } else {
          //執行外部程式
          BeginImport();
        }
    System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length 這一行若沒有模擬Administrator來執行是會出錯﹐但在B機器這一行的執行確沒有問題﹐也就是說看來在web.config的設定模擬Administrator執行是對的﹐可是為什麼執行外部的程式卻出了問題呢?請問有誰知道這是什麼情況?

    PS.我曾試著在B機器web.config中改成使用administrator這個帳號﹐也一樣是失敗。

    2006年11月7日 上午 06:47

所有回覆

  • 補充一下, Application.Run()是外部程式WinForm中的,剛有朋友誤以為我是在Web程式上以Application.Run來啟動外部程式。

    2006年11月7日 上午 07:45
  • 建議你分成兩段描述,一部分描述程式碼,一部分描述你的流程,從你目前的描述,流程滿亂的。

    而且 Application.Run() 在 Windows Form 中跑,你應該不知道只跑到這行或是其他行吧...

    建議你還可以用工作排程來跑你的 Windows Form 去檢查哪裡有問題,這個也可以設定帳號密碼,可能會比網頁的環境單純。

    另外你選擇的代理帳號,若是不能跑的話,要看你程式碼怎樣寫,必要的話,應該要先用該代理帳號登入後,讓該帳號完成初始化,因為有些軟體或環境設定要存取代理帳號的私有目錄,例如暫存檔,若該帳號未初始化,就沒有私有目錄,可能會發生預期之外的問題。

    2006年11月7日 上午 08:19
  • 我重新描述一下好了

    有兩部機器 A 和 B 環境一樣是Win2k Server+.Net Framework 1.1

    目的是由Asp.Net的程式去啟動一支外部的程式(這個外部的程式也是自己撰寫的WinForm程式)。
    所撰寫的外部程式可以直接手動執行﹐在A和B的機器上都試過﹐沒有問題。

    A 的機器由Web程式去呼叫外部的程式可以很正常的執行﹐並且程式在執行後順利的自動結束。

    但是 B 的機器就出了問題了﹐由工作管理員的處理程序中可以看到外部程式被執行了﹐但事實上程式是被hold住了。

    Web 程式
    ========================================================================
    if (System.Diagnostics.Process.GetProcessesByName("外部程式名稱").Length > 0) {
          showMsg.Text = "程式正被執行中﹐請稍後再執行。";
          showMsg.ForeColor = System.Drawing.Color.Red;
          return;
    } else {
          //執行匯檔
          try {
             Process.Start("外部的WinForm程式", args);     //啟動程式
          } catch (ApplicationException er) {
             showMsg.Text = "執行外部程式失敗。" + er.Message;
            showMsg.ForeColor = System.Drawing.Color.Red;
          }
    }
    =============================================================================

    WinForm程式
    =============================================================================
    /// <summary>
    /// 應用程式的主進入點。
    /// </summary>
    [STAThread]
    static void Main(string[] args){
       FileInfo fi=null;
       StreamWriter sw=null;
       
       try{
        fi=new FileInfo(@"D:\TEMP\Debug.log");
        sw=fi.AppendText();
        sw.WriteLine("[Debug]在Main的地方");
        sw.Flush();
        sw.Close();

        Application.Run(new Form1());
    }

    程式追蹤到此﹐Form1()中就沒有再增加任何的記錄﹐也就是程式由Web啟動之後到執行Application.Run就不再動了﹐程式掛在記憶體中看起來像是在執行但實際上是沒有任何動作。

    這種情形佷像是Web程式沒有模擬Administrator的方式在執行﹐也就是執行權限不足的樣子。
    然而我已在web.config中加入了 <identity>的節段
        <identity
            impersonate="true"
            userName="具有Administrator的權限帳號"
            password="密碼"/>
    並且在上述Web程式中System.Diagnostics.Process.GetProcessesByName("外部程式名稱").Length 這一行如果沒有以模擬Administrator的方式執行上會出錯﹐會出現"存取錯誤"﹐也就是權限不足。不過在 B 的機器上Web 執行這行程式是正常的﹐因此理論說來﹐我設定的<identity>節段是有效的。

    除了web.config中的<identity>節段中設定了具有Administrator權限帳號的user﹐對於ASPNET這個帳號也給了Administrator的權限﹐我現在一直百思不解﹐兩部機器設定相同﹐一台可以正常執行﹐一台不行﹐到底出了什麼問題呢?

    2006年11月7日 上午 08:57
  • 剛剛又做了一次測試﹐天啊﹐我更迷惘了.......

     

    B的機器上將web.config中的< identity>節段拿掉後, 也順便將web 程式上檢查外部程式是否正在執行的檢查拿掉

     

    //  if (System.Diagnostics.Process.GetProcessesByName("import_stopcall").Length > 0)

     

    web上就只留下啟動外部程式的區段

    try {

          Process.Start("外部程式.exe", args);

    } catch (ApplicationException er) {

          showMsg.Text = "執行程式失敗。" + er.Message;

          showMsg.ForeColor = System.Drawing.Color.Red;

    }

     

    沒想到這樣子在 B 的機器上竟然可以正確的執行外部程式了, 然而去掉了<identity>這樣子就沒辦法在web上去檢查程式是否被執行了.

     

    更奇怪的是, 在 A 的機器上完全沒有這些問題, A的機器上有設定<identity>的節段, 啟動執行外部程式也很正常.

    2006年11月7日 上午 10:43