Захват IP-адреса клиента RDP в поставщике учетных данных

У нас есть собственный провайдер учетных данных, работающий на Windows Server 2012, который вызывает API нашего сервера аутентификации перед тем, как позволить пользователю войти в систему. Мы также ведем журналы нашего поставщика учетных данных.

Теперь нам нужно захватить и зарегистрировать IP-адрес пользователя, который входит на сервер с помощью подключения к удаленному рабочему столу. Можно ли получить IP-адрес изнутри поставщика учетных данных? Содержит ли эта информация сериализованный пакет учетных данных, отправленный клиентом RDP на сервер? Если да, как получить к нему доступ в поставщике учетных данных?


person js.hrt    schedule 03.04.2020    source источник
comment
Пытался повторить ваш случай - SetSerialisation вообще не звонили ..   -  person Alexander    schedule 09.04.2020
comment
Единственный случай, когда мой провайдер вызывается SetSerialization, - это вход на сайт IE.   -  person Alexander    schedule 09.04.2020
comment
@Alexander Спасибо .. я не понял, что вы говорите о входе на сайт IE? Какой это вариант использования?   -  person js.hrt    schedule 09.04.2020
comment
Я просто хочу сказать, что мой Credential Provider вызывается для SetSerialization только тогда, когда Internet Explorer получает учетные данные для перехода на защищенный сайт. Ни в одном случае с удаленным входом через RDP не вызывается вызов SetSerialization на обеих сторонах моего соединения.   -  person Alexander    schedule 10.04.2020


Ответы (1)


Вы должны получить сеанс удаленного рабочего стола и прочитать информацию:

int GetRDPClientIP(wstring& ip)
{
    if (DEVELOP_MODE) PrintLn(L"Call GetRDPClientIP func", __FILEW__, __FUNCTIONW__, __LINE__);
    WINSTATIONREMOTEADDRESS wsInfo;
    ULONG len;
    if (DEVELOP_MODE) PrintLn(L"Check remote desktop", __FILEW__, __FUNCTIONW__, __LINE__);
    if (WinStationQueryInformationW(0, LOGONID_CURRENT, WinStationRemoteAddress, &wsInfo, sizeof(wsInfo), &len))
    {
        if (DEVELOP_MODE) PrintLn(L"It is remote desktop (RDP)", __FILEW__, __FUNCTIONW__, __LINE__);
        ULONG cb;
        union {
            SOCKADDR sa;
            SOCKADDR_IN sa4;
            SOCKADDR_IN6 sa6;
        };
        switch (sa.sa_family = wsInfo.sin_family)
        {
        case AF_INET:
            if (DEVELOP_MODE) PrintLn(L"It is IPv4", __FILEW__, __FUNCTIONW__, __LINE__);
            sa4.sin_port = wsInfo.ipv4.sin_port;
            sa4.sin_addr.S_un.S_addr = wsInfo.ipv4.in_addr;
            RtlZeroMemory(sa4.sin_zero, sizeof(sa4.sin_zero));
            cb = sizeof(SOCKADDR_IN);
            break;
        case AF_INET6:
            if (DEVELOP_MODE) PrintLn(L"It is IPv6", __FILEW__, __FUNCTIONW__, __LINE__);
            sa6.sin6_port = wsInfo.ipv6.sin6_port;
            sa6.sin6_flowinfo = wsInfo.ipv6.sin6_flowinfo;
            memcpy(&sa6.sin6_addr, &wsInfo.ipv6.sin6_addr, sizeof(in6_addr));
            sa6.sin6_scope_id = wsInfo.ipv6.sin6_scope_id;
            cb = sizeof(SOCKADDR_IN6);
            break;
        default:
            if (DEVELOP_MODE) PrintLn(L"Error in IP version", __FILEW__, __FUNCTIONW__, __LINE__);
            return -1;
        }

        WSADATA wd;
        if (DEVELOP_MODE) PrintLn(L"Call WSAStartup", __FILEW__, __FUNCTIONW__, __LINE__);
        if (WSAStartup(WINSOCK_VERSION, &wd) == 0)
        {
            wchar_t AddressString[64];
            ULONG dwAddressStringLength = _countof(AddressString);

            if (WSAAddressToString(&sa, cb, 0, AddressString, &dwAddressStringLength) == 0)
            {
                if (DEVELOP_MODE) PrintLn((L"IP Address get successfully: " + wstring(AddressString, dwAddressStringLength)).c_str(), __FILEW__, __FUNCTIONW__, __LINE__);
                ip = wstring(AddressString, dwAddressStringLength);
                return 0;
            }
            else
            {
                if (DEVELOP_MODE) PrintLn((L"Error code WSAAddressToString: " + to_wstring(WSAGetLastError())).c_str(), __FILEW__, __FUNCTIONW__, __LINE__);
                return -1;
            }
        }
        else
        {
            if (DEVELOP_MODE) PrintLn((L"Error code WSAStartup: " + to_wstring(WSAGetLastError())).c_str(), __FILEW__, __FUNCTIONW__, __LINE__);
            return -1;
        }
    }

    if (DEVELOP_MODE) PrintLn(L"It is not remote desktop (RDP)", __FILEW__, __FUNCTIONW__, __LINE__);
    return 1;
}
person VOLVO    schedule 24.09.2020