Chr*_*ard 3 c# citrix ip-address
我目前使用 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;
}
Run Code Online (Sandbox Code Playgroud)
WFAPI.DLL/WFAPI64.DLL 似乎在我有权访问的 Citrix 环境中可用。有没有人有更好的方法来做到这一点?
有谁知道如何确定该进程是否确实在 Citrix 环境中运行?
不,你正在做的事情很好。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 会话中。
其他有趣的事情是,微软提供了 WTS api,它与 WFAPI 非常相似,并且做的事情基本相同。不过,WFAPI 的优点是它可以与 XenDesktop 和 XenApp 配合使用,而 WTS API 只能与 XenApp 配合使用。
问候,多诺万