【问题标题】:Detect termination of Citrix session launched by kiosk application检测由 kiosk 应用程序启动的 Citrix 会话终止
【发布时间】:2012-03-28 16:06:53
【问题描述】:

我正在开发一个 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 会话何时终止。

【问题讨论】:

    标签: c# citrix kiosk


    【解决方案1】:

    在 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");
    }
    

    【讨论】:

    • 非常感谢。我将计划查看此组件的文档并尝试一下,希望在接下来的几周内我回到那个项目。非常感谢!
    • 文档有点少,但我正在开发一个相关的应用程序,我很乐意分享我能分享的任何内容并更新答案或相关问题。
    • 这才是真正让我走上正确道路的原因:blogs.citrix.com/2010/03/02/…
    • 嘿,谢谢 - 非常感谢您的跟进。我相信链接的博客文章中的示例代码会有所帮助。
    • 终于回到这个话题。我得到了一个原型,并根据对我有用的方法在您的答案中添加了一些示例代码。我知道您可以在对象上设置很多属性 - 我的代码主要基于我在有效的 ICA 文件中找到的属性值。不幸的是,我还不能让代码与 LoadIcaFile() 方法一起使用——不知道为什么。请随时编辑我的示例...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多