2011-08-22 37 views
1

我目前在Ubuntu上访问Windows打印共享时出现问题(在工作,所以我不会再访问他们的设置),所以我最终还是围绕着Gnome的'system-config-printer'用Python编写,并使用Samba的Python smbc绑定。Python Samba:未通过用户凭证(cli_init_creds)?

 

我已经基本上设法弄到了我的问题,这一段代码,它来自/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...行后,有桑巴沟通的自卸大时,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') 

基本上,我了解得太少桑巴能够读取错误日志的休息,但我觉得这行:

cli_init_creds: user domain myworkdomain.com 

...非常可疑 - 它看起来好像'user'有一个空字符串 - 尽管我期望它是'MYWORKUSERNAME',如上面的'do_auth'函数所指定的!

注意,这种故障是有点类似NT_STATUS_LOGON_FAILURE,我用来获取与CMDLINE​​(见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

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