当在citrix会话中运行时,用于确定客户端ip地址的C#

本文关键字:客户端 ip 地址 用于 会话 citrix 运行时 当在 | 更新日期: 2023-09-27 18:26:58

Im当前使用WFAPI从C#确定citrix会话的客户端ip地址

[StructLayout(LayoutKind.Sequential)]
internal struct WF_CLIENT_ADDRESS {
    public int AddressFamily;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public byte[] Address;
}
[DllImport("WFAPI.dll", EntryPoint = "WFFreeMemory")]
private static extern void WFFreeMemory(IntPtr pMemory);
[DllImport("WFAPI.dll", EntryPoint = "WFQuerySessionInformationA")]
private static extern bool WFQuerySessionInformation(IntPtr hServer, 
    int iSessionId, int infotype, out IntPtr ppBuffer, out int pBytesReturned);
const int ClientAddress = 14;
const int CurrentSession = -1;
static readonly IntPtr CurrentServer = IntPtr.Zero;
public static string GetClientAddress() {
    IntPtr addr;
    int returned;
    bool ok = WFQuerySessionInformation(CurrentServer, CurrentSession, 
        ClientAddress, out addr, out returned);
    if (!ok) return null;
    WF_CLIENT_ADDRESS obj = new WF_CLIENT_ADDRESS();
    obj = (WF_CLIENT_ADDRESS)Marshal.PtrToStructure(addr, obj.GetType());
    string clientAdress = 
        obj.Address[2] + "." + obj.Address[3] + "." + 
        obj.Address[4] + "." + obj.Address[5];
    WFFreeMemory(addr);
    return clientAdress;
}

WFAPI.DLL/WFAPI64.DLL似乎在我可以访问的citrix环境中可用。有人有更好的方法吗
有人知道如何确定流程是否真的在citrix环境中运行吗?

当在citrix会话中运行时,用于确定客户端ip地址的C#

不,你所做的一切都很好。WFAPI是获取此类信息的最佳方式之一。

知道会话是否是Citrix会话只是您所做工作的扩展。如果您查看WFQuerySessionInformation的WFAPI参考:

http://community.citrix.com/download/attachments/37388956/WFAPI_SDK_Documentation.pdf

更新链接:WinFrame API SDK

查看WFInfoClass值表。您将看到许多参数具有标记"3",表示它们仅在ICA会话内部调用时可用。因此,您可以使用其中一个调用WFQuerySessionInformation,如果它返回false,则表示您没有在Citrix会话中运行。您当前正在执行的IP地址查询就是其中一个属性,因此当您的"ok"变量为false时,您不在Citrix会话中。

另一个有趣的地方是,微软提供了与WFAPI非常相似的WTS api,它们的作用基本相同。然而,WFAPI的优点是它可以与XenDesktop和XenApp一起使用,而WTS API只能与XenApp配合使用。

谨致问候,Donovan