Список пользователей на удаленном компьютере Windows пытается подключиться ко всем удаленным сетевым интерфейсам
Я использую 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 и т. Д. Наконец, результат возвращается, и сам результат не возникает.
Я заметил, что иногда есть побочный эффект. Если удаленный компьютер имеет несколько сетевых интерфейсов (например, работает виртуальная машина с IP-адресом под NAT), эти сетевые интерфейсы и их IP-адреса перечислены с помощью FSCTL_QUERY_NETWORK_INTERFACE_INFO
, После того, как результат (имена пользователей) был возвращен с основного IP-адреса (исходного целевого IP-адреса), исходная машина пытается подключиться к другим IP-адресам, которые она получила из этого запроса SMB2. Так как эти IP-адреса находятся под NAT, сеанс TCP отбрасывается.
Я также заметил, что такое поведение зависит от исходного компьютера. Оригинальный тест с таким поведением был выполнен на сервере Windows 2012. Я также пытался запустить тот же код из Windows 7 и не было FSCTL_QUERY_NETWORK_INTERFACE_INFO
запросы вообще. Естественно, без дополнительных попыток связаться с этими частными IP-адресами под NAT. Может ли такое поведение (перечисление всех возможных сетевых интерфейсов) быть настроено каким-либо образом на исходной машине? Некоторые настройки 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/