Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法连接到windows共享_Python_Python 3.x_Smb - Fatal编程技术网

Python 无法连接到windows共享

Python 无法连接到windows共享,python,python-3.x,smb,Python,Python 3.x,Smb,我正在使用查询SMB/CIFS网络共享上的共享/目录结构 def ListShares(Server, Username=None, Password=None, Domain=None): Ip = socket.gethostbyname(Server) conn = SMBConnection(Username, Password, 'MyApp',

我正在使用查询SMB/CIFS网络共享上的共享/目录结构

def ListShares(Server, Username=None, Password=None, Domain=None):
    Ip = socket.gethostbyname(Server)
    conn = SMBConnection(Username,
                         Password,
                         'MyApp',
                         Server,
                         Domain,
                         use_ntlm_v2=True,
                         sign_options=SMBConnection.SIGN_WHEN_SUPPORTED,
                         is_direct_tcp=True)
    assert conn.connect(Ip)

    Response = conn.listShares(timeout=30)

    return [{'Name': x.name,
             'Type': x.type,
             'IsTemporary': x.isTemporary,
             'Comments': x.comments} for x in Response if not x.isSpecial]
当连接到运行samba的linux设备时,我可以正常连接,一切正常。当我尝试连接到Win7/SBS2008/Server2008共享时,我收到一个错误

如果
为\u direct\u tcp=True
,则直接tcp会话消息的
协议头无效

File ".../MyApp/Managers/SmbHelper.py", line 38, in ListShares assert conn.connect(Ip) 
File "/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py", line 111, in connect self._pollForNetBIOSPacket(timeout) 
File "/opt/pyenv/lib/python3.3/site-packages/smb/SMBConnection.py", line 504, in _pollForNetBIOSPacket self.feedData(data) 
File "/opt/pyenv/lib/python3.3/site-packages/nmb/base.py", line 49, in feedData length = self.data_nmb.decode(self.data_buf, offset) 
File "/opt/pyenv/lib/python3.3/site-packages/nmb/nmb_structs.py", line 60, in decode raise NMBError("Invalid protocol header for Direct TCP session message") 
如果
是\u direct\u tcp=False
,我会得到一个
NotConnectedError

File ".../MyApp/Managers/SmbHelper.py", line 38, in ListShares assert conn.connect(Ip) 
File "/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py", line 111, in connect self._pollForNetBIOSPacket(timeout) 
File "/opt/pyenv/lib/python3.3/lib/site-packages/smb/SMBConnection.py", line 466, in _pollForNetBIOSPacket raise NotConnectedError 
我撞到了一堵砖墙。我怎样才能找出到底是什么地方出了问题并加以纠正

进一步诊断

smbclient -L linux.domain.local   -U MyUsername -W domain //Works
smbclient -L linux.domain.local   -U MyUsername@domain    //Doesn't work (Auth failed)
smbclient -L windows.domain.local -U MyUsername -W domain //Doesn't work (Auth failed)
smbclient -L windows.domain.local -U MyUsername@domain    //Works

smbclient -L [either].domain.local -U MyUsername@domain -W domain //Works, despite redundancy
因此,Linux似乎是从
-W
参数获取域的,Windows是从
参数获取域的Username@Domain
语法并同时提供这两种语法将使
smbclient
调用成功地调用任一服务器。不幸的是,即使我使用
@Domain
语法,从pysmb内部连接到Windows也不会成功

解决方案 有三个问题。。。首先,当
使用\u direct\u tcp
=
True
时,
端口需要是
445
。当它为
False
时,端口应为
139
。使用Python3中的模块时也存在一个bug(字节被错误编码)。最后,它与服务器的通信方式出现了问题(至少在连接到Windows Box而不是linux samba服务器时)


该模块的作者MichaelTeo已经开发了一个修复程序,我们已经测试并运行。他计划很快更新软件包。

我不确定这对您的情况是否有帮助,但它对我有用:

  • SmbConnection
    的第三个参数应该是(我认为)客户机名称,因此我将从
    socket.gethostname()获取的内容传递给它

  • 我没有使用
    sign\u选项
    是\u direct\u tcp
    我只保留默认值

  • 这对samba和windows共享都适用(有时我只需要传递不同的端口号)

    以下是我使用的代码:

    class Smb(object):
        def __init__(self, username, password, server, share, port=139):
            # split username if it contains a domain (domain\username)
            domain, username = username.split('\\') if username.count('\\') == 1 else ('', username)
            # setup data
            self.domain    = str(domain)
            self.username  = str(username)
            self.password  = str(password)
            self.client    = socket.gethostname()
            self.server    = str(server)
            self.server_ip = socket.gethostbyname(server)
            self.share     = str(share)
            self.port      = port
            self.conn      = None
            self.connected = False
            # SMB.SMBConnection logs too much
            smb_logger = logging.getLogger('SMB.SMBConnection')
            smb_logger.setLevel(logging.WARNING)
    
        def connect(self):
            try:
                self.conn = SMBConnection(self.username, self.password,
                                          self.client, self.server,
                                          use_ntlm_v2=True, domain=self.domain)
                self.connected = self.conn.connect(self.server_ip, self.port)
                logger.info('Connected to %s' % self.server)
                return self.connected
            except Exception, e:
                logger.error('Connect failed. Reason: %s', e)
                return False
    
    并将其用作:

    smb = Smb('domain\\user', 'password', 'server', 'share_name')
    

    谢谢,让我试试看会发生什么。。。嗯,这让我回到了
    NotConnectedError
    它确实是。我已经使用smbclient用更多诊断信息更新了Q。此外,我可以远程登录139上的任意一台机器,当我键入垃圾时,会收到一个“无法识别的请求”,所以有些东西在那里,并且正在侦听有趣的是,您的代码适用于samba box,但不适用于windows box<代码>文件“…site packages\smb\base.py”,第331行,在\u handleSessionChallenge\u SMB2\n self.signing\u session\u key=(session\u key+'\\0'*16)[:16]\n”,“类型错误:无法将字节压缩到str\n“
    @Basic抱歉,这是针对python 2.7的:-/错过了python 3标记。我甚至不记得为什么我到处都有
    str
    。如果我传递了unicode字符串,我想模块引发了一个异常。代码已经有几个月了……我接受了,因为这实际上为我指明了正确的方向。我使用的服务器名称格式不正确(我使用的是
    srv.domain.local
    ,而不是
    srv
    )。后来我遇到了另一个问题(缓冲区溢出),但这是另一个问题。谢谢你的时间