|  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 код: 
			 | 
|  |