2011-09-19 100 views
0

我在Windows 2008服務器上遇到了權限問題。我有一個命令行工具,我需要運行一些標準文件轉換爲CSV文件。這又用於將數據導入到我的SQL數據庫。我能夠完成在我的2003服務器上正常工作,但我的Windows 2008服務器不允許代碼運行。以下是代碼的淡化版本。基本上在這個例子中,我只是試圖運行一個簡單的命令。但我一直在拒絕輸出訪問。我該如何糾正?Asp.net CMD安全問題

public partial class _Bank : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 

} 


protected void btn_Click(object sender, EventArgs e) 
{ 

    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe"); 
    processStartInfo.RedirectStandardInput = true; 
    processStartInfo.RedirectStandardOutput = true; 
    processStartInfo.UseShellExecute = false; 
    processStartInfo.RedirectStandardError = true; 

    Process process = Process.Start(processStartInfo); 

    if (process != null) 
    { 

     process.StandardInput.WriteLine("dir"); 

     process.StandardInput.Close(); 
     string outputString = process.StandardOutput.ReadToEnd(); 
     Response.Write(outputString); 

     string error = process.StandardError.ReadToEnd(); 
     Response.Write(error); 

    } 

} 
private string ProcessRunner() 
{ 
    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe"); 
    processStartInfo.RedirectStandardInput = true; 
    processStartInfo.RedirectStandardOutput = true; 
    processStartInfo.UseShellExecute = false; 

    Process process = Process.Start(processStartInfo); 

    if (process != null) 
    { 

     //process.StandardInput.WriteLine("This is a test line"); 
     process.StandardInput.WriteLine("c:\\"); 
     process.StandardInput.WriteLine("This is a test line"); 

     process.StandardInput.Close(); // line added to stop process from hanging on  ReadToEnd() 

     string outputString = process.StandardOutput.ReadToEnd(); 
     Response.Write(outputString); 
     return outputString; 

    } 

    return string.Empty; 
} 

public static int ExecuteCommand(string Command, int Timeout) 
{ 
    int ExitCode; 
    ProcessStartInfo ProcessInfo; 
    Process Process; 

    ProcessInfo = new ProcessStartInfo("cmd.exe", "/C " + Command); 
    ProcessInfo.CreateNoWindow = true; 
    ProcessInfo.UseShellExecute = false; 
    Process = Process.Start(ProcessInfo); 
    Process.WaitForExit(Timeout); 
    ExitCode = Process.ExitCode; 
    Process.Close(); 

    return ExitCode; 
} 
} 
+0

爲什麼不使用'System.IO'類? –

回答

1

這是在具有應用程序池的asp.net應用程序中運行。 App-Pool有一個身份(本地系統,網絡服務等),這個過程被執行。 確保此用戶對您計劃訪問的文件夾具有必要的權限。

恕我直言:出於安全考慮,在網絡應用程序內啓動另一個進程不是最佳做法,絕對不應該在互聯網web應用程序上完成。

編輯: Usualy用戶被命名爲ASPNET或IWAM_ [服務器名稱](IWAM _... Internet Information Services的內置帳戶,以啓動進程應用程序)。只需授予該用戶的文件夾訪問權限即可。

+0

Hi @Yves M.感謝您的評論。你如何真正做到上述? 另外,你說在Web應用程序內啓動另一個進程並不是最佳實踐。那麼你將如何運行第三方應用程序來通過命令行轉換數據? – Rup

+0

嗯,我不知道你的情況。所以一般來說這被認爲是不好的做法。但在某些情況下,這是最好的解決方案思路......所以答案是着名的「它取決於」。 Usualy我寫了一個服務,用於在丟棄文件夾中偵聽丟棄的文件。扔掉一個文件後,事件發生了,我正在做我的魔力。在更大的環境中,我們通常使用集成平臺進行文件轉換。 –

+0

請參閱我的回答http://stackoverflow.com/questions/7334216/iis7-permissions-overview-applicationpoolidentity/7334485#7334485有關如何更改文件權限以匹配IIS 7 +中默認使用的特殊應用程序池標識。 –