我目前在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
提前感谢任何建议,
干杯!
答案 0 :(得分:1)
好吧,我想我终于明白了,感谢Bug #848065 “system-config-printer cannot authenticate Windows Samba printer, while smbclient can (cli_init_creds)”中的评论 - 并审核了newprinter.py(来自system-config-printer
)......
但首先,一点概述:
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