WTS_CLIENT_ADDRESS地址无法正常打印

时间:2016-04-20 17:29:52

标签: c windows winapi

我正在尝试获取登录到计算机的所有RDP连接的IP地址。我正在使用WTSEnumerateSessions和WTSQuerySessionInformation来检索指向包含地址的WTS_CLIENT_ADDRESS结构的指针。以下是代码的一部分:

WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE,
                           SessionNo,
                           WTSClientAddress,
                           &ppBuffer,
                           &pBytesReturned);

address = (WTS_CLIENT_ADDRESS *)ppBuffer;

if (AF_INET == address->AddressFamily)
{
    printf("Client Address : %s\n", (LPSTR)address->Address);
}
else if (AF_INET6 == address->AddressFamily)
{
    //print IPV6
}

我可以获得AddressFamily并且值很好,但是当我尝试打印地址时,我得到了胡言乱语。 MSDN表示该值是一个以空字符结尾的字符串,但它不会像它应该那样打印。这是链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa383857(v=vs.85).aspx

我有一种感觉,我在这里遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

您没有考虑WTS_INFO_CLASS文档中的以下注释:

  

WTSClientAddress
  客户端的网络类型和网络地址。有关更多信息,请参阅WTS_CLIENT_ADDRESS。

     

IP地址从WTS_CLIENT_ADDRESS结构的Address成员开头偏移两个字节。

另外,尽管文档说的是,IPv4地址不是以空字符结尾的字符串!它实际上是IPv4地址的原始4字节(就像IPv6地址是原始字节一样)。

请改为尝试:

df.groupby(level=0).agg(lambda x: len(set(x)) == 1)

  Value1 Value2
A   True  False
B  False  False
C   True  False