【发布时间】:2012-11-25 01:47:33
【问题描述】:
我有一个 WCF 服务调用一个类,该类使用 Process.Start(startInfo) 来执行 SQLPackage.exe,它是 SQL Server Data Tools DACPAC 执行实用程序。如果我通过在调试器中运行的 WPF 测试工具访问此代码,它会按设计工作。但是,一旦 WCF 服务在 IIS 中运行,调用 Process.Start(startInfo) 的代码行就会失败,并显示“访问被拒绝”消息。
我已经多次尝试解决这个问题;我添加了模拟,我在 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
}
}
这是错误:
消息:访问被拒绝
来源:系统
堆栈跟踪:在 System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 在 System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
在 c:\projects\pathstuff\MatterDBGenerator.cs:line 107 中的 MatterDBGenerator.DoGenerateDB(string dbname, InstallationServer 服务器) 在 c:\projects\pathstuff\MatterDBGenerator.cs:line 86 中的 MatterDBGenerator.GenerateMatterDatabase(String dbname, InstallationServer 服务器)
TargetSite : Boolean StartWithCreateProcess(System.Diagnostics.ProcessStartInfo)
【问题讨论】:
-
IIS 是否配置为运行脚本和 .exe?我会将 .exe 复制到 IIS 目录并打开这些权限。
-
您将 .exe 复制到 IIS 目录的建议帮助我找出了问题所在,尽管它实际上并不相关。 exe的路径实际上不包括文件名。不知何故,在 Visual Studio 中,调试器找出了要使用的 exe(我怎么不知道),即使文件名只是包含它的目录。当我将它指向不同的目录时,我开始在调试器中看到“拒绝访问”——这是我以前从未见过的。那时我注意到 SQLPackage.exe 没有附加到文件名并且能够修复它。
-
我会说非常相关。 IIS 是否有权访问文件和执行权限?
-
问题是我指向的是一个目录,而不是一个文件。是的,它确实具有执行权限。 StartInfo.FileName 指向“C:\Program Files (x86)\Microsoft Sql Server\110\dac\bin”而不是“C:\Program Files (x86)\Microsoft Sql Server\110\dac\bin\SQLPackage。 EXE文件”。显然你不能执行一个目录,但由于某种原因,当我在调试器中指向 SQL Server bin 时,Visual Studio 设法“猜测”运行哪个可执行文件,而不是当文件被复制到 IIS 目录时,在哪一点我注意到 startInfo.filename 有一个目录而不是一个文件。
-
我希望你能给出这个答案,并支持它 - 我遇到了同样的问题,但没有意识到我错误地忘记在文件名中包含 exe 名称。
标签: .net asp.net-mvc wcf windows-7 windows-server-2008