2

我有一个 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.Start(ProcessStartInfo startInfo) 在 System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
在 MatterDBGenerator.DoGenerateDB(string dbname, InstallationServer server) 在 c:\projects \pathstuff\MatterDBGenerator.cs:第 107 行在 MatterDBGenerator.GenerateMatterDatabase(字符串数据库名称,InstallationServer 服务器)在 c:\projects\pathstuff\MatterDBGenerator.cs:第 86 行
TargetSite:布尔 StartWithCreateProcess(System.Diagnostics.ProcessStartInfo)

4

1 回答 1

3

问题是我指向的是一个目录,而不是一个文件。是的,它确实具有执行权限。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 有一个目录而不是文件。

于 2014-05-27T14:32:33.227 回答