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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top