WTSClientInfo在Windows 10操作系统上通过RDP连接返回NULL。

问题描述 投票:0回答:1

我是通过RDP客户端远程连接到Windows 10客户端操作系统。当我收集到 WTSIsRemoteSessionWTSClientProtocolType 使用 WTSQuerySessionInformationW()我正确地接收到这是一个远程会话,协议是RDP,但当我试图收集客户端信息时,如下所示,AF_INET的条件失败,客户端设备Id也是空白。然而,当我试图收集客户端信息时,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);
    }
windows winapi remote-access remote-desktop terminal-services
1个回答
2
投票

你正在调用 WTSQuerySessionInformationW()但你是在铸造 pDataPWTSCLIENTA 当你需要把它投给 PWTSCLIENTW 而不是。 因此,您访问的是 ClientAddressFamily, ClientAddressDeviceId 字段使用了错误的字节偏移量。

另外,请确保你处理了在使用 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.