Wie kann ich programmgesteuert trennen Sie eine OpenVPN-Verbindung?
Bin ich erstellen eine WinForms-Anwendung starten und beenden einer OpenVPN-Verbindung unter Windows. Ich versuche zu erreichen die gleiche Funktionalität wie OpenVPN GUI für Windows (http://openvpn.se/) zur Verfügung stellt, aber mit meinem eigenen .NET-basierte Benutzeroberfläche.
Beginne ich die Verbindung mit dem folgenden Ansatz:
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();
Diese aufruft openvpn.exe und die Verbindung erfolgreich hergestellt wird.
Ich bin jedoch nicht in der Lage, um zu bestimmen, einen Weg, um die Verbindung zu beenden, sobald diese etabliert ist. Ich habe versucht mit Process.Kill()
foreach (var p in Process.GetProcessesByName("openvpn"))
{
p.Kill();
}
Dieser tötet den Prozess, aber nicht die Wiederherstellung des ursprünglichen routing-Status. Effektiv, ich kann nicht auf das Netzwerk zugreifen, bis ich manuell aktivieren/deaktivieren meiner LAN-Karte.
Ausgabe von "openvpn --show-net', bevor Sie die VPN-Verbindung hergestellt ist:
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
'openvpn --show-net', nachdem die VPN-Verbindung wird geschlossen mit Prozess.Kill():
SYSTEM ROUTING TABLE
10.31.0.0 255.255.240.0 10.31.10.235 p=0 i=1376258 t=3 pr=2 a=106 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=106 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=106 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=116833 h=0 m=1/-1/-1/-1/-1
208.94.64.10 255.255.255.255 10.31.0.254 p=0 i=1376258 t=4 pr=3 a=21 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=106 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=106 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=84 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 17:02:30 2009
DHCP LEASE EXPIRES = Wed Jul 07 17:02:30 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 =
Ich habe auch versucht, das senden der Prozess WM_CLOSE /WM_QUIT /WM_ENDMESSAGE
Nachrichten, aber diese nicht zu einem Ergebnis.
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);
}
Weitere Infos auf die entsprechende Lösung: Siehe die Anweisungen in Abschnitt Mithilfe der management-Schnittstelle in Die Steuerung einer Laufenden OpenVPN Prozess.
Mehr info über die Verwendung Telnet von C#.
- Verwandte: C# - Close-OpenVPN-Sauber
- Ich habe eine ähnliche Aufgabe jetzt. Es scheint, das ist eine GUI für openvpn server, das heißt, Sie wollen, Steuern Sie Ihre eigenen opnvpn server. Ist das richtig? Wenn dem so ist, warum geben Sie das argument -- config client.ovpn zu?
- Sie können es tun, indem Sie einen großen Projekt auf github, dass die zugehörige openvpn(openvpn-manager). der code im folgenden link kann dir helfen: github.com/Searching/openvpn-manager/blob/master/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe nicht versucht, diese auf Windows, aber Sie können die OpenVPN-Management-Schnittstelle zu senden
SIGTERM
signal mit dersignal
Befehl. Sie müssen die management-Schnittstelle-Konfigurations-Einträge in der Konfigurationsdatei natürlich.Mehr Informationen in der OpenVPN Mann Seite
Möchten Sie vielleicht, um zu schauen, wie OpenVPN-admin ist, Dinge zu tun. Es funktioniert unter Windows und Linux entwickelt und mit Mono.
Du bist das senden von Nachrichten, um den Prozess zu behandeln - diese sind jedoch Fenster Nachrichten, das ist, warum Sie gesendet werden müssen, um eine Fenster Griff.
BEARBEITEN
Wie haben Sie den Prozess schon, könnten Sie Folgendes versuchen:
oder