Я использую 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, или что-то еще?
Хорошо, после некоторого расследования я нашел ответ. Похоже, что в 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/