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

C# 检测由kiosk应用程序启动的Citrix会话的终止,c#,citrix,kiosk,C#,Citrix,Kiosk,我正在开发一个kiosk应用程序,它为用户提供Citrix连接的选择 其思想是,用户选择kiosk应用程序提供的连接,然后kiosk启动器通过运行类似以下命令来启动所选连接: C:\Program Files\Citrix\ICA Client\wfica32.exe \\server\path\to\icaFile.ica 我希望用户留在Citrix会话中—不是出于任何安全原因,只是为了让它成为一种良好的用户体验,让用户能够进入所选会话并最终注销。因此,我启动了一个全屏会话,在用户注销之前一

我正在开发一个kiosk应用程序,它为用户提供Citrix连接的选择

其思想是,用户选择kiosk应用程序提供的连接,然后kiosk启动器通过运行类似以下命令来启动所选连接:

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 Ica客户端文件夹中的WFICALib.dll,创建ICAClientClass对象,订阅并调用其断开连接事件,以及调用LoadIcaFile方法来启动连接

在断开连接方法的处理程序中,需要添加代码来启动注销并终止当前应用程序

一个示例实现:

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

在C应用程序中,您可以在Citrix Ica客户端文件夹中引用WFICALib.dll,创建ICAClientClass对象,订阅并调用其断开连接事件,以及调用LoadIcaFile方法来启动连接

在断开连接方法的处理程序中,需要添加代码来启动注销并终止当前应用程序

一个示例实现:

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

非常感谢你。我将计划看一下这个组件的文档,并尝试一下,希望在接下来的几周,当我回到那个项目时。非常感谢!文档有点稀疏,但我正在开发一个相关的应用程序,我很乐意分享我能分享的任何东西,并更新答案或相关问题。这才是真正让我走上正确道路的原因:嘿,谢谢-非常感谢后续工作。我相信链接博客文章中的示例代码会有所帮助。最后回到这里。我得到了一个原型,并根据对我有用的内容在你的答案中添加了一些示例代码。我知道你可以在对象上设置很多属性——我的代码主要基于我在一个ICA文件中找到的属性值。不幸的是,我还不能让代码使用LoadIcaFile方法——不知道为什么。请随意编辑我的样品…非常感谢。我将计划看一下这个组件的文档,并尝试一下,希望在接下来的几周,当我回到那个项目时。非常感谢!文档有点稀疏,但我正在开发一个相关的应用程序,我很乐意分享我能分享的任何东西,并更新答案或相关问题。这才是真正让我走上正确道路的原因:嘿,谢谢-非常感谢后续工作。我相信链接博客文章中的示例代码会有所帮助。最后回到这里。我得到了一个原型,并根据对我有用的内容在你的答案中添加了一些示例代码。我知道你可以在对象上设置很多属性——我的代码主要基于我在一个ICA文件中找到的属性值。不幸的是,我还不能让代码使用LoadIcaFile方法——不知道为什么。请随意编辑我的样品。。。