Winforms 如何以编程方式断开OpenVPN连接?
我正在创建一个WinForms应用程序来启动和停止Windows上的OpenVPN连接。我正在尝试实现与OpenVPN GUI for Windows()提供的功能相同的功能,但使用的是我自己的基于.NET的UI 我正在使用以下方法启动连接: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
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)
}