Python Samba:未传递用户凭据(cli_init_creds)?

时间:2011-08-22 16:51:46

标签: python windows linux authentication samba

我目前在Ubuntu中访问Windows打印共享(正在工作,所以我不会重新访问他们的设置)时遇到问题,所以我最终开始探索源代码Gnome的'system-config-printer'是用Python编写的,它使用Python smbc绑定到Samba。

我基本上设法将我的问题解决了这段来自/usr/share/system-config-printer/pysmb.py的代码,并且我在python命令行shell中运行:

import smbc, os 
def do_auth (svr, shr, wg, un, pw):
  return ("myworkdomain.com", "MYWORKUSERNAME", "MYWORKPASSWORD")

ctx = smbc.Context (debug=10, auth_fn=do_auth)
f = ctx.open ("smb://%s/%s" % ("printserver.myworkdomain.com", "PRINTSHARENAME"), os.O_RDWR, 0777)

第一个(某种)问题是,在执行ctx = smbc.Context...行时,Python总是抱怨:

params.c:OpenConfFile() - Unable to open configuration file "/home/MYUSERNAME/.smb/smb.conf":
    No such file or directory

......但也许这不是一个真正的问题? (也许smbc 应该重新创建这个文件?)。

当然,最大的问题是我无法连接到共享:执行f = ctx.open...行后,有一个很大的Samba通信转储,Windows服务器似乎正在谈论等 - 以及连接工作完成失败:

SPNEGO login failed: Logon failure
cli_init_creds: user  domain myworkdomain.com
 session setup ok
map_errno_from_nt_status: 32 bit codes: code=c0000022
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
smbc.PermissionError: (13, 'Permission denied')

基本上,我对Samba的了解太少,无法读取其余的错误日志,但我找到了这一行:

cli_init_creds: user  domain myworkdomain.com

......非常可疑 - 看起来好像'user'有一个空字符串 - 即使我希望它是'MYWORKUSERNAME',正如'do_auth所指定的那样{1}}'上面的功能!!

请注意,此失败有点类似于我之前使用cmdline NT_STATUS_LOGON_FAILURE获得的smbclient(请参阅Obtaining Windows printer share SMB settings (for tsclient/rdesktop on Linux) - Super User),这是通过明确指定Windows工作组来解决的。命令行 - 但是,我无法分辨这是否也是Python案例中的问题;或者如果相反,用户名不会在这里传递(或完全第三个)。编辑:这个工作命令行(列出共享)是(就这个例子而言):

smbclient -L \\printserver.myworkdomain.com -U MYWORKUSERNAME -W myworkdomain.com

提前感谢任何建议,
干杯!

1 个答案:

答案 0 :(得分:1)

好吧,我想我终于明白了,感谢Bug #848065 “system-config-printer cannot authenticate Windows Samba printer, while smbclient can (cli_init_creds)”中的评论 - 并审核了newprinter.py(来自system-config-printer)......

但首先,一点概述:

  • 我的Ubuntu计算机上的本地用户名:MYUSERNAME
  • 工作网络的主要地址(域):myworkdomain.com
  • 我在工作网络上的帐户名称:MYWORKUSERNAME
  • 我的工作帐户是工作组MYWORKGROUP的成员,该工作组还有一个子域myworkgroup.myworkdomain.com
  • 工作网络上的打印服务器位于printserver.myworkdomain.com
  • 我要访问的工作中打印服务器上的打印机名称(共享)是PRINTSHARENAME

好吧,事实证明上面test.py脚本中的一行是错误的 - 而不是:

return ("myworkdomain.com", "MYWORKUSERNAME", "MYWORKPASSWORD")

......应该有:

return ("MYWORKGROUP", "MYWORKUSERNAME", "MYWORKPASSWORD")

...(在allcaps中使用MYWORKGROUP,这是Windows的典型情况)

有趣的是,使用工作组子域不会工作:

return ("myworkgroup.myworkdomain.com", "MYWORKUSERNAME", "MYWORKPASSWORD")

...因为“smbc.PermissionError: (13, 'Permission denied')”也会失败(就像原始帖子示例一样)。

解决“权限被拒绝”错误的一种方法是检查日志 - 它显示如下内容:

    DomainNameLen            : 0x000c (12)
    DomainNameMaxLen         : 0x000c (12)
    DomainName               : *
        DomainName               : 'myworkdomain.com'
    UserNameLen              : 0x0004 (4)
    UserNameMaxLen           : 0x0004 (4)
    UserName                 : *
        UserName                 : 'MYWORKUSERNAME'
    WorkstationLen           : 0x0012 (18)
    WorkstationMaxLen        : 0x0012 (18)
    Workstation              : *
        Workstation              : 'MYPC'

......显然,DomainName应该是:

        DomainName               : 'MYWORKGROUP'

供参考,以下是“工作”设置(使用return ("MYWORKGROUP" ...)的日志片段:

...
cli_init_creds: user MYWORKUSERNAME domain MYWORKGROUP
 session setup ok
 tconx ok
...
Could not retrieve case sensitivity flag: NT_STATUS_INVALID_DEVICE_REQUEST.
Server connect ok: //printserver.myworkdomain.com/PRINTSHARENAME: 0xa297768
Performing aggressive shutdown.
...
smbc_remove_usused_server: 0xa297768 removed.
Context 0xa276658 successfully freed