[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