Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何以编程方式断开OpenVPN连接?_Winforms_Process_Openvpn - Fatal编程技术网

Winforms 如何以编程方式断开OpenVPN连接?

Winforms 如何以编程方式断开OpenVPN连接?,winforms,process,openvpn,Winforms,Process,Openvpn,我正在创建一个WinForms应用程序来启动和停止Windows上的OpenVPN连接。我正在尝试实现与OpenVPN GUI for Windows()提供的功能相同的功能,但使用的是我自己的基于.NET的UI 我正在使用以下方法启动连接: Process openVpnProcess = new Process(); openVpnProcess.StartInfo.CreateNoWindow = true; openVpnProcess.EnableRaisingEvents = tru

我正在创建一个WinForms应用程序来启动和停止Windows上的OpenVPN连接。我正在尝试实现与OpenVPN GUI for Windows()提供的功能相同的功能,但使用的是我自己的基于.NET的UI

我正在使用以下方法启动连接:

Process openVpnProcess = new Process();
openVpnProcess.StartInfo.CreateNoWindow = true;
openVpnProcess.EnableRaisingEvents = true;
openVpnProcess.StartInfo.Arguments = "--config client.ovpn";
openVpnProcess.StartInfo.FileName = "openvpn.exe";
openVpnProcess.StartInfo.WorkingDirectory = @"C:\Program Files\OpenVPN\config";
openVpnProcess.Start();
这将调用openvpn.exe并成功建立连接

但是,我无法确定连接建立后终止连接的方法。我已经尝试使用Process.Kill()了

这将终止进程,但不会恢复初始路由状态。实际上,在手动禁用/启用LAN卡之前,我无法访问网络

在建立VPN连接之前输出“openvpn--显示网络”:

SYSTEM ROUTING TABLE
0.0.0.0 0.0.0.0 10.31.0.254 p=0 i=1376258 t=4 pr=3 a=21 h=0 m=1/-1/-1/-1/-1
10.31.0.0 255.255.240.0 10.31.10.235 p=0 i=1376258 t=3 pr=2 a=26 h=0 m=20/-1/-1/-1/-1
10.31.10.235 255.255.255.255 127.0.0.1 p=0 i=1 t=3 pr=2 a=26 h=0 m=20/-1/-1/-1/-1
10.255.255.255 255.255.255.255 10.31.10.235 p=0 i=1376258 t=3 pr=2 a=26 h=0 m=20/-1/-1/-1/-1
127.0.0.0 255.0.0.0 127.0.0.1 p=0 i=1 t=3 pr=2 a=116753 h=0 m=1/-1/-1/-1/-1
224.0.0.0 240.0.0.0 10.31.10.235 p=0 i=1376258 t=3 pr=2 a=26 h=0 m=20/-1/-1/-1/-1
255.255.255.255 255.255.255.255 10.31.10.235 p=0 i=1376258 t=3 pr=2 a=26 h=0 m=1/-1/-1/-1/-1
255.255.255.255 255.255.255.255 10.31.10.235 p=0 i=1441796 t=3 pr=2 a=4 h=0 m=1/-1/-1/-1/-1
SYSTEM ADAPTER LIST
TAP-Win32 Adapter V8
  Index = 1441796
  GUID = {013AB57F-DFE6-4FD9-B25E-9589E77DA4EB}
  IP = 0.0.0.0/0.0.0.0
  MAC = 00:ff:01:3a:b5:7f
  GATEWAY =
  DHCP SERV = 172.16.0.0
  DHCP LEASE OBTAINED = Tue Jul 07 16:35:20 2009
  DHCP LEASE EXPIRES  = Wed Jul 07 16:35:20 2010
D-Link DFE-538TX 10/100 Adapter
  Index = 1376258
  GUID = {FB6051A1-E970-4F46-BB85-F442A194BA3D}
  IP = 10.31.10.235/255.255.240.0
  MAC = 00:08:a1:65:70:93
  GATEWAY = 10.31.0.254/0.0.0.0
使用Process.Kill()关闭VPN连接后的“openvpn--显示网络”:

我还尝试发送进程
WM_CLOSE/WM_QUIT/WM_ENDMESSAGE
消息,但没有产生任何结果

const int WM_CLOSE = 0x10;
const int WM_QUIT = 0x12;
const int WM_ENDSESSION = 0x0016;

[DllImport("user32.dll")]
public static extern int SendMessage(int hwnd, int msg, int wparam, int lparam);

foreach (var p in Process.GetProcessesByName("openvpn"))
{
    SendMessage(p.Handle.ToInt32(), WM_CLOSE, 0, 0);
    SendMessage(p.Handle.ToInt32(), WM_QUIT, 0, 0);
    SendMessage(p.Handle.ToInt32(), WM_ENDSESSION, 0, 0);
}

有关适当解决方案的更多信息:请参阅中标题为“使用管理界面”的部分中的说明


有关使用的详细信息。

我没有在Windows上尝试过此操作,但您可以使用
信号
命令使用发送
SIGTERM
信号。当然,您需要在配置文件中包含管理界面配置条目

更多信息请参阅


你可能想看看我们做事的方式。它在Windows和Linux下工作,并使用Mono开发。

您正在向进程句柄发送消息-但是,这些消息是窗口消息,这就是为什么它们必须发送到窗口句柄的原因

编辑
由于您已经获得了该流程,您可以尝试以下操作:

foreach (var p in Process.GetProcessesByName("openvpn"))
{
    p.CloseMainWindow();
}


谢谢托尔斯滕。你能告诉我怎样才能拿到窗把手吗?这会使用FindWindow()吗?(我很少使用Win32编程)编辑我的答案以提供更多信息;但它不起作用。在进一步的研究中,我意识到OpenVPN管理接口是一种更适合我尝试实现的方法。谢谢你提供更多的信息,这有助于澄清一个概念。皮埃尔,你的帖子是一个很好的线索。我可以使用管理界面手动终止连接。进一步阅读:相关:我现在有一个类似的任务。这似乎是openvpn服务器的GUI,意味着您希望控制自己的opnvpn服务器。是这样吗?如果是这样,为什么要将参数--config client.ovpn传递给它呢?可以通过检查github上与openvpn(openvpn管理器)相关的伟大项目来实现。以下链接中的代码可以帮助您:
const int WM_CLOSE = 0x10;
const int WM_QUIT = 0x12;
const int WM_ENDSESSION = 0x0016;

[DllImport("user32.dll")]
public static extern int SendMessage(int hwnd, int msg, int wparam, int lparam);

foreach (var p in Process.GetProcessesByName("openvpn"))
{
    SendMessage(p.Handle.ToInt32(), WM_CLOSE, 0, 0);
    SendMessage(p.Handle.ToInt32(), WM_QUIT, 0, 0);
    SendMessage(p.Handle.ToInt32(), WM_ENDSESSION, 0, 0);
}
foreach (var p in Process.GetProcessesByName("openvpn"))
{
    p.CloseMainWindow();
}
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

foreach (var p in Process.GetProcessesByName("openvpn"))
{
    IntPtr hWnd = p.MainWindowHandle;
    // Send message to hWnd (mind SendMessage's changed signature)
}