0

WMI(C#コード)を使用してリモートサーバーでコンソールアプリを実行しています

プロセスからの出力をキャプチャしたいと思います。

誰かがそうするのを手伝ってくれませんか?

シナリオ:

ユーザーがサーバーの詳細を提供するWebページがあります。ユーザーが送信をクリックしたときに、リモートサーバー上のアプリを呼び出してパラメーターを渡したい。リモートサーバー上のアプリがアクションを実行し、出力を返します(出力は数値、文字列、またはブール値になります)。

出力に基づいて、詳細をユーザーに求めるか、エラーを表示する必要があります。

object[] processToRun = new[] { "\"Path to exe\" \"Param1\" \"Param2\"" };
ConnectionOptions connection = new ConnectionOptions();
connection.Username = "username";
connection.Password = "password";
ManagementScope wmiScope = new ManagementScope(String.Format("\\\\{0}\\root\\cimv2", "ServerName"), connection);
ManagementClass wmiProcess = new ManagementClass(wmiScope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
wmiProcess.InvokeMethod("Create", processToRun);

これの出力を取得したいと思います。

一時的な解決策:しかし機能しない

一時的な解決策として、誰もがアクセスできる共有パスにログファイルを作成するコードを追加しました。しかし、ここでも問題が発生しています。リモートサーバーでexeを呼び出して共有パスに書き込むと、常に「アクセスが拒否されました」というエラーが表示されます。しかし、サーバー自体からexeを実行すると、正常に動作します。

4

2 に答える 2

1

過去にPsExecを使用したことがあります。これは、ファイアウォールが WMI 要求をブロックしていたときに役立ちました。C# から他のプロセスを開始するのと同じように PsExec を開始し、標準出力をリダイレクトするだけです。PsExec 自体からの出力ストリームには余分なバイトとビットが含まれていると思いますが、トリミングを行った後、必要な場所に移動する必要があります。

于 2013-02-07T22:32:26.477 に答える
0

2 番目のマシンから出力を収集すると仮定すると、1 つの方法はソケットを使用することです。2 番目のマシンは、事前定義されたポートにバインドされたソケット ベースのリッスン サービスをホストします。

コンソール アプリに送り返すものがあると、2 台目のマシンへの接続が開かれ、データが送信されます。

多くのクライアントがあり、それらからの頻繁な通信が期待される場合は、WCF や Web サービスなどに基づいたソリューションを利用できます。

あなたが提供した追加情報に基づいて

リモート コンソール プロセスを作成するときに、一意の ID (GUID) を渡します。これにより、Web サーバーで発生したクライアント要求に結び付けられます。これで、コンソール アプリは入力をキャプチャし、GUID と共にソケットを介してサーバーに送信します。

サーバーは、GUID を使用して各出力をデータベース テーブルに記録し、各セッションを識別できます。これで、起動したユーザーは同じ GUID を使用して出力を照会できるようになり (GUID はユーザーが要求を作成したときに生成されるので、ユーザーは常にそれを持っていることに注意してください)、サーバーはテーブルから出力を取得して表示します。

さらに、管理タスクを使用して、x 日数より古いすべての結果の出力テーブルをクリアすることができます

お役に立てれば

于 2013-02-07T23:27:05.493 に答える