سؤال

أنا أعمل مع عميل Cisco VPN الأساسي (V.5 على ما أظن). هل هناك على أي حال لتحديد برمجي إذا تم توصيل ملف تعريف جزئي (أو أي ملف تعريف لهذه المسألة)؟

أنا أتطلع إلى الحصول على حالة من العميل نفسه بطريقة ما. لا أريد أن أحاول اختبار بعض IP على الطرف الآخر من VPN لمعرفة ما إذا كنت قد تلقيت رد.

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

المحلول

هناك واجهة برمجة تطبيقات ل Cisco VPN (vpnapi.dll).

نصائح أخرى

أسفل البرنامج النصي VBS للتحقق من حالة الاتصال:

bIsVPNConnected = False

Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration",,48) 

For Each objItem in colItems 
   strConnection = LCase(objItem.Description)

   If(InStr(strConnection, "cisco") > 0) Then
      wscript.echo (strConnection)
      bIsVPNConnected = objItem.IPEnabled
   End If
Next

If(bIsVPNConnected) Then
   WScript.echo  "VPN connected"
Else
   WScript.echo  "Not VPN connected"
End If

لست على دراية بأي واجهات برمجة التطبيقات لعميل Cisco VPN ولكن يمكنك استخدام نظام التشغيل الأساسي.

على Mac OS X ، يمكنك الاستعلام عن إطار تكوين النظام لأنه عندما يقوم عميل Cisco VPN بتوصيله ، يقوم بإنشاء عدد من المفاتيح في دليل التكوين (DNS والأشياء):

$ printf "get State:/Network/Service/com.cisco.VPN" | sudo scutil

يمكن تحقيق ما يعادل البرنامج المذكور أعلاه في الكربون C العادي أو OBJC الكاكاو.

كما كتب "diciu" ، يمكنك الاستعلام عن إطار تكوين النظام. المكافئ البرمجي لأمر Scutil الذي قدمه هو شيء مثل

#import <SystemConfiguration/SystemConfiguration.h>

- (void)printPrimaryService {

    SCDynamicStoreRef dynamicStoreDomainState = SCDynamicStoreCreate(NULL,
                                                                     CFSTR("myApplicationName"),
                                                                     NULL,
                                                                     NULL);
    if (dynamicStoreDomainState) {
        NSString *netIPv4Key = [NSString stringWithFormat:@"%@/%@/%@/%@",
                                kSCDynamicStoreDomainState,
                                kSCCompNetwork,
                                kSCCompGlobal,
                                kSCEntNetIPv4];
        NSMutableDictionary *netIPv4Dictionary = (NSMutableDictionary *) SCDynamicStoreCopyValue(dynamicStoreDomainState, (CFStringRef)netIPv4Key);
        if (netIPv4Dictionary ) {
            NSString *primaryService = [netIPv4Dictionary objectForKey:(NSString *)kSCDynamicStorePropNetPrimaryService];
            if (primaryService) {
                NSLog(@"primary service = \"%@\"\n", primaryService);   /* When the Cisco VPN is active, I get "com.cisco.VPN" here */
            }
            [netIPv4Dictionary release];
        }
        CFRelease(dynamicStoreDomainState);
    }
}

باستخدام ما سبق ، يمكنك معرفة ما إذا كان عميل Cisco VPN متصلاً. يمكنك بعد ذلك القيام بشيء مماثل للحصول على خوادم DNS المرتبطة بتوصيل VPN. أقوم بمقارنة خوادم DNS الناتجة بخادم DNS لشركتي لمعرفة ما إذا كنت VPN'd في شركتي. Klunky ، لكنه يعمل وهو سريع - لا تنتظر ping إلى المهلة.

لاحظ أنه مع الإصدار الأخير من عميل Cisco VPN ، نشرت Cisco واجهة برمجة التطبيقات. لسوء الحظ ، إنه فقط لـ Microsoft Windows. ربما سوف ينتجون واحدة ل Macs في يوم من الأيام.

هناك عدة طرق ، في الواقع ، دون استخدام واجهة برمجة التطبيقات (التي ما زلت لا أستطيع العثور عليها/DL)

واحدة من أسهل الطرق هي التحقق من إعداد السجل الموجود على: hkey_local_machine software cisco systems vpn client allaccess tunnelestables (0 أو 1)

هناك طريقة أخرى هي القيام بذلك وهي اكتشافها باسم واجهة الشبكة التي تنشئها من خلال استخدام ManagementObjectsearcher ، رمز نموذج أدناه:

  ManagementObjectSearcher query = null;
                try { query = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'"); }
                catch (Exception ex)
                {

                }
                // "native code call stack error" 
                try { queryCollection = query.Get(); }
                catch (Exception ex)
                {

                }
                int i = 0;
                try
                {
                    foreach (ManagementObject mo in queryCollection)
                    {
                        MojPopisDostupnih[i] = mo["Description"].ToString();
                        // networksListBox.Items.Add(mo["Description"].ToString());
                        i = i + 1;
                    }
                    for (int j = 0; j <= MojPopisDostupnih.Length - 1; j++)
                    {
                        if (MojPopisDostupnih[j] != null)
                        {
                            if (MojPopisDostupnih[j].IndexOf("Cisco Systems VPN Adapter") != -1)
                            {  }
                            else 
                             {  }
                        }
                    }
                }
                catch (Exception ex)
                {

                }

هناك طريقة أخرى تتمثل في استخدام العملية. بدء تشغيل CLI (سطر الأوامر) من "VPNClient Stat" ، وإعادة توجيه الإخراج القياسي إلى stringbuilder في تطبيقك ثم تحقق من السلسلة سواء كانت تحتوي على بيانات مناسبة - للحصول على مزيد من المعلومات على هذا انظر هنا انظر هنا :

http://www.cisco.com/en/us/docs/security/vpn_client/cisco_vpn_client/vpn_client46/administration/guide/vcach5.html

حسنًا ، إذا فشل كل شيء آخر ، فإن تحليل "الطريق". التوجيه المستخدمة من قبل CISCOVPN لديه علامة telltale هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top