python 桑巴 : user credentials not passed (cli_init_creds)?

标签 python windows linux authentication samba

我目前在 Ubuntu 中访问 Windows 打印共享时遇到问题(在工作中,所以我真的无权访问它们的设置),所以我最终开始研究Gnome 的“system-config-printer”是用 Python 编写的,并使用 Python smbc Samba 的绑定(bind)。

我基本上已经设法将我的问题归结为这段代码,它来自 /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”函数所指定的!!

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

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

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

最佳答案

好的,好吧,我想我终于明白了,感谢 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")

...一个人应该有:

返回(“我的工作组”、“我的工作用户名”、“我的工作密码”)

...(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               : '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

关于 python 桑巴 : user credentials not passed (cli_init_creds)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150774/

相关文章:

python - 如何从与一对一字段相关的两个模型中获取所有对象的列表

python - 有监督的文本抽取摘要

python - 在 Pandas 的数据框中聚合列表

windows - 标准窗口类名称列表

windows - 使用 Windows 防火墙拒绝访问 50,000 个特定 IP 地址

linux - 为什么派二进制文件不允许使用 "symbol@GOT"?

python-3.x - 我无法用 pip 安装 cupy

linux - ideone.com 和 codepad.org 等脚本

python - 从 IPython 重新加载 Python 扩展模块

windows - Windows 如何决定将哪个设置/模板(Internet 与数据中心)应用于 TCP 连接?