2011-12-08 30 views
1

私はをサーバー上で起動するASP Webアプリケーションを実行しています。これを実行するにはPowershell script多くのドメイン権限が必要です。だから私はすべての権利を持つユーザーの下でapppoolを実行します。 しかし、私がpowershellscriptを起動すると、私はいつもそのアクセスが拒否されていることを知っています。ASP.NETから起動するプロセス

問題を解決する方法はありますか?

上記のプロセスを開始すると、プロセスはアプリケーションプールのusercontextまたはASP.NET Webアプリケーションにログインしているユーザーのusercontextの下で実行されていますか?

I'verは二つの方法 1.

string cmdArg = "C:\\Scripts\\test.ps1 " + username; 
      Runspace runspace = RunspaceFactory.CreateRunspace(); 
      runspace.Open(); 
      Pipeline pipeline = runspace.CreatePipeline(); 

      pipeline.Commands.AddScript(cmdArg); 
      pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output); 
      Collection<PSObject> results = pipeline.Invoke(); 
      runspace.Close(); 

      StringBuilder stringBuilder = new StringBuilder(); 
      foreach (PSObject obj in results) 
      { 
       stringBuilder.AppendLine(obj.ToString()); 
       string test = Environment.UserName; 
      } 
      return results[0].ToString(); 

2.

string cmdArg = "C:\\Scripts\\test.ps1 " + username; 
Process myProcess = new Process(); 
      ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("powershell.exe",cmdArg); 

      myProcessStartInfo.UseShellExecute = false; 
      myProcessStartInfo.RedirectStandardOutput = true; 
      myProcess.StartInfo = myProcessStartInfo; 

      myProcess.Start(); 
      StreamReader myStreamReader = myProcess.StandardOutput; 
      myProcess.WaitForExit(); 
      string myString = myStreamReader.ReadLine(); 

      return myString; 

を試してみました[OK]を、あなたはこれらの壮大な権限でアプリケーションプールを実行すると、ベストプラクティスではないと思います。

ウェブサービスを間に置くのはどうですか? webserviceは、localhostからしかアクセスできないappdomainにありますか?

更新 いいえ、私はasp.net webserviceを書いています。 webserviceはすべての権限を持つアプリケーションプールで実行されますが、localhostからのみアクセス可能です。 Webサービスには、スクリプトを開始するコードが含まれています。 ASP MVC3 Webアプリケーションは、ほとんど権利のないアプリケーションプールで実行されています。 しかし、webmethodが実行されると、私には十分な権利がないことを私に教えるエラーが表示されます。私は偽をwebconfigに設定しようとしましたが、成功しませんでした。

誰もこの問題を解決する方法を知っていますか?

アップデート:私はWebサービスからそれを起動したときにPowerShellを実行し、現在のユーザを読んだ

。私はそれがすべての権利を持っているユーザーだと言います。しかし、psは次のようなエラーをスローします。値nullでメソッドを開始することはできません。

次に、低レベルのユーザーとしてrunsasでpsを実行しようとしました。同じエラーが出ます。

次に、webserviceと同じユーザーでpsを実行しようとしましたが、すべてが機能しました!

この現象を説明できる人はいますか? 上記のコードとrunasの違いは何ですか? (同じユーザーコンテキスト)

ありがとう!

+1

これが制作ウェブサイトの場合、私は本当にこれをしません。あなたは巨大なセキュリティホールとおそらくパフォーマンス/ユーザビリティの問題も導入しています。個人的には、別のサービスを作成して、Webアプリケーションによってデータベースに行が挿入されるなどのイベントに基づいて作業を行うことができます。 – s1mm0t

+1

プロセスを開始するために使用しているコードを投稿してください。デフォルトでは、偽装が有効になっていない限り、プロセスはアプリケーションプールが実行されているプロセスとして実行されます。アクセス拒否のエラーがユーザーと一緒に表示されるので、マシンのイベントログも確認してください。 – dash

+1

http://stackoverflow.com/questions/8061362/starting-a-process-from-asp-net-why-does-the-process-immediately-die/8061534#8061534 –

答えて

0

は、パフォーマンスのために素晴らしいではない、偽装が有効になっている場合は、現在ログインしているユーザーが使用され、偽装の設定に依存するとしセキュリティ上のリスクもあります。しかし、ASP.NETや他の最新のWebサーバーが利用可能になる前に、静的ファイル以外にコンテンツを提供する唯一の方法は、別のプロセスでプログラムを実行することでした。

これを実行するためのAPIはCommon Gateway Interface (CGI)と呼ばれ、引き続きIISでサポートされています。正しく設定されている場合は、各要求に対してプログラムを実行できます。

CGIを使用してスクリプトを実行することはできませんが、拡張子が.ps1のファイルに対してPowerShellを実行するISAPIフィルタを作成できます。これは、基本的には、拡張子が.phpのファイルが要求されたときに、新しいプロセスでphp.exeが実行される方法です。

実行可能なコンテンツを有効にすることは、セキュリティリスクを制限するために、フォルダ単位で行うことができます。一般的には、さまざまな種類のコンテンツを混在させないようにする必要があります。スクリプトを表示して実行することはできません。

PowerShellスクリプトをリモートで実行できるようにするには、PowerShellに小さなHTTPサーバーを作成して、IISとASP.NETを完全に削除しなければなりません。

+0

お返事ありがとうございました!内部にはるかに多くの機能があるため、WebサービスとIISを使用したいと思います。私は再び質問を更新しました。 – HW90

0

私は、これは単にそうでない場合はHTTPリクエストで新しいプロセスを起動するアプリケーションプールのユーザー

+0

あなたの答えをありがとう、私は私の質問を更新しました! – HW90

関連する問題