题
我正在使用基本的 Cisco VPN 客户端(我相信是 v.5)。无论如何,是否可以以编程方式确定特定配置文件(或与此相关的任何配置文件)是否已连接?
我希望以某种方式从客户本身获得状态。我不想尝试 ping VPN 另一端的某个 IP 才能查看是否得到响应。
解决方案
有一个API 思科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,但是您可以使用基础操作系统。
在Mac OS X上,您可以查询系统配置框架,因为当Cisco VPN客户端连接时,它会在配置目录(DNS和QUATCE)中创建许多键:
$ 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服务器进行比较,以判断我是否加入了公司。 klunky,但是它可以工作,而且很快 - 不等待ping超时。
请注意,借助Cisco VPN客户端的最新版本,思科发布了API。不幸的是,它仅适用于Microsoft Windows。也许有一天他们会为Mac生产一个。
实际上,有几种方法可以不使用 API(我仍然找不到/DL)
最简单的方法之一是检查以下位置的注册表设置:HKEY_LOCAL_MACHINE\SOFTWARE\Cisco Systems\VPN Client\AllAccess unnelEstablished(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(命令行),将标准输出重定向到应用程序中的字符串生成器,然后检查字符串是否包含适当的数据 - 有关详细信息,请参阅此处:
好吧,如果所有其他方法都失败了,请解析“路由”的输出。 Ciscovpn使用的路由在那里有一个明显的标记。