[samba] Samba, драйверы принтеров и rpcclient

Alexander Bokovoy =?iso-8859-1?q?ab_=CE=C1_altlinux=2Eorg?=
Ср Июл 2 14:50:11 MSD 2008


1 июля 2008 г. 15:25 пользователь Alex Moskalenko <mav на elserv.msk.su> написал:
> Здравствуйте!
>
> Когда-то я уже спрашивал тут об этой проблеме, правда, ответа так и не
> получил. Итак, есть ALT Linux Server 4.0 + updates+branch.
> samba-3.0.30-alt1.M40.1 в режиме PDC. На сервере с помощью CUPS настроены
> несколько принтеров. Самба принтеры видит, на нее загружены и сопоставлены
> принтерам соответствующие драйверы. Клиенты без проблем подключаются к
> принтерам, загружают с сервера драйверы, печатают, меняют настройки
> принтеров, в общем, делают все, что должны делать. При всей этой благодати
> есть одна неприятная и неочевидная проблема. При любом обращении к настройкам
> принтера или любом изменении этих настроек клиент скачивает файлы драйвера с
> сервера. Для небольших драйверов это практически незаметно, а для драйверов
> большого объема это вызывает существенные задержки при открытии/закрытии окон
> настроек или изменении настроек принтера. При этом на клиентах (Win2k/WinXP)
> в System Event Log появляются предупреждения от пользователя SYSTEM,
> источника Print, ID 20 со следующим содержанием (имена принтеров и файлов для
> разных принтеров разные):
> ===
> Printer Driver HP LaserJet 1200 Series PCL 6 for Windows NT x86 Version-3 was
> added or updated. Files:- HPBF312G.DLL, HPBF312E.DLL, HPBF312I.PMD,
> HPBF312I.HLP, HPBFTM32.DLL, HPBAFD32.DLL, HPBF312K.DLL, HPBF312J.DLL,
> HPBF312I.DLL, HPBF312H.DLL, HPBF312F.DLL.
> ===
> Такое сообщение появляется при каждом открытии окна настроек принтера.
>
> Если принтеры находятся на сервере Windows, то таких сообщений не возникает,
> как и задержек при открытии окон настроек.
>
> При сравнении вывода rpcclient -U admin -c 'enumdrivers 2' server обнаружилось
> следующее:
> Сервер - samba
> ===
> rpcclient -U admin -c 'enumdrivers 2' samba
> Printer Driver Info 2:
>        Version: [3]
>        Driver Name: [HP LaserJet 1200 Series PCL 6]
>        Architecture: [Windows NT x86]
>        Driver Path: [\\\\SAMBA\print$\W32X86\3\HPBF312G.DLL]
>        Datafile: [\\\\SAMBA\print$\W32X86\3\HPBF312I.PMD]
>        Configfile: [\\\\SAMBA\print$\W32X86\3\HPBF312E.DLL]
> ===
Вот как это формируется (source/rpc_server/srv_spoolss_nt.c)
/********************************************************************
 * construct_printer_driver_info_2
 * fill a printer_info_2 struct
 ********************************************************************/

static void fill_printer_driver_info_2(DRIVER_INFO_2 *info,
NT_PRINTER_DRIVER_INFO_LEVEL driver, fstring servername)
{
        pstring temp;

        info->version=driver.info_3->cversion;

        init_unistr( &info->name, driver.info_3->name );
        init_unistr( &info->architecture, driver.info_3->environment );


    if (strlen(driver.info_3->driverpath)) {
                slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername,
driver.info_3->driverpath);
                init_unistr( &info->driverpath, temp );
    } else
        init_unistr( &info->driverpath, "" );

        if (strlen(driver.info_3->datafile)) {
                slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername,
driver.info_3->datafile);
                init_unistr( &info->datafile, temp );
        } else
                init_unistr( &info->datafile, "" );

        if (strlen(driver.info_3->configfile)) {
                slprintf(temp, sizeof(temp)-1, "\\\\%s%s", servername,
driver.info_3->configfile);
                init_unistr( &info->configfile, temp );
        } else
                init_unistr( &info->configfile, "" );
}

Как можно видеть, здесь должно добавиться ровно два слэша.
Единственный случай, когда их будет четыре -- это если servername уже
содержит два слэша. И действительно, из сети
(source/rpc_client/cli_spoolss.c:rpccli_spoolss_enumprinterdrivers())
приходит имя сервера с префиксом \\, а мы его не проверяем и просто
дописываем к нему эти два слэша.

Можно либо обрезать эти слэши при распаковке из сети, либо не
добавлять их при создании ответа. Я закину обсуждение в
samba-technical на .
-- 
/ Alexander Bokovoy


Подробная информация о списке рассылки Samba