2012-01-05 4 views
0

ASP .Net Webアプリケーションからリモートサーバーでプロセスを実行しようとしています(Webアプリケーションはプロセスと同じサーバー上にあります)。私が実行しているコードは以下の通りです:しかし、私は次のエラーを取得するASPを使用してローカルマシン上のプロセスを管理する.Net

ConnectionOptions conO = new ConnectionOptions(); 
      // conO.Username = txtUser.Text; 
      // conO.Password = txtPassword.Text; 

      ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2"); 

      System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO); 
      oMs.Connect(); 

      ObjectGetOptions opt = new ObjectGetOptions(); 
      ManagementClass classInstance = new ManagementClass(oMs, path, opt); 
      ManagementBaseObject inParams = classInstance.GetMethodParameters("Create"); 
      inParams["CommandLine"] = txtPath.Text; 
      ManagementBaseObject outParams = classInstance.InvokeMethod("Create", inParams, null); 
      lblInfo.Text = outParams["returnValue"].ToString() + " Process ID: {0}" + outParams["processId"].ToString(); 

Operation is not valid due to the current state of the object.

誰もがこの問題のためのより良い解決策を持っていますか?

はところで、私は次のシナリオを持っている:

私のクライアントは、彼は多くの異なるもの(ログ記録、計算...)行ういくつかのアプリケーションを持っているサーバーを実行します。彼は、Webベースのクライアント(彼の携帯電話を含む)からこれらのアプリケーションを監視し、必要に応じて再起動することができるようにしたいと考えています。

このアプリケーションを使用して達成しようとしているのは、プロセスを終了して同じプロセスを開始することです。 System.Diagnosticsを使用する私は現在実行中のプロセスにクエリを実行することができましたが、リモートマシンのSystem.Diagnosticsはプロセスのみを参照することができ、それらと対話しないため、明らかに解決策ではありません。

+1

サーバー側で行うことは、サーバー側で実行されます。クライアント上で任意のコードを実行する場合は、コードスニペットに基づいて何をしようとしているのかを動的に判断できるアプリケーションをクライアント側に持つ必要があります。おそらくクライアント上で動作するサーバーに[CSScript](http://www.csscript.net/)プロジェクトのようなものを組み込むことが役に立ちます。 –

+0

私が実装しようとしているWebサイトと実行中のアプリケーションは、どちらもサーバー上で実際に動作しています。今、アプリケーションを再実装する必要がある場合は、おそらくWindowsサービスとして実装することを選択しますが、残念ながらこれらのアプリケーションは長年前に実装されており、ソースを入手することはできません。 1つの問題は、これらのアプリがクラッシュする傾向があることです。要件は、クラッシュしたかどうかを検出して再起動できることです。 – user496607

+0

次に、ASP .Netを使用してリモートマシンでプロセスを実行しようとしていますか?あなたがクライアントで、サーバが同じマシンにあるなら、それは本当に「リモート」ではありませんか? –

答えて

0

WMIを処理してリストに記載されているエラーが発生した場合、通常はクエリから返されるデータがないことを意味します。あなたのコードを見ると、プロセスデータがどこに格納されているかを決して知らないようです。コードのどこかにWin32_Processを呼び出す必要があります。プロセスの情報を取得するコードは、次のようになります。

ManagementPath path = new ManagementPath(@"\\" + txtRemoteComputer.Text + @"\root\cimv2"); 
System.Management.ManagementScope oMs = new System.Management.ManagementScope(path, conO); 
oMs.Connect(); 
ObjectQuery query = new ObjectQuery(
       "SELECT * FROM Win32_Process"); 
ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher(oMs, query); 
foreach (ManagementObject queryObj in searcher.Get()) 
{ 

その後、コードは何でも実行します。このコードはプロセスを取得するためのものであり、リモートからプロセスを終了するための呼び出しを送信する経験はありませんが、少なくともリモートコンピュータが特定のプロセスを実行しているかどうかを確認することができます。