簡體   English   中英

為什么我的ASP.NET Web服務無法啟動進程,但我的.NET控制台應用程序可以?

[英]Why can't my ASP.NET web service kick off a process, but my .NET console app can?

這是來自類庫的代碼:

proc.StartInfo = new ProcessStartInfo(CmdPath, "+an -b");
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit();

這是完全正如我從控制台測試應用程序調用時所期望的那樣。 當我使用相同的庫並從ASP .NET Web服務調用該方法時,它就會掛起。

我在這里缺少什么,也許權限? ASPNET服務可以訪問EXE所在的文件夾,我看到它在任務管理器中運行,盡管它沒有做任何事情。

如果有人能告訴我我做錯了什么,我將不勝感激。 謝謝。

編輯 :抱歉缺乏信息。 CmdPath轉到我們的調度軟件的命令行界面。 我根據他們提供的文檔傳遞命令。 我有一種獲取作業列表的方法,以及另一種運行作業的方法。 ......嗯想法。 客戶端通常使用Active Directory登錄,我認為模仿是必要的。 現在去測試。

編輯2 :好的,現在客戶端正在搞亂AccessViolation問題。 這顯然是權限的事情。 如果軟件使用集成的AD授權,並且我冒充我的AD帳戶,那就足夠了嗎? 我正在使用web.config中的標記進行模擬。

您認為使用ASPNET標識啟動可執行服務器端會遇到很多問題,您是否嘗試使用適當的priveleges 模擬身份(這確實有用),但是再次在服務器端啟動可執行文件可能不是一個好主意首先。

ASP.Net用戶帳戶可能沒有執行權限。 您能否提供更多信息,說明為什么要嘗試這樣做,因為可能有更好的方法。

這可能是權限問題。 ASPNET服務可能具有可執行文件的權限,但它具有可執行文件所有功能的權限。

例如,如果可執行文件復制文件,ASPNET帳戶是否擁有這些文件的源和目標路徑的完全權限? 需要詢問可執行文件所做的所有事情。

如果您需要解決此問題,可以使用模擬,或者指定網站在IIS中的其他帳戶下運行,但這些不是推薦的做法,並且在大多數情況下比它們的價值更麻煩。

默認情況下,ASP.NET輔助進程的安全性低於大多數本地帳戶(當然是開發人員使用的帳戶或服務器上登錄的帳戶。)

前進有兩種主要方式:

  1. 給asp.net進程更多權限。 有關如何執行此操作的詳細說明,請參閱此鏈接
  2. 讓asp.net在具有更多權限的帳戶下運行。 請參閱此鏈接以獲取更好的解釋以及如何在不同的帳戶下運行該流程。

要么適合你。

重定向標准輸出時,是否需要使用ReadToEnd來讀取StandardOutput的響應?

您可能應該檢查您的可執行文件執行的內容,因為ASP.NET在具有有限權限的用戶(IIS 6.0上的NETWORK SERVICE)下工作,並且您的可執行文件也獲得此權限並在同一用戶下運行。 至於你等待它完成它的工作,你可能運行的可執行文件可能有些錯誤。 我建議你做一個簡單的實驗 - 將你的WebApplication切換到VS web服務器內置,稱為“Casini”並檢查你的代碼行為。 通過這種方式,您可以證明自己不是ASP.NET的錯。 如果我是對的,您唯一需要做的就是調查可執行文件的問題並確定它需要什么權限。

而不是模仿或給予Asp.net更多權限,如何在不同的憑據下啟動流程。 在下面的示例中,UserWithVeryLimitedRights將是您創建的新帳戶,只具有運行應用程序的權限。 這樣做可以將安全風險降至最低。

ProcessStartInfo StartInfo = new ProcessStartInfo();
SecureString ss = new SecureString();
string insecurePassword = "SomePassword";

foreach(char passChar in insecurePassword.ToCharArray()) {
ss.AppendChar(passChar);
}

StartInfo.RedirectStandardInput = true;
StartInfo.RedirectStandardError = true;
StartInfo.RedirectStandardOutput = true; 

StartInfo.CreateNoWindow = true;
StartInfo.UseShellExecute = false;
StartInfo.Password = ss;
StartInfo.UserName = @"UserWithVeryLimitedRights";
StartInfo.FileName = @"c:\winnt\notepad.exe";
Process.Start(StartInfo);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM