我有一个WCF服务,它调用一个使用Process.Start(startInfo)来执行SQLPackage.exe的类,这是SQL Server数据工具DACPAC执行实用程序。如果我通过在调试器中运行的WPF测试工具访问此代码,它将按设计工作。但是,一旦WCF服务在IIS中运行,调用Process.Start(startInfo)的代码行将失败,并显示“访问被拒绝”消息。
我已经多次尝试解决这个问题;我添加了模拟,我将“runas”动词添加到startInfo,我已经更改了应用程序池和托管服务的应用程序使用具有管理员权限的域帐户,我已经验证了该域帐户允许使用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
}
}
这是错误:
消息:访问被拒绝 资料来源:系统
Stacktrace:at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo) 在System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
at MatterDBGenerator.DoGenerateDB(string dbname,InstallationServer服务器)位于c:\ projects \ pathstuff \ MatterDBGenerator.cs:第107行 at MatterDBGenerator.GenerateMatterDatabase(String dbname,InstallationServer服务器),位于c:\ projects \ pathstuff \ MatterDBGenerator.cs:第86行
TargetSite:Boolean StartWithCreateProcess(System.Diagnostics.ProcessStartInfo)
答案 0 :(得分:2)
问题是我指向的是目录,而不是文件。是的,它确实有执行权限。 StartInfo.FileName指向“C:\ Program Files(x86)\ Microsoft Sql Server \ 110 \ dac \ bin”而不是“C:\ Program Files(x86)\ Microsoft Sql Server \ 110 \ dac \ bin \ SQLPackage”。可执行程序”。显然你不能执行一个目录,但出于某种原因,当我在调试器中指向SQL Server bin时,Visual Studio设法“猜测”运行哪个可执行文件,而不是当文件被复制到IIS目录时,哪一点我注意到startInfo.filename有一个目录而不是一个文件。