vivek2414 Ответов: 0

Как получить имя удаленного клиента


Я пытаюсь написать библиотеку DLL C++, которая будет работать на сервере VMWare и возвращать имя клиента (терминального пользователя) и IP-адрес.

Я использую WTSQuerySessionInformation для получения имени клиента и IP-адреса. Является
WTSQuerySessionInformation 
правильная функция, или есть другой способ решить эту проблему?

Что я уже пробовал:

Имяклиента:
Проблема с именем клиента заключается в том, что
WTSQuerySessionInformation
возвращает IP - адрес, разделенный дефисом (например, 10-0-156-234) вместо имени клиента. Не могли бы вы помочь мне понять, не сделал ли я здесь что-нибудь не так?

LPTSTR szClientName = NULL;
DWORD dwSize = 0;
String^ cliName = String::Empty;

if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, TSClientName, &szClientName, &dwSize))
{
    cliName = gcnew String(szClientName, 0, dwSize);
}

return cliName;


IP-адрес:
Я попытался обойти эту проблему, выбрав IP-адрес, а затем имя хоста, и мне это тоже удалось, когда я запустил код из сети организации.

Но когда я захожу из дома в VPN компании и пытаюсь сделать то же самое, он дает мне NAT:ted IP, который, очевидно, не сопоставляется с именем компьютера. Есть ли какой - нибудь способ найти "реальный" IP-адрес, подключенный к серверу? Или, если это невозможно, если я могу найти имя компьютера, это прекрасно работает для меня.

LPTSTR ppBuffer = NULL;
DWORD  pBytesReturned = 0;
PWTS_CLIENT_ADDRESS pWTSCA = NULL;

WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientAddress, &ppBuffer, &pBytesReturned);

pWTSCA = (PWTS_CLIENT_ADDRESS)ppBuffer;

String^ addrStr = String::Empty;
for (int i = 2; i < 6; i++)
{
    addrStr += Convert::ToString(pWTSCA->Address[i]);
    if (i != 5)
        addrStr += ".";
}

Richard MacCutchan

Это, скорее всего, означает, что IP - адрес не преобразуется в имя. Вы можете получить более подробную информацию от WTSClientInfo вариант.

vivek2414

Спасибо, Ричард. Я пробовал это, но получаю тот же результат. Вот этот код:

if (WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientInfo, &ppBuffer, &dwSize))
{
    pWtsClientInfo = (PWTSCLIENTW)ppBuffer;
    for (int i = 0; i < 22; i++ )
        clientInfo += Convert::ToString(pWtsClientInfo->ClientName[i]);
}
else
{
    return "Failed";
}

0 Ответов