27.03.2008, 08:46 | #1 |
Axapta Retail User
|
Снова об IP-адресе клиента
Всем привет, AX 3.0 & SQL2000.
Нашел тему, где AndyD показывает как определить ИП клиента Как получить IP адресс клиента? И тут возник вопрос - если работать через терминальный сервер с помощью Citrix - то соответственно будет показывать ИП терминального. Можно ли как то исправить?
__________________
Романтик.. |
|
27.03.2008, 10:01 | #2 |
Злыдни
|
Исправить что? Сессия пользователя открыта с терминального сервера, поэтому IP адрес сервера является правильным в данном случае. А вот чтобы выяснить IP адрес компьютера, открывшего сессию, можно из консоли управления Citrix. Придется анализировать подключения и найти нужную сессию. По другому никак. Да и реальный IP можно не получить, если соединение идет через VPN или маршрутизаторы
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
27.03.2008, 18:01 | #3 |
Участник
|
Не знаю,как в цитриксе, а в WTS можно сделать так
X++: static void WTSClientAddress(Args _args) { dll dll = new Dll("Wtsapi32.dll"); DLLFunction WTSOpenServer = new DLLFunction(dll, "WTSOpenServerA"); DLLFunction WTSCloseServer = new DLLFunction(dll, "WTSCloseServer"); DLLFunction WTSQuerySessionInformation = new DLLFunction(dll, "WTSQuerySessionInformationA"); DLLFunction WTSFreeMemory = new DLLFunction(dll, "WTSFreeMemory"); int handle; Binary ptr = new Binary(4); Binary buf; Binary size = new Binary(4); int i; #define.WTS_CURRENT_SERVER_HANDLE (0) #define.WTS_CURRENT_SESSION (-1) #define.WTSClientAddress(14) #define.byteOne (4+2+0) #define.byteTwo (4+2+1) #define.byteThree (4+2+2) #define.byteFour (4+2+3) ; WTSOpenServer.arg(ExtTypes::DWord); WTSOpenServer.returns(ExtTypes::DWord); handle = WTSOpenServer.call(#WTS_CURRENT_SERVER_HANDLE); if (handle) { WTSQuerySessionInformation.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::Pointer); WTSQuerySessionInformation.returns(ExtTypes::DWord); if (WTSQuerySessionInformation.call(handle, #WTS_CURRENT_SESSION, #WTSClientAddress, ptr, size) && size.dWord(0) > 0) { buf = new Binary(size.dWord(0)); buf.attach(ptr.dWord(0), size.dWord(0)); if (buf.dWord(0) == 2) { info(strfmt("%1.%2.%3.%4", buf.byte(#byteOne), buf.byte(#byteTwo), buf.byte(#byteThree), buf.byte(#byteFour))); } WTSFreeMemory.arg(ExtTypes::DWord); WTSFreeMemory.call(ptr.dWord(0)); } WTSCloseServer.arg(ExtTypes::DWord); WTSCloseServer.call(handle); } }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Logger (5), aidsua (1). |
27.03.2008, 21:45 | #4 |
Axapta Retail User
|
ммм...спасибо - попробую)) потом скажу..
__________________
Романтик.. |
|
28.03.2008, 08:59 | #5 |
Злыдни
|
Может и будет, но возвратит, насколько я помню, адрес шлюза для внешних коннектов. С внутренними терминальными соединениями проблем вроде не должно быть
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|
28.03.2008, 09:25 | #6 |
Участник
|
Ну, я пробовал из VPN соединения через и-нет и у меня возвращался адрес клиента (т.е. мой)
__________________
Axapta v.3.0 sp5 kr2 |
|
28.03.2008, 12:33 | #7 |
Участник
|
Citrix, на сколько я знаю, создает переменные окружения с инфой о подключенном клиенте. Давно делал, сейчас не вспомню что именно и как они называются, но что-то я оттуда вытаскивал. Рекомендую посмотеть в эту сторону.
|
|
16.09.2008, 14:10 | #8 |
Участник
|
|
|
16.09.2008, 14:24 | #9 |
Участник
|
|
|
16.09.2008, 14:33 | #10 |
Участник
|
А почему не должно получиться?
Я подключился через терминалку к удаленному серверу, на нем поднял еще одну удаленную сессию к терминальному серверу и на нем уже запустил Аксапту в трехзвенке. Все это удавольствие через VPN соединение Это имя и адрес промежуточного сервера. Только, что бы имя клиента получить надо переделать вызовы X++: ... #define.WTSClientName(10) ... if (WTSQuerySessionInformation.call(handle, #WTS_CURRENT_SESSION, #WTSClientName, ptr, size) && size.dWord(0) > 0) { buf = new Binary(size.dWord(0)); buf.attach(ptr.dWord(0), size.dWord(0)); if (buf.string(0)) info(strfmt("%1", buf.string(0))); WTSFreeMemory.call(ptr.dWord(0)); }
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: someOne (1). |
16.09.2008, 14:49 | #11 |
Участник
|
Отлично !
То что надо ! Только на вот эту строку X++: WTSFreeMemory.call(ptr.dWord(0)); Поставил X++: WTSFreeMemory.arg(ExtTypes::DWord); WTSFreeMemory.call(ptr.dWord(0)); опечатка была ? |
|
16.09.2008, 14:57 | #12 |
Участник
|
А, ну да.
Я ее просто вынес перед вызовом if ()
__________________
Axapta v.3.0 sp5 kr2 |
|
16.09.2008, 15:02 | #13 |
Участник
|
Еще одно уточнение
X++: if (WTSQuerySessionInformation.call(handle, #WTS_CURRENT_SESSION, #WTSClientAddress, ptr, size) && size.dWord(0) > 0) { buf = new Binary(size.dWord(0)); buf.attach(ptr.dWord(0), size.dWord(0)); if (buf.dWord(0) == 2) { info(strfmt("%1.%2.%3.%4", buf.byte(#byteOne), buf.byte(#byteTwo), buf.byte(#byteThree), buf.byte(#byteFour))); } WTSFreeMemory.arg(ExtTypes::DWord); WTSFreeMemory.call(ptr.dWord(0)); } X++: WTSFreeMemory.arg(ExtTypes::DWord); WTSFreeMemory.call(ptr.dWord(0)); Иначе оно пропущено. Утечки памяти не будет ? |
|
16.09.2008, 15:54 | #14 |
Участник
|
Нет.
Если вызов функции не прошел, или размер полученного буфера равен нулю, то, собственно, освобождать нечего. Память и так не была размещена
__________________
Axapta v.3.0 sp5 kr2 |
|
17.10.2012, 20:00 | #15 |
Участник
|
Цитата:
Вот только если я сижу через роутер, то возвращается локальный адрес подсети. Например такой 192.168.1.3 А реальный ip адрес, который от провайдера выделен, можно поймать ? |
|
17.10.2012, 20:36 | #16 |
Участник
|
Т.е. вы сидите за NAT, а терминалка на другом конце торчит наружу портом?
__________________
Axapta v.3.0 sp5 kr2 |
|
26.06.2020, 13:08 | #17 |
Участник
|
Цитата:
Кто-нибудь может подсказать как из клиента аксапты определить версию клиента цитрикса ? |
|
26.06.2020, 17:41 | #18 |
Участник
|
может быть через PowerShell?
[System.Diagnostics.FileVersionInfo]::GetVersionInfo("c:\\windows\\system32\\mstsc.exe").FileVersion [System.Diagnostics.FileVersionInfo]::GetVersionInfo("C:\Program Files (x86)\Citrix\ICA Client\SelfServicePlugin\SelfService.exe").FileVersion Последний раз редактировалось AlexeyS; 26.06.2020 в 17:50. |
|
26.06.2020, 18:01 | #19 |
Участник
|
|
|
26.06.2020, 19:53 | #20 |
Участник
|
Цитата:
PHP код:
|
|