我目前在 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/