检测kiosk应用程序启动的Citrix会话的终止

本文关键字:Citrix 终止 会话 启动 kiosk 应用程序 检测 | 更新日期: 2023-09-27 18:29:29

我正在开发一个kiosk应用程序,该应用程序为用户提供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的初始启动会立即退出。但是,如果发生了这种情况,则不清楚该怎么办,因为一旦Citrix会话启动,wfica32.exe似乎仍在运行。

我正在寻找一种可靠的方法来检测以这种方式启动的Citrix会话何时终止。

检测kiosk应用程序启动的Citrix会话的终止

在C#应用程序中,您可以引用WFICALib.dll(在Citrix Ica Client文件夹中),创建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");
}