Python Samba: учетные данные пользователя не переданы (cli_init_creds)? - PullRequest
1 голос
/ 22 августа 2011

В настоящее время у меня проблема с доступом к общим ресурсам печати Windows ( на работе, поэтому у меня нет доступа к их настройкам ) в Ubuntu, поэтому я в итоге приступил к поиску источника Gnome. 'system-config-printer', который написан на Python и использует привязки Python smbc для Samba.

Мне в основном удалось свести мою проблему к этому коду, который взят из /usr/share/system-config-printer/pysmb.py и который я запускаю в командной строке python:

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' выше!!

Обратите внимание, что этот сбой в некоторой степени похож на NT_STATUS_LOGON_FAILURE, который я использовал для получения команды cmdline smbclient (см. Получение общих настроек SMB для принтера Windows (для tsclient / rdesktop в Linux) - Super User ), которая была решена путем явного указания рабочей группы Windows в командной строке - однако я не могу сказать, является ли это также проблемой здесь, в случае Python; или, если вместо этого, имя пользователя здесь не передается (или что-то совершенно третье). РЕДАКТИРОВАТЬ: эта рабочая командная строка (которая перечисляет общие ресурсы) (в отношении этого примера):

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

Заранее спасибо за любые предложения,
Ура!

1 Ответ

1 голос
/ 12 марта 2012

Хорошо, я думаю, наконец-то понял, благодаря комментариям в Ошибка # 848065 «system-config-printer не может аутентифицировать принтер Windows Samba, а smbclient может (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")

... (с 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
...