Обнаружение завершения сеанса Citrix, запущенного приложением киоска - PullRequest
1 голос
/ 28 марта 2012

Я работаю над приложением киоска, которое предоставляет пользователю выбор подключений Citrix.

Идея состоит в том, что пользователь выбирает соединение, представленное приложением киоска, а затем средство запуска киоска инициирует выбранное соединение, выполнив команду, подобную этой:

C:\Program Files\Citrix\ICA Client\wfica32.exe \\server\path\to\icaFile.ica

Я хочу, чтобы пользователь оставался в сеансе Citrix - не по какой-либо причине безопасности, просто для того, чтобы он был удобен для пользователей, чтобы они могли войти в выбранный сеанс и в конечном итоге выйти из системы. Поэтому я запускаю полноэкранный сеанс и все в порядке, пока пользователь не выйдет из системы.

Когда пользователь выходит из сеанса Citrix, я также хочу инициировать выход из системы на клиентском компьютере. Я попытался сделать это очевидным способом, используя код, подобный следующему:

Process citrixProcess = new Process();
citrixProcess.StartInfo = new ProcessStartInfo();
citrixProcess.StartInfo.FileName = "C:\Program Files\Citrix\ICA Client\wfica32.exe";
citrixProcess.StartInfo.Arguments = "\\server\path\to\icaFile.ica";
citrixProcess.Start();
citrixProcess.WaitForExit();
//
// Followed by code to initiate logoff from the local computer
//

Но вместо ожидания объекта Process код продолжается прямо до следующего раздела, который инициирует выход из системы. В результате сеанс Citrix завершается практически сразу, поскольку выход из локального компьютера происходит немедленно. Мое лучшее предположение состоит в том, что первоначальный запуск wfica32.exe завершается сразу после запуска нового процесса, чтобы фактически обработать сеанс. Но если это именно то, что происходит, то не очевидно, что с этим делать, поскольку wfica32.exe по-прежнему работает после запуска сеанса Citrix.

Я ищу надежный способ определить, когда сеанс Citrix, запущенный таким образом, завершился.

1 Ответ

4 голосов
/ 22 мая 2012

В приложении C # вы можете ссылаться на WFICALib.dll (в вашей папке клиента Citrix Ica), создавать объект ICAClientClass, подписываться на событие и вызывать его событие Disconnect и вызывать метод LoadIcaFile для запуска вашего подключения.

В вашем обработчике для метода Disconnect вам нужно будет добавить код, чтобы инициировать выход из системы и завершить текущее приложение.

Пример реализации:

public static void Connect()
{
    // Configure the connection.
    ICAClientClass ica = new ICAClientClass();
    ica.Application = string.Empty;
    ica.InitialProgram = "#Name of Citrix application to launch";
    ica.Launch = true;
    ica.Domain = Environment.UserDomainName;
    ica.DesiredColor = ICAColorDepth.Color24Bit;
    ica.OutputMode = OutputMode.OutputModeNormal;
    ica.MaximizeWindow();
    ica.ClientAudio = true;
    ica.AudioBandwidthLimit = ICASoundQuality.SoundQualityMedium;
    ica.Compress = true;
    ica.ScreenPercent = 100;
    ica.TransportDriver = "TCP/IP";
    ica.WinstationDriver = "ICA 3.0";
    ica.SSLEnable = false;
    ica.SSLCiphers = "ALL";
    ica.SSLProxyHost = "*:443";
    ica.EncryptionLevelSession = "EncRC5-128";

    // Citrix server name or IP
    ica.Address = "x.x.x.x"; 

    // Setup handler for disconnect event.
    ica.OnDisconnect += ica_OnDisconnect;

    // Initiate the connection.
    ica.Connect();
}

private static void ica_OnDisconnect()
{
    Console.WriteLine("ica_OnDisconnect");
}
...