Process.Start(startInfo) を使用して SQL Server Data Tools DACPAC 実行ユーティリティである SQLPackage.exe を実行するクラスを呼び出す WCF サービスがあります。デバッガーで実行されている WPF テスト ハーネスを介してこのコードにアクセスすると、設計どおりに動作します。ただし、IIS で WCF サービスが実行されると、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
}
}
エラーは次のとおりです。
メッセージ : アクセスが拒否されました
ソース : システム
スタックトレース : 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: c:\projects\pathstuff\MatterDBGenerator.cs:line 86
TargetSite の MatterDBGenerator.GenerateMatterDatabase(String dbname, InstallationServer server) の 107 行目: Boolean StartWithCreateProcess(System.Diagnostics.ProcessStartInfo)