OpenVPN 연결을 프로그래밍 방식으로 분리하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1091861

  •  11-09-2019
  •  | 
  •  

문제

Windows에서 OpenVPN 연결을 시작하고 중지하기 위해 WinForms 응용 프로그램을 작성하고 있습니다. Windows 용 OpenVPN GUI와 동일한 기능을 달성하려고합니다.http://openvpn.se/)는 내 자신의 .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 ()를 사용해 보았다.

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

이것은 프로세스를 죽이지만 초기 라우팅 상태를 복원하지는 않습니다. 효과적으로 LAN 카드를 수동으로 비활성화/활성화 할 때까지 네트워크에 액세스 할 수 없습니다.

VPN 연결이 설정되기 전에 'OpenVPN-SHOW-NET'의 출력 :

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'VPN 연결이 Process.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 =

또한 프로세스를 보내려고했습니다 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);
}

적절한 솔루션에 대한 추가 정보 : 제목의 지침을 참조하십시오 관리 인터페이스 사용 안에 실행되는 OpenVPN 프로세스 제어.

사용에 대한 자세한 정보 C#의 텔넷.

도움이 되었습니까?

해결책

나는 이것을 창에서 시도하지 않았지만 당신은 OpenVPN 관리 인터페이스 보내기 위해 SIGTERM 신호 signal 명령. Configuration 파일에 관리 인터페이스 구성 항목을 포함해야합니다.

더 많은 정보 OpenVPN Man Page

당신은 길을보고 싶을 수도 있습니다 OpenVPN-Admin 일을하고 있습니다. Windows와 Linux에서 작동하고 Mono로 개발되었습니다.

다른 팁

프로세스 핸들에 메시지를 보내고 있습니다. 그러나 이것들은 창문 메시지, 그것이 그들이 창문 핸들.

편집하다
이미 프로세스를 얻었으므로 다음을 시도 할 수 있습니다.

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)
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top