2011-08-26 3 views
8

私は、WCFサービス側のイントラネットクライアントからプロセスを実行したいと考えています。私の場合、クライアントはサーバーに、提供された資格情報のもとでサーバーのマシンに新しいプロセスを作成するよう要求します。 WCFサービスは、IIS 7.5でホストされていると私は、このコードIISでホストされているWCFサービスからプロセスを開始するにはどうすればよいですか?

var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe") 
{ 
    UserName = "some user", 
    Password = MakeSecureString("some password"), 
    UseShellExecute = false, 
    LoadUserProfile = true 
}; 

Process process = Process.Start(processInfo); 

私が管理者ユーザーの下で実行されている自己ホスト型コンソールアプリケーションとしてWCFサービスをホストする場合、このコードは動作し、私はメモ帳を別のユーザーで起動参照を使用してプロセスを開始します。これは、例外なくIIS上で失敗しますが、プロセスはすぐに管理者権限を持つユーザで実行されているIIS、WCFアプリケーションで

process.HasExited = true; 
process.ExitCode = -1073741502; 

を終了し、web.configファイルで定義された完全な信頼を持っています。自己ホスティングアプリケーションを使用することはできません。これは、IIS WebファームでWebDeployなどの簡単な継続的な配信をサポートしていないためです。

Q: IISでホストされているWCFサービスからサーバー側でプロセスを開始するにはどうすればよいですか?

EDIT:
私は同様の問題と、このpostにつまずいたと私はまた、ユーザーに追加の権限を付与する試みCreateProcessWithLogonWとCreateProcessAsUserとProcess.Start及びP /呼び出しのためのすべての可能な変形を含むが、すべての方法を試みました。これは、男が投稿したものと同じエラーメッセージで動作します。

+0

完全なソースコードサンプルを含む最終的なソリューションですか? – Kiquenet

+0

汚れたハックがなければ不可能です。私はそれをしなかった。 – oleksii

+0

汚いハックは? – Kiquenet

答えて

4

Oleksii、ポイントは、コンソールアプリケーションでWCFサービスをホストする場合、そのユーザーのWindowsセッションは、(ユーザーがログインし、Windowsエクスプローラがロードされた)があることで、メモ帳を開いて、ために示されていますそのユーザーは、UIで表示されます。

IISでWCFサービスをホストしているとき、IISはIISを必要とし、ユーザーの操作を許可せず、ユーザーがログインしていない場合でも機能します。このコンテキストでは、メモ帳やその他のUI対応アプリケーションをホストするUIはありませんが、Windows Explorerがロードされておらず、場所が決まっていないため、精緻化やその他のバッチジョブを実行できますプロセスのUIをレンダリングします。

+1

Process.Startを使用してコマンドEXE(コマンドラインではなくコマンドライン)を呼び出すと、IISでホストされているWCFサービス(AppPoolでユーザーA)が使用され、別のユーザーBが偽装されます。助言がありますか?おそらく不可能かもしれません。 – Kiquenet

1

ここで私はGnuPGPを暗号化するために使用しています。あなたのセットアップはどのように比較されますか?

private int ExecuteCommand(string arguments, string passPhrase, int timeout) 
     { 
      Process processObject; 
      ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments); 


      pInfo.CreateNoWindow = true; 
      pInfo.UseShellExecute = false; 

      pInfo.RedirectStandardInput = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      processObject = Process.Start(pInfo); 

      if (!string.IsNullOrEmpty(passPhrase)) 
      { 
       processObject.StandardInput.WriteLine(passPhrase); 
       processObject.StandardInput.Flush(); 
      } 

      string result = processObject.StandardOutput.ReadToEnd(); 
      string error = processObject.StandardError.ReadToEnd(); 

      if (!processObject.WaitForExit(timeout)) 
      { 
       throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds "); 
      } 

      int exitcode = processObject.ExitCode; 

      Error = error; 
      Output = result; 

      return exitcode; 

     } 
+0

この行 'processObject = Process.Start(pInfo);の後にはそれは役に立たないでしょう、それはHasExitedがtrueに設定されています。 – oleksii

+0

あなたは本当にメモ帳を実行しようとしていませんよね? –

+0

実際、私はプロセスの開始を検出するために他のソフトウェアの機能をテストするテストハーネスです。 – oleksii

1

ユーザープロファイルを読み込むためのapppool設定があります。

loadUserProfile Optional Boolean attribute. 

Specifies whether IIS loads the user profile for the application pool identity. Setting  
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity. 

The default value is false. 

十分な権限を持つIDとしてドメインユーザーになると、それはうまくいくでしょうか?最低限、ユーザーはユーザープロファイルが必要であることを知っています。

これはちょっと変わったアーキテクチャだと言われています。より良いアーチは、サイトが通信するWindowsサービスのような永続的なプロセスを持つことだと思われますが、あなたの制約が何であるか分かりません。

希望に役立ちます。

+0

あなたの答えをありがとう。これは意味をなさない。 IISを使用すると、WebDeployを介して製品を提供する方が簡単になり、Webファームを作成できます。つまり、私はWinサービスを試してみて、そこに同じ問題があったと言いました。 IISでこれを設定するのは苦労しますので、コマンドラインのホスティングとスクリプトのデプロイメントを逆にしています。 – oleksii

関連する問題