Cisco VPNクライアントが接続されているかどうかをプログラム的に決定します
質問
私は基本的な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炭素または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クライアントが接続されているかどうかを知ることができます。その後、VPN接続に関連付けられているDNSサーバーを取得するために同様のことを行うことができます。結果のDNSサーバーを会社のDNSサーバーと比較して、自分の会社にVPNを使用しているかどうかを判断します。 Klunkyですが、それは機能し、速いです - Pingがタイムアウトを待つことはありません。
Cisco VPNクライアントの最近のバージョンでは、CiscoがAPIを公開したことに注意してください。残念ながら、Microsoft Windows専用です。たぶん、彼らはいつかMac用に1つを生産するでしょう。
実際には、APIを使用せずにいくつかの方法があります(まだ見つけることができません/DL)
最も簡単な方法の1つは、hkey_local_machine software cisco systems vpn client allaccess tunnelesablished(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)
{
}
さらに別の方法は、process.startを使用して「vpnclient stat」のCLI(コマンドライン)を実行し、アプリのstringbuilderに標準出力をリダイレクトし、適切なデータが含まれているかどうかを確認することです。 :
まあ、他のすべてが失敗した場合、「ルート」の出力を解析します。 ciscovpnが使用するルーティングには、そこに明白なマークがあります。