Pergunta
Existe uma maneira de criar um serviço utilizando C # capazes de verificar se este cliente está aberto?
Eu preciso trabalhar uma maneira de automatizar essa verificação.
Solução
Se a janela estiver aberta (não precisa estar em foco) Você poderia usar a chamada janela FindWindow do user32.dll para verificar a janela. Corta-se o código abaixo e lugar nos locais correctos (para o uso, definem do DllImport, e o código real). Isto irá dizer-lhe se a janela está aberta, há muito mais que você pode fazer com as chamadas janelas.
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");
}
Outras dicas
O problema com este cliente é que a sua componente GUI "vpngui.exe" pode ser terminado (não listados na lista de processos), mas a interface de rede que ele havia estabelecido permanecerá aberta.
Por isso, o serviço não pode simplesmente verificar se um processo chamado vpngui.exe está vivo e chutando, primeiro você tem que detectar se a interface de rede é para cima. Você pode conseguir isso por qualquer verificação para uma entrada de registro que revela se o túnel está ativo (consulte um dos meus outros posts para detalhes), ou verificando a existência da dita interface (novamente, ver o meu outro post).
Então, o que você precisa fazer é 1) verificar se o túnel é activa 2) (opcional) Verificar se GUI está ativo
Você pode então decidir o que fazer a seguir, por exemplo, você pode desativar a interface de rede usando VPN clientes CLI Interface (ou quaisquer outras janelas opção com base) cisco e, em seguida, matar o gui. Depois disso, você pode usar a interface CLI para iniciar uma nova instância do cliente VPN que vai ligar automaticamente para a conta / login / PCF que você fornece como um argumento para o comando CLI.
Aqui está um pouco de código: isso irá verificar para ver se a parte GUI da história está viva:
Process[] processlist = Process.GetProcesses();
string theProcessThatISeekIs = "";
foreach (Process theprocess in processlist)
{
if (theprocess.ProcessName.ToString().ToLower() == NameOfTheProcessYouSeek.ToLower())
{
theProcessThatISeekIs = theprocess.ProcessName.ToString();
break;
}
}
O código a seguir irá retornar o nome da interface de rede que CISCO está usando, se ele retorna "NotFound", em seguida, a interface é desligado.
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;
Com esses dois trechos você deve estar bem capaz de construir uma solução para o seu problema.