AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.03.2008, 08:46   #1  
xenikk is offline
xenikk
Axapta Retail User
Аватар для xenikk
Axapta Retail User
 
30 / 10 (1) +
Регистрация: 20.06.2007
Адрес: Moscow
Снова об IP-адресе клиента
Всем привет, AX 3.0 & SQL2000.

Нашел тему, где AndyD показывает как определить ИП клиента
Как получить IP адресс клиента?

И тут возник вопрос - если работать через терминальный сервер с помощью Citrix - то соответственно будет показывать ИП терминального.
Можно ли как то исправить?
__________________
Романтик..
Старый 27.03.2008, 10:01   #2  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Исправить что? Сессия пользователя открыта с терминального сервера, поэтому IP адрес сервера является правильным в данном случае. А вот чтобы выяснить IP адрес компьютера, открывшего сессию, можно из консоли управления Citrix. Придется анализировать подключения и найти нужную сессию. По другому никак. Да и реальный IP можно не получить, если соединение идет через VPN или маршрутизаторы
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 27.03.2008, 18:01   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не знаю,как в цитриксе, а в 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  
xenikk is offline
xenikk
Axapta Retail User
Аватар для xenikk
Axapta Retail User
 
30 / 10 (1) +
Регистрация: 20.06.2007
Адрес: Moscow
ммм...спасибо - попробую)) потом скажу..
__________________
Романтик..
Старый 28.03.2008, 08:59   #5  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Не знаю,как в цитриксе, а в WTS можно сделать так может и под цитриксом будет работать?
Может и будет, но возвратит, насколько я помню, адрес шлюза для внешних коннектов. С внутренними терминальными соединениями проблем вроде не должно быть
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 28.03.2008, 09:25   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Ну, я пробовал из VPN соединения через и-нет и у меня возвращался адрес клиента (т.е. мой)
__________________
Axapta v.3.0 sp5 kr2
Старый 28.03.2008, 12:33   #7  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Citrix, на сколько я знаю, создает переменные окружения с инфой о подключенном клиенте. Давно делал, сейчас не вспомню что именно и как они называются, но что-то я оттуда вытаскивал. Рекомендую посмотеть в эту сторону.
Старый 16.09.2008, 14:10   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от xenikk Посмотреть сообщение
ммм...спасибо - попробую)) потом скажу..
Получилось ?
Старый 16.09.2008, 14:24   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
может и под цитриксом будет работать?
Ура !
Работает !

Только мне лучше было бы знать имя компа. Вы не подскажете как ?
Старый 16.09.2008, 14:33   #10  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А почему не должно получиться?

Я подключился через терминалку к удаленному серверу, на нем поднял еще одну удаленную сессию к терминальному серверу и на нем уже запустил Аксапту в трехзвенке. Все это удавольствие через 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  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Отлично !

То что надо !

Только на вот эту строку
X++:
WTSFreeMemory.call(ptr.dWord(0));
у меня выругалась.

Поставил
X++:
            WTSFreeMemory.arg(ExtTypes::DWord);
            WTSFreeMemory.call(ptr.dWord(0));
- все нормально.
опечатка была ?
Старый 16.09.2008, 14:57   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А, ну да.
Я ее просто вынес перед вызовом if ()
__________________
Axapta v.3.0 sp5 kr2
Старый 16.09.2008, 15:02   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще одно уточнение

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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Нет.
Если вызов функции не прошел, или размер полученного буфера равен нулю, то, собственно, освобождать нечего. Память и так не была размещена
__________________
Axapta v.3.0 sp5 kr2
Старый 17.10.2012, 20:00   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Ну, я пробовал из VPN соединения через и-нет и у меня возвращался адрес клиента (т.е. мой)
Да, все верно.
Вот только если я сижу через роутер, то возвращается локальный адрес подсети.
Например такой
192.168.1.3


А реальный ip адрес, который от провайдера выделен, можно поймать ?
Старый 17.10.2012, 20:36   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Т.е. вы сидите за NAT, а терминалка на другом конце торчит наружу портом?
__________________
Axapta v.3.0 sp5 kr2
Старый 26.06.2020, 13:08   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от leva Посмотреть сообщение
Citrix, на сколько я знаю, создает переменные окружения с инфой о подключенном клиенте. Давно делал, сейчас не вспомню что именно и как они называются, но что-то я оттуда вытаскивал. Рекомендую посмотеть в эту сторону.
Поковырял переменные окружения - ничего нет.

Кто-нибудь может подсказать как из клиента аксапты определить версию клиента цитрикса ?
Старый 26.06.2020, 17:41   #18  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
может быть через 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  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от AlexeyS Посмотреть сообщение
может быть через PowerShell?
Ну если нужно "Из клиента Аксапты" и можно получить при помощи NET, то PowerShell тут лишнее.
Другой вопрос, сработают ли эти вызовы из клиента для обычного пользователя с его набором прав?
PS: это не претензия, а вопрос.
Старый 26.06.2020, 19:53   #20  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Цитата:
Сообщение от Raven Melancholic Посмотреть сообщение
Ну если нужно "Из клиента Аксапты" и можно получить при помощи NET, то PowerShell тут лишнее.
Другой вопрос, сработают ли эти вызовы из клиента для обычного пользователя с его набором прав?
PS: это не претензия, а вопрос.
точно, можно и напрямую
PHP код:
    System.Diagnostics.FileVersionInfo ff;
    ;
    
    
ff System.Diagnostics.FileVersionInfo::GetVersionInfo("c:\\windows\\system32\\mstsc.exe");
    
info(ff.get_FileVersion());
    
info(ff.get_FileDescription()); 
Теги
ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
передача бинарных файлов с клиента на AOS и обратно corvax DAX: Программирование 9 01.04.2014 15:05
сопоставление оплат клиента, переносов сальдо-поле накладная в общем журнале? Aquarius DAX: Функционал 3 28.01.2009 12:51
Malaysia: How to get the PC Name and IP Blog bot DAX Blogs 5 22.01.2008 16:26
Как получить IP адрес клиента ? listener DAX: База знаний и проекты 1 23.12.2005 14:18
AOS и TCP/IP dreshkov DAX: Администрирование 3 17.06.2004 17:53

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:40.