我正在通过RDP客户端远程连接到Windows 10客户端操作系统。当我使用WTSQuerySessionInformationW()收集WTSIsRemoteSession和WTSClientProtocolType时,我正确地接收到这是一个远程会话,协议是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);
}发布于 2020-05-19 05:20:54
您正在调用WTSQuerySessionInformationW(),但是在需要将pData强制转换为PWTSCLIENTA时,您正在将其强制转换为PWTSCLIENTW。因此,您正在使用错误的字节偏移量访问ClientAddressFamily、ClientAddress和DeviceId字段。
此外,请确保处理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);
}https://stackoverflow.com/questions/61877655
复制相似问题