Cisco VPN 클라이언트가 연결되어 있는지 프로그래밍 방식으로 확인

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

  •  21-08-2019
  •  | 
  •  

문제

저는 기본 Cisco VPN 클라이언트(v.5라고 생각합니다)로 작업하고 있습니다.특정 프로필(또는 해당 문제에 대한 프로필)이 연결되어 있는지 프로그래밍 방식으로 확인할 수 있습니까?

어떻게든 클라이언트 자체로부터 상태를 얻으려고 합니다.응답을 받았는지 확인하기 위해 VPN의 다른 쪽 끝에서 일부 IP를 ping하려고 시도하고 싶지 않습니다.

도움이 되었습니까?

해결책

API가 있습니다 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 클라이언트용 API는 모르지만 기본 OS를 사용할 수 있습니다.

Mac OS X에서는 Cisco VPN 클라이언트가 연결되면 구성 디렉터리(DNS 등)에 여러 키가 생성되므로 시스템 구성 프레임워크에 쿼리할 수 있습니다.

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

위와 동일한 프로그래밍 방식은 일반 C Carbon 또는 ObjC Cocoa에서 달성할 수 있습니다.

"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 클라이언트가 연결되어 있는지 확인할 수 있습니다.그런 다음 VPN 연결과 연결된 DNS 서버를 가져오는 것과 유사한 작업을 수행할 수 있습니다.결과 DNS 서버를 회사의 DNS 서버와 비교하여 회사에 VPN이 연결되어 있는지 확인합니다.Klunky이지만 작동하고 빠릅니다. 핑이 시간 초과될 때까지 기다리지 않아도 됩니다.

Cisco VPN 클라이언트의 최신 버전에서 Cisco는 API를 게시했습니다.불행히도 Microsoft Windows에만 해당됩니다.어쩌면 언젠가는 Mac용 제품을 생산할 수도 있습니다.

실제로 API를 사용하지 않고 몇 가지 방법이 있습니다 (여전히 찾을 수 없습니다/DL).

가장 쉬운 방법 중 하나는 다음과 같은 레지스트리 설정을 확인하는 것입니다.

또 다른 방법은 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)
                {

                }

또 다른 방법은 Process.Start를 사용하여 "VPNCLIENT STAT"의 CLI (명령 줄)를 실행하고, 표준 출력을 앱의 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