Определение типа тонкого клиента в терминальной сессии

Темы, которые не попадают в остальные категории.
Ответить
Rushmore
Сообщения: 358
Зарегистрирован: Пн фев 11, 2013 9:36 pm

Определение типа тонкого клиента в терминальной сессии

Сообщение Rushmore »

Можно ли как-то узнать изнутри сессии (скриптом? exe?) с какого клиента подключился юзер?
Интересует в частности, это WtWare, или обычный mstsc, или может вообще 2x какой-нибудь?
aka
Разработчик
Разработчик
Сообщения: 11831
Зарегистрирован: Ср окт 01, 2003 12:06 am
Откуда: Роcсия, Тольятти
Контактная информация:

Re: А есть ли способ узнать...

Сообщение aka »

Не знаю, как определить из скрипта. Нет общего способа определить тип клиента. Через вызовы винапи докуентированно можно только эту информацию вытащить:
Untitled.png
Untitled.png (24.64 КБ) 7494 просмотра
Если все компьтеры твои, то в Client Name можно тип клиента зашить. В втвари хостнейм задается через DHCP или параметром clienthostname, в виндовсе это имя компьютера.

Костыль именно для втвари - вызовом винапи WTSVirtualChannelOpen попытаться открыть виртуальный канал "WTVC". Если канал откроется, то это втварь.
Rushmore
Сообщения: 358
Зарегистрирован: Пн фев 11, 2013 9:36 pm

Re: А есть ли способ узнать...

Сообщение Rushmore »

aka писал(а):вызовом винапи WTSVirtualChannelOpen попытаться открыть виртуальный канал "WTVC". Если канал откроется, то это втварь.
Спасибо, попробую. Для начала уже неплохо.
aka
Разработчик
Разработчик
Сообщения: 11831
Зарегистрирован: Ср окт 01, 2003 12:06 am
Откуда: Роcсия, Тольятти
Контактная информация:

Re: А есть ли способ узнать...

Сообщение aka »

Кусок кода, который у нас сейчас канал открывает и компилируется в visual studio express 2008:

===

#define WTS_CHANNEL_OPTION_DYNAMIC 0x00000001L
#define WTS_CHANNEL_OPTION_DYNAMIC_NO_COMPRESS 0x00000008L

typedef HANDLE (__stdcall *type_WTSVirtualChannelOpenEx) (
_In_ DWORD SessionId,
_In_ LPSTR pVirtualName,
_In_ DWORD flags
);

.....

HMODULE _wtsapi32_dll = ::LoadLibrary (L"wtsapi32.dll");
если (_wtsapi32_dll == NULL) все пропало

type_WTSVirtualChannelOpenEx l_WTSVirtualChannelOpenEx = (type_WTSVirtualChannelOpenEx) ::GetProcAddress (_wtsapi32_dll, "WTSVirtualChannelOpenEx");

HANDLE VC;
if (l_WTSVirtualChannelOpenEx != NULL)
{
// На 2012 сервере WTSVirtualChannelOpen зависает секунд на десять, если пытается открыть
// несуществующий статический канал. Поэтому я, если возможно, пользуюсь динамическим
// каналом. На 2003 сервере динамических каналов не было, но зато на нем статические каналы
// открываются без этих тупых тормозов.

VC = l_WTSVirtualChannelOpenEx (WTS_CURRENT_SESSION, "WTDVC", WTS_CHANNEL_OPTION_DYNAMIC | WTS_CHANNEL_OPTION_DYNAMIC_NO_COMPRESS);
}
else
{
VC = WTSVirtualChannelOpen (WTS_CURRENT_SERVER, WTS_CURRENT_SESSION, "WTVC");
}

if (VC != NULL)
{
// ура, мы под втварью.
}
Ответить

Вернуться в «Остальное»