C# - 干净地关闭OpenVPN

时间:2009-07-28 16:24:44

标签: c# process openvpn

我们编写了一个应用程序,它位于控制OpenVPN的托盘中,作为更大应用程序的扩展。

如果在命令行上运行openvpn.exe,可以按F4关闭它。我们需要从C#发送相同的按键,但您只能将字符串值发送到StandardInput。

我们被迫杀死OpenVpn以关闭它,这似乎在Vista上偶尔会导致BSOD ......

以下是我在MSDN上发布的帖子的链接,该帖子还介绍了该问题:MSDN Forums

有谁知道如何使用StandardInput向Process发送特殊击键?

或者可能是一种更干净地关闭OpenVPN的解决方法?

更新:

以下在传递给StandardInput.Write()时不起作用,F1键在此示例中:

  • ConsoleKey.F1
  • “\ x70”(F1的十六进制值)
  • Convert.ToChar((int)的ConsoleKey.F1)

我们已经正确地重定向输入/输出,因为我们可以成功地将用户名/密码传递给OpenVPN而没有任何问题。

更新2:在OpenVPN的一些命令行选项文档中找到了这个:

- 服务退出事件[0 | 1] 当在这样的环境中由另一个程序自动执行OpenVPN时,应该使用该环境,以便不能通过显示器或键盘与用户交互。通常,最终用户永远不需要显式使用此选项,因为当给定的OpenVPN配置作为服务运行时,OpenVPN服务包装器会自动添加该选项。 exit-event是Windows全局事件对象的名称,OpenVPN将持续监视此事件对象的状态,并在发出信号时退出。

第二个参数表示退出事件的初始状态,通常默认为0。

可以使用相同的exit-event参数同时执行多个OpenVPN进程。在任何情况下,控制过程都可以发出退出事件的信号,导致所有这样的OpenVPN进程退出。

我如何在C#中使用它? “退出事件”是否表示他们提到了Mutex?

2 个答案:

答案 0 :(得分:3)

如果我按以下方式运行OpenVPN:

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

然后,以下C#代码导致OpenVPN干净地退出:

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

resetEvent.Set();

道具咨询,他的评论帮助了很多。

答案 1 :(得分:1)

StandardInput.Write(ConsoleKey.F4);

显然你必须得到StandardIn才能完成这个过程。

相关问题