C # используется для определения IP-адреса клиента при запуске в сеансе citrix? - PullRequest
1 голос
/ 07 марта 2012

В настоящее время я использую WFAPI для определения IP-адреса клиента сеанса citrix из C #

[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 или нет?

1 Ответ

3 голосов
/ 17 мая 2012

Нет, то, что вы делаете, в порядке. WFAPI - один из лучших способов получить такую ​​информацию.

Знание того, является ли сеанс сеансом Citrix, является лишь продолжением того, что вы делаете. Если вы посмотрите на ссылку WFAPI для WFQuerySessionInformation:

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

ОБНОВЛЕННАЯ ССЫЛКА: WinFrame API SDK

Посмотрите на таблицу значений WFInfoClass. Вы увидите, что ряд параметров имеет тег «3», указывающий, что они доступны только при вызове внутри сеанса ICA. Таким образом, вы можете вызвать WFQuerySessionInformation с одним из них, и если он возвращает false, вы не работаете в сеансе Citrix. Запрос IP-адреса, который вы делаете в данный момент, является одним из этих свойств, поэтому, когда ваша переменная "ok" имеет значение false, вы не участвуете в сеансе Citrix.

Что-то еще представляет интерес, Microsoft предоставляет API-интерфейсы WTS, которые очень похожи на WFAPI и делают в основном то же самое. Однако преимущество WFAPI заключается в том, что он будет работать с XenDesktop и XenApp, тогда как API-интерфейсы WTS будут работать только с XenApp.

С уважением, Донован

...