2013-03-04 23 views
7

當用戶單擊按鈕時,我正在ASP.NET應用程序中運行可執行進程。此過程會創建多個文件並將其提供給最終用戶。我無法真正瞭解該過程是什麼或者沒有做什麼,但是直到我將該管理員用戶指定爲服務器上的應用程序池標識後才能正常工作。我正在使用IIS7。從ASP.NET App Pool運行命令標識

using (var proc = new Process()) 
{ 
    proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyExe.exe"); 
    proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFilePath); 
    proc.StartInfo.UseShellExecute = true; 
    proc.Start(); 
    proc.WaitForExit(); 
} 

我假設這通常是一件壞事。你能否告訴我需要做些什麼才能在正常的ApplicationPoolIdentity帳戶中啓用此功能?

謝謝!

+0

進程如何向最終用戶提供文件? – 2013-03-04 21:22:29

+0

它存儲在臨時目錄中,壓縮所有文件並提供。這已經工作了。 – daniel 2013-03-04 21:47:07

回答

1

謝謝大家的幫助。我所需要做的就是將StartInfo.WorkingDirectory設置到我能寫的地方。

 using (var proc = new Process()) 
     { 
      proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyEXE.exe"); 
      proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFile); 
      proc.StartInfo.WorkingDirectory = savePath; 
      proc.Start(); 
      proc.WaitForExit(); 
     } 

這將導致臨時文件寫入到非系統文件夾,因此不需要任何提升權限的應用程序池。

2

這可能是文件/執行權限問題。 嘗試授予execute對ApplicationPoolIdentity的權限爲~/Testing/Dema/MyExe.exeread權限爲commandFilePath。你提到過程創建文件。您將需要授予modifyfull control權限到要創建文件的文件夾上的ApplicationPoolIdentity。這是一個矩陣式list of permissions

有關授予權限的信息,請參閱assign permissions to ApplicationPoolIdentity account

安全事件日誌應該捕獲權限被拒絕的錯誤。在那裏查看是否有訪問權限問題。系統和應用程序日誌可能還包含有關該問題的信息。

Process Explorer還可以顯示文件訪問請求。這裏是關於troubleshooting with Process Explorer的technet文章。

+0

同意。寫入位置已經正常工作......這是執行權限。我將如何去改變ApplicationPoolIdentity的執行權限? – daniel 2013-03-04 21:45:41

+0

它正在使用IUSR帳戶...並且該帳戶對該目錄具有完全權限。我是否還需要做該線程中提到的內容? – daniel 2013-03-04 22:23:00

+0

您可以啓動ProcessExplorer,然後在管理員帳戶下運行應用程序池,並在應用程序成功運行時記錄(通過ProcessExplorer)所有活動。然後更改爲在IUSR帳戶下運行並比較ProcessExplorer日誌。 – 2013-03-04 22:37:53

3

首先,爲什麼你需要Shell來執行它?不是控制檯應用程序 - 你打開任何窗口嗎?

其次你需要重定向輸入和輸出。

最後,你需要做的是放置在你的腳本運行的目錄下,運行你的池下的用戶權限。並從您的池中刪除管理員。

proc.StartInfo.UseShellExecute = false; 
proc.StartInfo.CreateNoWindow = false; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.RedirectStandardInput = true; 

proc.Start(); 

proc.StandardInput.Flush(); 
proc.StandardInput.Close(); 

proc.WaitForExit(); 
proc.Close(); 

因此,舉例來說,如果你把你的池用戶A下運行,然後轉到你的目錄,你的程序運行,併爲用戶A添加權限能夠在該目錄執行程序。如果您的程序也使用其他目錄進行讀取和寫入,則還要爲該用戶的UserA添加權限。

我實在看不出有什麼過程或沒有做

,如果你的服務器Process Explorer上使用您可以看看,看看它的運行,如果它的接近,如果它停下來,但留在那裏。

+0

我看到進程運行了一秒鐘,然後結束......我假設沒有權限。 – daniel 2013-03-04 21:55:39

+0

@丹尼爾如果你看到它開始,那麼是不是在運行的權限。在應用程序中添加一些日誌以查找停止的原因。 – Aristos 2013-03-04 22:02:47

+0

曾經運行過一個命令,它告訴你需要「以管理員身份運行」?這個過程可能還會開始,但是如果沒有提升權限,它可能無法做其他事情。 – daniel 2013-03-04 22:09:20

1

每當您從ASP.NET頁面運行任何進程時,它都會在工作進程的安全上下文中運行,即您的應用程序池帳戶的特權。它不像你通常運行的MyExe.exe,在這種情況下,它將使用登錄帳戶運行。正因爲如此,當您將管理員帳戶授予應用程序池時,您的代碼才起作用。

有很多方法可以解決這個問題。

最簡單的方法之一是將您的應用程序池標識更改爲網絡服務,並將網絡服務添加到MyExe.exe將訪問文件窗體的文件夾權限。

希望它有幫助。

+0

網絡服務不會授予對inetsrv目錄的訪問權限。 – daniel 2013-03-05 14:51:24