2012-12-06 164 views
1

我有一個WCF服務調用一個使用Process.Start(startInfo)執行SQLPackage.exe的類,它是SQL Server數據工具DACPAC執行工具。如果我通過在調試器中運行的WPF測試工具來訪問此代碼,它將按設計工作。但是,一旦WCF服務在IIS中運行,調用Process.Start(startInfo)的代碼行將失敗,並顯示「Access is denied」消息。從WCF服務運行時,System.Diagnostics.Process.Start()允許訪問被拒絕

我已經多次嘗試解決這個問題;我添加了模擬,我向startInfo添加了「runas」動詞,我已經更改了應用程序池和託管該服務的應用程序使用具有管理員權限的域帳戶,我已驗證SQLPackage.exe允許用於該域帳戶有問題,我已經搞亂了用戶帳戶控制設置 - 沒有任何工作,我每次都得到相同的確切錯誤。

除非對通過Process.Start()調用可執行文件的WCF服務存在一些固有的限制,在我看來這必須是某種配置問題,但我非常難以忍受這一點。我的機器運行Windows 7,我們的服務器是W2K8,兩者都有相同的行爲。調用該服務的客戶端是ASP.NET MVC,但我不確定這是否重要。

有誰知道我需要做什麼才能成功執行它作爲在IIS中運行的WCF服務?我已經在類似主題的各個網站上閱讀了大量的主題,但他們主要涉及到Windows服務和較舊的操作系統,我從來沒有得到任何這些建議的工作。提前致謝!如果您需要更多信息,請告訴我。

這裏是我的代碼:

  ProcessStartInfo startInfo = new ProcessStartInfo(); 
      startInfo.FileName = DacPacExecutablePath; 
      startInfo.Arguments = FormDacPacArgumentString(dbname, server); 
      startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      startInfo.UseShellExecute = false; 
      startInfo.Verb = "runas"; 
      startInfo.CreateNoWindow = true; 
      startInfo.RedirectStandardOutput = true; 
      using (Process process = Process.Start(startInfo)) //error on this line I think. 
      { 
       using (StreamReader reader = process.StandardOutput) 
       { 
       string result = reader.ReadToEnd(); 
       //do stuff 
       } 
      } 

以下是錯誤:

Message : Access is denied
Source : System
Stacktrace : at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at MatterDBGenerator.DoGenerateDB(string dbname, InstallationServer server) in c:\projects\pathstuff\MatterDBGenerator.cs:line 107 at MatterDBGenerator.GenerateMatterDatabase(String dbname, InstallationServer server) in c:\projects\pathstuff\MatterDBGenerator.cs:line 86
TargetSite : Boolean StartWithCreateProcess(System.Diagnostics.ProcessStartInfo)

+1

是否將IIS配置爲運行腳本和.exe?我會將.exe複製到IIS dirctory並打開這些權限。 – Paparazzi

+0

您將.exe複製到IIS目錄的建議可以幫助我找出問題所在,儘管它實際上並不相關。該exe的路徑實際上不包括文件名。不知何故,在Visual Studio中,調試器計算出哪個exe文件可以使用(我怎麼也不知道),即使文件名只是包含它的目錄。當我將它指向不同的目錄時,我開始在調試器中看到「訪問被拒絕」 - 這是我以前從未見過的。那時我注意到SQLPackage.exe沒有被追加到文件名並能夠修復它。 – anyeone

+0

我會說非常相關。 IIS有權訪問文件和執行權限嗎? – Paparazzi

回答

2

的問題是,我是指向一個目錄,而不是一個文件。是的,它具有執行權限。 StartInfo.FileName指向「C:\ Program Files(x86)\ Microsoft Sql Server \ 110 \ dac \ bin」而不是「C:\ Program Files(x86)\ Microsoft Sql Server \ 110 \ dac \ bin \ SQLPackage」。可執行程序」。顯然,你不能執行一個目錄,但由於某種原因,Visual Studio設法「猜測」當我在調試器中指向SQL Server bin時運行的可執行文件,而不是當文件被複制到IIS目錄時我注意到startInfo.filename有一個目錄而不是文件。