Skip to main content
 首页 » 编程设计

c#之检测由 kiosk 应用程序启动的 Citrix session 终止

2024年02月23日71oomusou

我正在开发一个信息亭应用程序,它可以让用户选择 Citrix 连接。

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

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

我希望用户留在 Citrix session 中 - 不是出于任何安全原因,只是为了让用户在进入所选 session 并最终注销时获得良好的体验。因此,我启动了一个全屏 session ,一切正常,直到用户注销。

当用户注销 Citrix session 时,我还想在客户端计算机上启动注销。我已尝试使用类似于以下的代码以明显的方式执行此操作:

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 session 几乎立即终止,因为本地计算机立即注销。我最好的猜测是 wfica32.exe 的初始启动在启动一个新进程以实际处理 session 后立即退出。但是,如果这是正在发生的事情,那么该怎么做并不明显,因为一旦 Citrix session 启动,wfica32.exe 似乎仍在运行。

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

请您参考如下方法:

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