C# - 干净地关闭 OpenVPN

标签 c# process openvpn

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

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

我们被迫关闭 OpenVpn 以关闭它,这似乎导致 Vista 上不时出现蓝屏...

这是我在 MSDN 上的帖子的链接,该帖子也描述了该问题:MSDN Forums

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

或者更干净地关闭 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 将持续监视此事件对象的状态,并在收到信号时退出。

第二个参数表示exit-event的初始状态,一般默认为0。

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

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

最佳答案

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

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

然后下面的 C# 代码会导致 OpenVPN 干净地退出:

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

resetEvent.Set();

prop to consultutah,他的评论很有帮助。

关于C# - 干净地关闭 OpenVPN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1195210/

相关文章:

.net - 管理 .NET 应用程序以在终止/终止时正常关闭

android-ndk - 构建 icsopenvpn

macos - 打开VPN : connect error: Missing External PKI alias

c# - 使用 SendMessage 模拟鼠标点击

c# - ASP.NET Core - 自定义模型验证

c# - 在我自己的 "UITableViewController"中使用默认实现使方法可选

bash 序列 : wait for output, 然后开始下一个程序

c# - 从多个类中提取父类(super class)并从中派生

scala - 是否有任何用于捕获外部进程输出的 Scala 内置类?

macos - 如何检查 OS X 终端中的进程?