1

より大きなアプリケーションの拡張機能として、OpenVPN を制御するトレイに収まるアプリケーションを作成しました。

コマンド ラインで openvpn.exe を実行する場合は、F4 キーを押して閉じることができます。C# から同じキープレスを送信する必要がありますが、StandardInput には文字列値しか送信できません。

OpenVpnを強制終了して閉じる必要があり、これがVistaで時々BSODを引き起こしているようです...

この問題についても説明している MSDN の私の投稿へのリンクを次に示します: MSDN フォーラム

StandardInput を使用して特別なキーストロークを Process に送信する方法を知っている人はいますか?

それとも、OpenVPN をよりきれいに閉じるための回避策でしょうか?

アップデート:

以下は、StandardInput.Write() に渡されると機能しません。この例では F1 キーが使用されています。

  • ConsoleKey.F1
  • "\x70" (F1 の 16 進値)
  • Convert.ToChar((int)ConsoleKey.F1)

ユーザー名/パスワードを OpenVPN に問題なく渡すことができるため、入力/出力は既に適切にリダイレクトされています。

更新 2: OpenVPN のいくつかのコマンド ライン オプション ドキュメントでこれを見つけました:

--service exit-event [0|1] OpenVPN が別のプログラムによって自動的に実行され、ディスプレイやキーボードを介したユーザーとの対話が不可能な場合に使用する必要があります。一般に、特定の OpenVPN 構成がサービスとして実行されているときに OpenVPN サービス ラッパーによって自動的に追加されるため、エンド ユーザーがこのオプションを明示的に使用する必要はありません。exit-event は Windows グローバル イベント オブジェクトの名前であり、OpenVPN はこのイベント オブジェクトの状態を継続的に監視し、シグナル状態になると終了します。

2 番目のパラメータは exit-event の初期状態を示し、通常はデフォルトで 0 になります。

同じ exit-event パラメータを使用して、複数の OpenVPN プロセスを同時に実行できます。いずれにせよ、制御プロセスは終了イベントを通知し、そのようなすべての OpenVPN プロセスを終了させることができます。

これを C# でどのように使用しますか? 「終了イベント」は、ミューテックスに言及していることを示していますか?

4

2 に答える 2

3

OpenVPN を次のように実行すると:

"openvpn.exe --config PathToMyConfig.ovpn --service MyEventName 0"

次に、次の C# コードにより、OpenVPN が正常に終了します。

EventWaitHandle resetEvent = EventWaitHandle.OpenExisting("MyEventName");

resetEvent.Set();

コンサルトタへの小道具、彼のコメントはかなり役に立ちました。

于 2009-07-28T18:33:31.007 に答える
1
StandardInput.Write(ConsoleKey.F4);

明らかに、プロセスの StandardIn を取得する必要があります。

于 2009-07-28T16:29:02.613 に答える