我正在使用 Powershell 和 ADSI 枚举远程计算机上本地组中的用户。好吧,说实话,我也使用了 Python 和 win32net,但结果是一样的,所以我想语言的选择在这里并不重要。我在 Powershell 中所做的是
$groupname = 'Administrators'
$group = [ADSI]("WinNT://$computer/$groupname")
$group.invoke("Members") | foreach {
.......
and then follows the code which process results
其中$computer
是远程计算机的 IP 地址或主机名。底层发生的是打开到目标计算机的 SMB2 会话并执行不同的 SMB2 协议操作,例如 Tree Connect、lsa_LookupSids2 等。最后返回结果,结果本身没有问题。
我注意到有时会有副作用。如果远程计算机有多个网络接口(例如,在 NAT 下运行具有 IP 地址的虚拟机),则使用 列出这些网络接口及其 IP 地址FSCTL_QUERY_NETWORK_INTERFACE_INFO
。从主 IP 地址(原始目标 IP)返回结果(用户名)后,源计算机尝试连接到她从该 SMB2 查询中获得的另一个 IP。由于这些 IP 位于 NAT 下,因此 TCP 会话被丢弃。
我还注意到,这种行为取决于源机器。最初对这种行为的测试是在 Windows 2012 服务器上进行的。我还尝试在 Windows 7 上运行相同的代码,但没有任何FSCTL_QUERY_NETWORK_INTERFACE_INFO
查询。当然,没有在 NAT 下尝试联系这些私有 IP。这种行为(列出所有可能的网络接口)可以在源机器上以任何方式配置吗?注册表中的一些与 SMB2 相关的设置,或者可能是其他什么?
答案1
好的,经过一番调查,我找到了答案。似乎 Windows 2012 Server 具有一些与 SMB3 相关的附加功能,称为多通道。它尝试组合多个网络接口(如果有)以增加吞吐量。为了做到这一点,客户端首先向服务器查询其接口/IP(在我的情况下发送响应)。然后,它尝试与这些 IP 建立另一个会话(由于 NAT,这对我来说不起作用)。可以按以下方式禁用/启用客户端的功能:
Set-SmbClientConfiguration -EnableMultiChannel $false
您还可以在服务器端启用或禁用此功能。有关此主题的更多信息,请点击此处https://blogs.technet.microsoft.com/josebda/2012/06/28/the-basics-of-smb-multichannel-a-feature-of-windows-server-2012-and-smb-3-0/