【发布时间】:2010-10-08 00:13:10
【问题描述】:
有没有办法使用 C# 创建服务来检查这个客户端是否打开?
我需要想办法自动化检查。
【问题讨论】:
有没有办法使用 C# 创建服务来检查这个客户端是否打开?
我需要想办法自动化检查。
【问题讨论】:
如果窗口打开(不需要焦点),您可以使用 user32.dll 中的 FindWindow 窗口调用来检查窗口。将下面的代码剪切并放置在正确的位置(用于 dllimport 的使用、定义和实际代码)。这将告诉您窗口是否打开,您可以使用 windows 调用做更多事情。
using System.Runtime.InteropServices;
[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);
IntPtr hWnd = FindWindowByCaption(IntPtr.Zero,"Cisco vpn title here");
if(hWnd.ToInt64() == 0){
Console.WriteLine("ERROR Could not find cisco vpn.");
}else{
Console.WriteLine("Handle found");
}
【讨论】:
这个客户端的问题是它的GUI组件“vpngui.exe”可以被终止(没有在进程列表中列出)但是它建立的网络接口将保持打开状态。
因此,您的服务不能简单地检查名为 vpngui.exe 的进程是否处于活动状态并正在启动,首先您必须检测网络接口是否已启动。您可以通过检查显示隧道是否处于活动状态的注册表项来实现此目的(有关详细信息,请参阅我的其他帖子之一),或通过检查所述接口的存在(再次,请参阅我的其他帖子)。
所以,你需要做的是 1) 检查隧道是否处于活动状态 2) (可选)检查 GUI 是否处于活动状态
然后您可以决定下一步做什么,例如,您可以使用 cisco VPN 客户端 CLI 界面(或任何其他基于 Windows 的选项)禁用网络接口,然后终止 gui。之后,您可以使用 CLI 界面启动 VPN 客户端的新实例,该实例将自动连接到您作为 CLI 命令参数提供的帐户/登录名/pcf。
这里有一些代码:这将检查故事的 GUI 部分是否存在:
Process[] processlist = Process.GetProcesses();
string theProcessThatISeekIs = "";
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName.ToString().ToLower() == NameOfTheProcessYouSeek.ToLower())
{
theProcessThatISeekIs = theprocess.ProcessName.ToString();
break;
}
}
以下代码将返回 CISCO 正在使用的网络接口的名称,如果返回“NotFound”则接口关闭。
string retVal = "";
var nic = NetworkInterface
.GetAllNetworkInterfaces()
.Where(i => i.NetworkInterfaceType != NetworkInterfaceType.Loopback && i.NetworkInterfaceType != NetworkInterfaceType.Tunnel && i.Description == "Cisco Systems VPN Adapter");
var name = nic.FirstOrDefault();
if (name != null)
{
retVal = name.Name.ToString();
}
else
{
retVal = "NotFound";
}
return retVal;
使用这两个 sn-ps,您应该能够很好地构建您的问题的解决方案。
【讨论】: