WTSClientInfo returns NULL on Windows 10 OS 通过 RDP 连接

WTSClientInfo returns NULL on Windows 10 OS Over RDP Connection

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

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);
    }

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

此外,请确保您处理 ClientAddressFamily 成为 AF_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);
}