سؤال

أقوم بإنشاء تطبيق WinForms لبدء ووقف اتصال OpenVPN على Windows. أحاول تحقيق نفس الوظيفة مثل OpenVPN واجهة المستخدم الرسومية لنظام التشغيل Windows (http://openvpn.se/) يوفر ولكن باستخدام واجهة المستخدم الخاصة بي.

أنا بدأت الاتصال باستخدام النهج التالي:

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 يدويا.

إخراج "OpenVPN --Show-Net" قبل إنشاء اتصال VPN:

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 - Wshow-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.

مزيد من المعلومات حول استخدام telnet من C #.

هل كانت مفيدة؟

المحلول

لم أحاول ذلك على Windows ولكن يمكنك استخدام OpenVPN إدارة الإدارة لإرسال أ SIGTERM إشارة مع signal أمر. ستحتاج إلى تضمين إدخالات تكوين واجهة الإدارة في ملف التكوين الخاص بك بالطبع.

مزيد من المعلومات في OpenVPN MAN PAGE.

قد ترغب في النظر في الطريق OpenVPN-Admin. يفعل الأشياء. تعمل تحت ويندوز ونظام التشغيل Linux وتطويرها مع أحادي.

نصائح أخرى

أنت ترسل رسائل إلى مقبض العملية - هذه، ومع ذلك، نافذة او شباك الرسائل، ولهذا السبب يجب إرسالها إلى نافذة او شباك مقبض.

تعديل
كما حصلت على العملية بالفعل، قد تحاول ما يلي:

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