Вопрос

Есть ли способ создать службу с использованием C#, способную проверить, открыт ли этот клиент?

Мне нужно найти способ автоматизировать эту проверку.

Это было полезно?

Решение

Если окно открыто (не обязательно должно быть в фокусе). Вы можете использовать вызов окна FindWindow из user32.dll, чтобы проверить окно.Разрежьте приведенный ниже код и поместите его в нужные места (для использования, определения 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");
}

Другие советы

Проблема с этим клиентом заключается в том, что его компонент графического интерфейса «vpngui.exe» можно завершить (не указан в списке процессов), но установленный им сетевой интерфейс останется открытым.

Следовательно, ваша служба не может просто проверить, активен ли и работает ли процесс с именем vpngui.exe. Сначала вам необходимо определить, работает ли сетевой интерфейс.Вы можете добиться этого, либо проверив запись в реестре, которая показывает, активен ли туннель (подробности см. В одном из других моих сообщений), либо проверив наличие указанного интерфейса (опять же, см. Другой мой пост).

Итак, вам нужно сделать, чтобы 1) проверить, активен ли туннель 2) (необязательно) Проверьте, активен ли графический интерфейс

Затем вы можете решить, что делать дальше, например, вы можете отключить сетевой интерфейс, используя интерфейс CLI VPN-клиентов Cisco (или любой другой вариант на базе Windows), а затем отключить графический интерфейс.После этого вы можете использовать интерфейс CLI для запуска нового экземпляра VPN-клиента, который будет автоматически подключаться к учетной записи/логину/pcf, которую вы указываете в качестве аргумента команды CLI.

Вот немного кода:это проверит, жива ли часть истории с графическим интерфейсом:

 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;

С помощью этих двух фрагментов вы сможете найти решение своей проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top