C# – 干净地关闭OpenVPN

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

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

我们被迫杀死OpenVpn以关闭它,这似乎在Vista上偶尔引起BSOD ……

这是我在MSDN上发布的post的链接,它也描述了这个问题: MSDN论坛

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

或者更简洁地关闭OpenVPN的解决方法?

更新:

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

  • ConsoleKey.F1
  • “\ x70”(F1的hex值)
  • Convert.ToChar((INT)ConsoleKey.F1)

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

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

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

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

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

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

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

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

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

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

支持声明的道具,他的评论帮助了很多。

 StandardInput.Write(ConsoleKey.F4); 

显然,您必须获得StandardIn才能完成此过程。