Невозможно подключиться к общим ресурсам Windows ⇐ Python
-
Anonymous
Невозможно подключиться к общим ресурсам Windows
Я использую библиотеку pysmb для запроса общих ресурсов/структур каталогов в сетевых общих ресурсах SMB/CIFS.
def ListShares(Сервер, Имя пользователя=Нет, Пароль=Нет, Домен=Нет): IP = socket.gethostbyname(Сервер) conn = SMBConnection(имя пользователя, Пароль, «Мое приложение», Сервер, Домен, use_ntlm_v2=Верно, Sign_options = SMBConnection.SIGN_WHEN_SUPPORTED, is_direct_tcp=Истина) утвердить conn.connect (IP) Ответ = conn.listShares(timeout=30) return [{'Имя': x.name, «Тип»: x.type, «IsTemporary»: x.isTemporary, «Комментарии»: x.comments} для x в ответе, если не x.isSpecial] При подключении к Linux-системе с установленной Samba я могу подключиться нормально, и все работает. Когда я пытаюсь подключиться к общему ресурсу Win7/SBS2008/Server2008, я получаю сообщение об ошибке.
Если is_direct_tcp=True, я получаю Неверный заголовок протокола для сообщения сеанса Direct TCP
Файл «.../MyApp/Managers/SmbHelper.py», строка 38, в ListShares Assert conn.connect(Ip) Файл «/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py», строка 111, в Connect self._pollForNetBIOSPacket(timeout) Файл «/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py», строка 504, в _pollForNetBIOSPacket self.feedData(data) Файл «/opt/pyenv/lib/python3.3/site-packages/nmb/base.py», строка 49, в FeedData length = self.data_nmb.decode(self.data_buf, offset) Файл «/opt/pyenv/lib/python3.3/site-packages/nmb/nmb_structs.py», строка 60, в декодировании вызывает NMBError («Неверный заголовок протокола для сообщения сеанса Direct TCP») Если is_direct_tcp=False, я получаю NotConnectedError
Файл «.../MyApp/Managers/SmbHelper.py», строка 38, в ListShares Assert conn.connect(Ip) Файл "/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py", строка 111, в Connect self._pollForNetBIOSPacket(timeout) Файл «/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py», строка 466, в _pollForNetBIOSPacket вызывает NotConnectedError Я натыкаюсь на кирпичную стену. Как мне определить, что именно не так, и исправить это?
Дальнейшая диагностика...
smbclient -L linux.domain.local -U MyUsername -W домен //Работает smbclient -L linux.domain.local -U MyUsername@domain //Не работает (сбой аутентификации) smbclient -L windows.domain.local -U MyUsername -W домен //Не работает (сбой аутентификации) smbclient -L windows.domain.local -U MyUsername@domain //Работает smbclient -L [либо].domain.local -U MyUsername@domain -W домен //Работает, несмотря на избыточность Похоже, что Linux получает домен из параметра -W, Windows получает его из синтаксиса Username@Domain, а если использовать оба параметра, получается smbclient вызов успешен на любом сервере. К сожалению, подключиться к Windows из pysmb не удается, даже если я использую синтаксис @Domain
Решение
Было 3 проблемы... Во-первых, когда use_direct_tcp = True, port должен быть 445 . Если это значение False, порт должен быть 139. Также была ошибка при использовании модуля из Python3 (некорректно кодировались байты). Наконец, возникла проблема со способом связи с сервером (по крайней мере, при подключении к Windows-серверу, а не к Linux-серверу Samba).
Майкл Тео, автор модуля, разработал исправление, которое мы протестировали и оно работает. В ближайшее время он планирует обновить пакет.
Я использую библиотеку pysmb для запроса общих ресурсов/структур каталогов в сетевых общих ресурсах SMB/CIFS.
def ListShares(Сервер, Имя пользователя=Нет, Пароль=Нет, Домен=Нет): IP = socket.gethostbyname(Сервер) conn = SMBConnection(имя пользователя, Пароль, «Мое приложение», Сервер, Домен, use_ntlm_v2=Верно, Sign_options = SMBConnection.SIGN_WHEN_SUPPORTED, is_direct_tcp=Истина) утвердить conn.connect (IP) Ответ = conn.listShares(timeout=30) return [{'Имя': x.name, «Тип»: x.type, «IsTemporary»: x.isTemporary, «Комментарии»: x.comments} для x в ответе, если не x.isSpecial] При подключении к Linux-системе с установленной Samba я могу подключиться нормально, и все работает. Когда я пытаюсь подключиться к общему ресурсу Win7/SBS2008/Server2008, я получаю сообщение об ошибке.
Если is_direct_tcp=True, я получаю Неверный заголовок протокола для сообщения сеанса Direct TCP
Файл «.../MyApp/Managers/SmbHelper.py», строка 38, в ListShares Assert conn.connect(Ip) Файл «/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py», строка 111, в Connect self._pollForNetBIOSPacket(timeout) Файл «/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py», строка 504, в _pollForNetBIOSPacket self.feedData(data) Файл «/opt/pyenv/lib/python3.3/site-packages/nmb/base.py», строка 49, в FeedData length = self.data_nmb.decode(self.data_buf, offset) Файл «/opt/pyenv/lib/python3.3/site-packages/nmb/nmb_structs.py», строка 60, в декодировании вызывает NMBError («Неверный заголовок протокола для сообщения сеанса Direct TCP») Если is_direct_tcp=False, я получаю NotConnectedError
Файл «.../MyApp/Managers/SmbHelper.py», строка 38, в ListShares Assert conn.connect(Ip) Файл "/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py", строка 111, в Connect self._pollForNetBIOSPacket(timeout) Файл «/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py», строка 466, в _pollForNetBIOSPacket вызывает NotConnectedError Я натыкаюсь на кирпичную стену. Как мне определить, что именно не так, и исправить это?
Дальнейшая диагностика...
smbclient -L linux.domain.local -U MyUsername -W домен //Работает smbclient -L linux.domain.local -U MyUsername@domain //Не работает (сбой аутентификации) smbclient -L windows.domain.local -U MyUsername -W домен //Не работает (сбой аутентификации) smbclient -L windows.domain.local -U MyUsername@domain //Работает smbclient -L [либо].domain.local -U MyUsername@domain -W домен //Работает, несмотря на избыточность Похоже, что Linux получает домен из параметра -W, Windows получает его из синтаксиса Username@Domain, а если использовать оба параметра, получается smbclient вызов успешен на любом сервере. К сожалению, подключиться к Windows из pysmb не удается, даже если я использую синтаксис @Domain
Решение
Было 3 проблемы... Во-первых, когда use_direct_tcp = True, port должен быть 445 . Если это значение False, порт должен быть 139. Также была ошибка при использовании модуля из Python3 (некорректно кодировались байты). Наконец, возникла проблема со способом связи с сервером (по крайней мере, при подключении к Windows-серверу, а не к Linux-серверу Samba).
Майкл Тео, автор модуля, разработал исправление, которое мы протестировали и оно работает. В ближайшее время он планирует обновить пакет.