9

pysmb ライブラリを使用して、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 共有に接続しようとすると、エラーが発生します。

の場合is_direct_tcp=True、私はInvalid protocol header for Direct TCP session message

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") 

ならis_direct_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残念ながら、構文を使用しても、Windows への接続は pysmb 内から成功しません。

解決

3 つの問題がありました...まず、use_direct_tcp=Trueが であるport必要がある場合445。の場合False、ポートは のはずです139。Python3 のモジュールを使用した場合にもバグがありました (バイトが正しくエンコードされていませんでした)。最後に、サーバーとの通信方法に問題がありました (少なくとも、Linux Samba サーバーではなく Windows ボックスに接続する場合)。

モジュールの作成者である Michael Teo が修正プログラムを開発し、テスト済みで動作します。彼はまもなくパッケージを更新する予定です。

4

1 に答える 1