Я использую 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 /