2012-03-07 78 views
0

即时通讯目前使用WFAPI确定从C#当在citrix会话中运行时,C#用于确定客户端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; 
} 

Citrix会话的客户端IP地址WFAPI.DLL/WFAPI64.DLL似乎可以在我有机会获得Citrix环境。 有没有人有更好的方法来做到这一点?
还有谁知道如何确定过程是否实际上在思杰环境中运行?

回答

2

没有你在做什么很好。 WFAPI是获取这类信息的最佳途径之一。

了解会话是否是Citrix会话只是您正在做的事情的扩展。如果你看一下WFQuerySessionInformation的WFAPI参考:

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

看WFInfoClass值表。您将看到许多参数的标签为“3”,表明它们仅在ICA会话中被调用时可用。因此,您可以使用其中一种方法调用WFQuerySessionInformation,如果它返回false,则说明您未在Citrix会话中运行。您目前正在执行的IP地址查询是这些属性之一,因此,当您的“ok”变量为false时,您不在Citrix会话中。

其他感兴趣的东西,微软提供的WTS API与WFAPI非常相似,并且大部分都是相同的东西。但是,WFAPI具有可与XenDesktop和XenApp配合使用的优势,而WTS API只能与XenApp配合使用。

Regards, Donovan