首页 > 解决方案 > WTSClientInfo 在 Windows 10 操作系统上通过 RDP 连接返回 NULL

问题描述

我正在通过 RDP 客户端远程连接到 Windows 10 客户端操作系统。当我收集WTSIsRemoteSessionWTSClientProtocolType使用WTSQuerySessionInformationW() 时,我正确地收到它是一个远程会话并且协议是 RDP。但是,当我尝试按如下方式收集客户端信息时,AF_INET 的条件失败并且客户端设备 ID 也为空。需要知道我在这里可能缺少什么。我注意到所有的PWTSCLIENTA数据都是空的。奇怪的是,查询函数本身并没有失败。以下是我的代码。

if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientInfo, &pData, &bytesReturned)){
            PWTSCLIENTA address = (PWTSCLIENTA)pData;
            printf("\tWTSQuerySessionInformationW - session %d - %s returned \"%p\"\n", WTS_CURRENT_SESSION, "WTSClientInfo", pData);
            if (AF_INET == address->ClientAddressFamily)
            {
                printf("\n\tClient Address : %d.%d.%d.%d\n", address->ClientAddress[2], address->ClientAddress[3], address->ClientAddress[4], address->ClientAddress[5]);
            }
            printf("\tClient DeviceId : %s\n\n", address->DeviceId);
    }

标签: windowswinapiremote-accessremote-desktopterminal-services

解决方案


您正在调用WTSQuerySessionInformationW(),但是当您需要将其转换为时,您正在转换pData为。因此,您正在使用错误的字节偏移量访问、和字段。PWTSCLIENTAPWTSCLIENTWClientAddressFamilyClientAddressDeviceId

另外,请确保您处理存在的可能性,ClientAddressFamilyAF_INET6不是AF_INET.

尝试更多类似的东西:

PWTSCLIENTW pData;
if (WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, WTSClientInfo, (LPWSTR*)&pData, &bytesReturned)){
    printf("\tWTSQuerySessionInformationW - session %d - %s returned \"%p\"\n", WTS_CURRENT_SESSION, "WTSClientInfo", pData);
    char ipAddress[46];
    if (inet_ntop(pData->ClientAddressFamily,pData->ClientAddress), ipAddress, sizeof(ipAddress)))
    {
        printf("\n\tClient Address : %s\n", ipAddress);
    }
    printf("\tClient DeviceId : %ls\n\n", pData->DeviceId);
    WTSFreeMemory(pData);
}

推荐阅读