📄 nt_printing.c
字号:
/* * Unix SMB/CIFS implementation. * RPC Pipe client / server routines * Copyright (C) Andrew Tridgell 1992-2000, * Copyright (C) Jean François Micouleau 1998-2000. * Copyright (C) Gerald Carter 2002-2005. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include "includes.h"extern struct current_user current_user;static TDB_CONTEXT *tdb_forms; /* used for forms files */static TDB_CONTEXT *tdb_drivers; /* used for driver files */static TDB_CONTEXT *tdb_printers; /* used for printers files */#define FORMS_PREFIX "FORMS/"#define DRIVERS_PREFIX "DRIVERS/"#define DRIVER_INIT_PREFIX "DRIVER_INIT/"#define PRINTERS_PREFIX "PRINTERS/"#define SECDESC_PREFIX "SECDESC/"#define GLOBAL_C_SETPRINTER "GLOBALS/c_setprinter" #define NTDRIVERS_DATABASE_VERSION_1 1#define NTDRIVERS_DATABASE_VERSION_2 2#define NTDRIVERS_DATABASE_VERSION_3 3 /* little endian version of v2 */#define NTDRIVERS_DATABASE_VERSION_4 4 /* fix generic bits in security descriptors */#define NTDRIVERS_DATABASE_VERSION_5 5 /* normalize keys in ntprinters.tdb *//* Map generic permissions to printer object specific permissions */GENERIC_MAPPING printer_generic_mapping = { PRINTER_READ, PRINTER_WRITE, PRINTER_EXECUTE, PRINTER_ALL_ACCESS};STANDARD_MAPPING printer_std_mapping = { PRINTER_READ, PRINTER_WRITE, PRINTER_EXECUTE, PRINTER_ALL_ACCESS};/* Map generic permissions to print server object specific permissions */GENERIC_MAPPING printserver_generic_mapping = { SERVER_READ, SERVER_WRITE, SERVER_EXECUTE, SERVER_ALL_ACCESS};STANDARD_MAPPING printserver_std_mapping = { SERVER_READ, SERVER_WRITE, SERVER_EXECUTE, SERVER_ALL_ACCESS};/* We need one default form to support our default printer. Msoft adds theforms it wants and in the ORDER it wants them (note: DEVMODE papersize is anarray index). Letter is always first, so (for the current code) additionsalways put things in the correct order. */static const nt_forms_struct default_forms[] = { {"Letter",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368}, {"Letter Small",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368}, {"Tabloid",0x1,0x44368,0x696b8,0x0,0x0,0x44368,0x696b8}, {"Ledger",0x1,0x696b8,0x44368,0x0,0x0,0x696b8,0x44368}, {"Legal",0x1,0x34b5c,0x56d10,0x0,0x0,0x34b5c,0x56d10}, {"Statement",0x1,0x221b4,0x34b5c,0x0,0x0,0x221b4,0x34b5c}, {"Executive",0x1,0x2cf56,0x411cc,0x0,0x0,0x2cf56,0x411cc}, {"A3",0x1,0x48828,0x668a0,0x0,0x0,0x48828,0x668a0}, {"A4",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828}, {"A4 Small",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828}, {"A5",0x1,0x24220,0x33450,0x0,0x0,0x24220,0x33450}, {"B4 (JIS)",0x1,0x3ebe8,0x58de0,0x0,0x0,0x3ebe8,0x58de0}, {"B5 (JIS)",0x1,0x2c6f0,0x3ebe8,0x0,0x0,0x2c6f0,0x3ebe8}, {"Folio",0x1,0x34b5c,0x509d8,0x0,0x0,0x34b5c,0x509d8}, {"Quarto",0x1,0x347d8,0x43238,0x0,0x0,0x347d8,0x43238}, {"10x14",0x1,0x3e030,0x56d10,0x0,0x0,0x3e030,0x56d10}, {"11x17",0x1,0x44368,0x696b8,0x0,0x0,0x44368,0x696b8}, {"Note",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368}, {"Envelope #9",0x1,0x18079,0x37091,0x0,0x0,0x18079,0x37091}, {"Envelope #10",0x1,0x19947,0x3ae94,0x0,0x0,0x19947,0x3ae94}, {"Envelope #11",0x1,0x1be7c,0x40565,0x0,0x0,0x1be7c,0x40565}, {"Envelope #12",0x1,0x1d74a,0x44368,0x0,0x0,0x1d74a,0x44368}, {"Envelope #14",0x1,0x1f018,0x47504,0x0,0x0,0x1f018,0x47504}, {"C size sheet",0x1,0x696b8,0x886d0,0x0,0x0,0x696b8,0x886d0}, {"D size sheet",0x1,0x886d0,0xd2d70,0x0,0x0,0x886d0,0xd2d70}, {"E size sheet",0x1,0xd2d70,0x110da0,0x0,0x0,0xd2d70,0x110da0}, {"Envelope DL",0x1,0x1adb0,0x35b60,0x0,0x0,0x1adb0,0x35b60}, {"Envelope C5",0x1,0x278d0,0x37e88,0x0,0x0,0x278d0,0x37e88}, {"Envelope C3",0x1,0x4f1a0,0x6fd10,0x0,0x0,0x4f1a0,0x6fd10}, {"Envelope C4",0x1,0x37e88,0x4f1a0,0x0,0x0,0x37e88,0x4f1a0}, {"Envelope C6",0x1,0x1bd50,0x278d0,0x0,0x0,0x1bd50,0x278d0}, {"Envelope C65",0x1,0x1bd50,0x37e88,0x0,0x0,0x1bd50,0x37e88}, {"Envelope B4",0x1,0x3d090,0x562e8,0x0,0x0,0x3d090,0x562e8}, {"Envelope B5",0x1,0x2af80,0x3d090,0x0,0x0,0x2af80,0x3d090}, {"Envelope B6",0x1,0x2af80,0x1e848,0x0,0x0,0x2af80,0x1e848}, {"Envelope",0x1,0x1adb0,0x38270,0x0,0x0,0x1adb0,0x38270}, {"Envelope Monarch",0x1,0x18079,0x2e824,0x0,0x0,0x18079,0x2e824}, {"6 3/4 Envelope",0x1,0x167ab,0x284ec,0x0,0x0,0x167ab,0x284ec}, {"US Std Fanfold",0x1,0x5c3e1,0x44368,0x0,0x0,0x5c3e1,0x44368}, {"German Std Fanfold",0x1,0x34b5c,0x4a6a0,0x0,0x0,0x34b5c,0x4a6a0}, {"German Legal Fanfold",0x1,0x34b5c,0x509d8,0x0,0x0,0x34b5c,0x509d8}, {"B4 (ISO)",0x1,0x3d090,0x562e8,0x0,0x0,0x3d090,0x562e8}, {"Japanese Postcard",0x1,0x186a0,0x24220,0x0,0x0,0x186a0,0x24220}, {"9x11",0x1,0x37cf8,0x44368,0x0,0x0,0x37cf8,0x44368}, {"10x11",0x1,0x3e030,0x44368,0x0,0x0,0x3e030,0x44368}, {"15x11",0x1,0x5d048,0x44368,0x0,0x0,0x5d048,0x44368}, {"Envelope Invite",0x1,0x35b60,0x35b60,0x0,0x0,0x35b60,0x35b60}, {"Reserved48",0x1,0x1,0x1,0x0,0x0,0x1,0x1}, {"Reserved49",0x1,0x1,0x1,0x0,0x0,0x1,0x1}, {"Letter Extra",0x1,0x3ae94,0x4a6a0,0x0,0x0,0x3ae94,0x4a6a0}, {"Legal Extra",0x1,0x3ae94,0x5d048,0x0,0x0,0x3ae94,0x5d048}, {"Tabloid Extra",0x1,0x4a6a0,0x6f9f0,0x0,0x0,0x4a6a0,0x6f9f0}, {"A4 Extra",0x1,0x397c2,0x4eb16,0x0,0x0,0x397c2,0x4eb16}, {"Letter Transverse",0x1,0x34b5c,0x44368,0x0,0x0,0x34b5c,0x44368}, {"A4 Transverse",0x1,0x33450,0x48828,0x0,0x0,0x33450,0x48828}, {"Letter Extra Transverse",0x1,0x3ae94,0x4a6a0,0x0,0x0,0x3ae94,0x4a6a0}, {"Super A",0x1,0x376b8,0x56ea0,0x0,0x0,0x376b8,0x56ea0}, {"Super B",0x1,0x4a768,0x76e58,0x0,0x0,0x4a768,0x76e58}, {"Letter Plus",0x1,0x34b5c,0x4eb16,0x0,0x0,0x34b5c,0x4eb16}, {"A4 Plus",0x1,0x33450,0x50910,0x0,0x0,0x33450,0x50910}, {"A5 Transverse",0x1,0x24220,0x33450,0x0,0x0,0x24220,0x33450}, {"B5 (JIS) Transverse",0x1,0x2c6f0,0x3ebe8,0x0,0x0,0x2c6f0,0x3ebe8}, {"A3 Extra",0x1,0x4e9d0,0x6ca48,0x0,0x0,0x4e9d0,0x6ca48}, {"A5 Extra",0x1,0x2a7b0,0x395f8,0x0,0x0,0x2a7b0,0x395f8}, {"B5 (ISO) Extra",0x1,0x31128,0x43620,0x0,0x0,0x31128,0x43620}, {"A2",0x1,0x668a0,0x91050,0x0,0x0,0x668a0,0x91050}, {"A3 Transverse",0x1,0x48828,0x668a0,0x0,0x0,0x48828,0x668a0}, {"A3 Extra Transverse",0x1,0x4e9d0,0x6ca48,0x0,0x0,0x4e9d0,0x6ca48}, {"Japanese Double Postcard",0x1,0x30d40,0x24220,0x0,0x0,0x30d40,0x24220}, {"A6",0x1,0x19a28,0x24220,0x0,0x0,0x19a28,0x24220}, {"Japanese Envelope Kaku #2",0x1,0x3a980,0x510e0,0x0,0x0,0x3a980,0x510e0}, {"Japanese Envelope Kaku #3",0x1,0x34bc0,0x43a08,0x0,0x0,0x34bc0,0x43a08}, {"Japanese Envelope Chou #3",0x1,0x1d4c0,0x395f8,0x0,0x0,0x1d4c0,0x395f8}, {"Japanese Envelope Chou #4",0x1,0x15f90,0x320c8,0x0,0x0,0x15f90,0x320c8}, {"Letter Rotated",0x1,0x44368,0x34b5c,0x0,0x0,0x44368,0x34b5c}, {"A3 Rotated",0x1,0x668a0,0x48828,0x0,0x0,0x668a0,0x48828}, {"A4 Rotated",0x1,0x48828,0x33450,0x0,0x0,0x48828,0x33450}, {"A5 Rotated",0x1,0x33450,0x24220,0x0,0x0,0x33450,0x24220}, {"B4 (JIS) Rotated",0x1,0x58de0,0x3ebe8,0x0,0x0,0x58de0,0x3ebe8}, {"B5 (JIS) Rotated",0x1,0x3ebe8,0x2c6f0,0x0,0x0,0x3ebe8,0x2c6f0}, {"Japanese Postcard Rotated",0x1,0x24220,0x186a0,0x0,0x0,0x24220,0x186a0}, {"Double Japan Postcard Rotated",0x1,0x24220,0x30d40,0x0,0x0,0x24220,0x30d40}, {"A6 Rotated",0x1,0x24220,0x19a28,0x0,0x0,0x24220,0x19a28}, {"Japan Envelope Kaku #2 Rotated",0x1,0x510e0,0x3a980,0x0,0x0,0x510e0,0x3a980}, {"Japan Envelope Kaku #3 Rotated",0x1,0x43a08,0x34bc0,0x0,0x0,0x43a08, 0x34bc0}, {"Japan Envelope Chou #3 Rotated",0x1,0x395f8,0x1d4c0,0x0,0x0,0x395f8,0x1d4c0}, {"Japan Envelope Chou #4 Rotated",0x1,0x320c8,0x15f90,0x0,0x0,0x320c8,0x15f90}, {"B6 (JIS)",0x1,0x1f400,0x2c6f0,0x0,0x0,0x1f400,0x2c6f0}, {"B6 (JIS) Rotated",0x1,0x2c6f0,0x1f400,0x0,0x0,0x2c6f0,0x1f400}, {"12x11",0x1,0x4a724,0x443e1,0x0,0x0,0x4a724,0x443e1}, {"Japan Envelope You #4",0x1,0x19a28,0x395f8,0x0,0x0,0x19a28,0x395f8}, {"Japan Envelope You #4 Rotated",0x1,0x395f8,0x19a28,0x0,0x0,0x395f8,0x19a28}, {"PRC 16K",0x1,0x2de60,0x3f7a0,0x0,0x0,0x2de60,0x3f7a0}, {"PRC 32K",0x1,0x1fbd0,0x2cec0,0x0,0x0,0x1fbd0,0x2cec0}, {"PRC 32K(Big)",0x1,0x222e0,0x318f8,0x0,0x0,0x222e0,0x318f8}, {"PRC Envelope #1",0x1,0x18e70,0x28488,0x0,0x0,0x18e70,0x28488}, {"PRC Envelope #2",0x1,0x18e70,0x2af80,0x0,0x0,0x18e70,0x2af80}, {"PRC Envelope #3",0x1,0x1e848,0x2af80,0x0,0x0,0x1e848,0x2af80}, {"PRC Envelope #4",0x1,0x1adb0,0x32c80,0x0,0x0,0x1adb0,0x32c80}, {"PRC Envelope #5",0x1,0x1adb0,0x35b60,0x0,0x0,0x1adb0,0x35b60}, {"PRC Envelope #6",0x1,0x1d4c0,0x38270,0x0,0x0,0x1d4c0,0x38270}, {"PRC Envelope #7",0x1,0x27100,0x38270,0x0,0x0,0x27100,0x38270}, {"PRC Envelope #8",0x1,0x1d4c0,0x4b708,0x0,0x0,0x1d4c0,0x4b708}, {"PRC Envelope #9",0x1,0x37e88,0x4f1a0,0x0,0x0,0x37e88,0x4f1a0}, {"PRC Envelope #10",0x1,0x4f1a0,0x6fd10,0x0,0x0,0x4f1a0,0x6fd10}, {"PRC 16K Rotated",0x1,0x3f7a0,0x2de60,0x0,0x0,0x3f7a0,0x2de60}, {"PRC 32K Rotated",0x1,0x2cec0,0x1fbd0,0x0,0x0,0x2cec0,0x1fbd0}, {"PRC 32K(Big) Rotated",0x1,0x318f8,0x222e0,0x0,0x0,0x318f8,0x222e0}, {"PRC Envelope #1 Rotated",0x1,0x28488,0x18e70,0x0,0x0,0x28488,0x18e70}, {"PRC Envelope #2 Rotated",0x1,0x2af80,0x18e70,0x0,0x0,0x2af80,0x18e70}, {"PRC Envelope #3 Rotated",0x1,0x2af80,0x1e848,0x0,0x0,0x2af80,0x1e848}, {"PRC Envelope #4 Rotated",0x1,0x32c80,0x1adb0,0x0,0x0,0x32c80,0x1adb0}, {"PRC Envelope #5 Rotated",0x1,0x35b60,0x1adb0,0x0,0x0,0x35b60,0x1adb0}, {"PRC Envelope #6 Rotated",0x1,0x38270,0x1d4c0,0x0,0x0,0x38270,0x1d4c0}, {"PRC Envelope #7 Rotated",0x1,0x38270,0x27100,0x0,0x0,0x38270,0x27100}, {"PRC Envelope #8 Rotated",0x1,0x4b708,0x1d4c0,0x0,0x0,0x4b708,0x1d4c0}, {"PRC Envelope #9 Rotated",0x1,0x4f1a0,0x37e88,0x0,0x0,0x4f1a0,0x37e88}, {"PRC Envelope #10 Rotated",0x1,0x6fd10,0x4f1a0,0x0,0x0,0x6fd10,0x4f1a0}};struct table_node { const char *long_archi; const char *short_archi; int version;}; #define SPL_ARCH_WIN40 "WIN40"#define SPL_ARCH_W32X86 "W32X86"#define SPL_ARCH_W32MIPS "W32MIPS"#define SPL_ARCH_W32ALPHA "W32ALPHA"#define SPL_ARCH_W32PPC "W32PPC"#define SPL_ARCH_IA64 "IA64"#define SPL_ARCH_X64 "x64"static const struct table_node archi_table[]= { {"Windows 4.0", SPL_ARCH_WIN40, 0 }, {"Windows NT x86", SPL_ARCH_W32X86, 2 }, {"Windows NT R4000", SPL_ARCH_W32MIPS, 2 }, {"Windows NT Alpha_AXP", SPL_ARCH_W32ALPHA, 2 }, {"Windows NT PowerPC", SPL_ARCH_W32PPC, 2 }, {"Windows IA64", SPL_ARCH_IA64, 3 }, {"Windows x64", SPL_ARCH_X64, 3 }, {NULL, "", -1 }};/**************************************************************************** generate a new TDB_DATA key for storing a printer****************************************************************************/static TDB_DATA make_printer_tdbkey( const char *sharename ){ fstring share; static pstring keystr; TDB_DATA key; fstrcpy( share, sharename ); strlower_m( share ); pstr_sprintf( keystr, "%s%s", PRINTERS_PREFIX, share ); key.dptr = keystr; key.dsize = strlen(keystr)+1; return key;}/**************************************************************************** generate a new TDB_DATA key for storing a printer security descriptor****************************************************************************/static char* make_printers_secdesc_tdbkey( const char* sharename ){ fstring share; static pstring keystr; fstrcpy( share, sharename ); strlower_m( share ); pstr_sprintf( keystr, "%s%s", SECDESC_PREFIX, share ); return keystr;}/********************************************************************************************************************************************************/static BOOL upgrade_to_version_3(void){ TDB_DATA kbuf, newkey, dbuf; DEBUG(0,("upgrade_to_version_3: upgrading print tdb's to version 3\n")); for (kbuf = tdb_firstkey(tdb_drivers); kbuf.dptr; newkey = tdb_nextkey(tdb_drivers, kbuf), safe_free(kbuf.dptr), kbuf=newkey) { dbuf = tdb_fetch(tdb_drivers, kbuf); if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) { DEBUG(0,("upgrade_to_version_3:moving form\n")); if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to move form. Error (%s).\n", tdb_errorstr(tdb_forms))); return False; } if (tdb_delete(tdb_drivers, kbuf) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to delete form. Error (%s)\n", tdb_errorstr(tdb_drivers))); return False; } } if (strncmp(kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) { DEBUG(0,("upgrade_to_version_3:moving printer\n")); if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to move printer. Error (%s)\n", tdb_errorstr(tdb_printers))); return False; } if (tdb_delete(tdb_drivers, kbuf) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to delete printer. Error (%s)\n", tdb_errorstr(tdb_drivers))); return False; } } if (strncmp(kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) { DEBUG(0,("upgrade_to_version_3:moving secdesc\n")); if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to move secdesc. Error (%s)\n", tdb_errorstr(tdb_printers))); return False; } if (tdb_delete(tdb_drivers, kbuf) != 0) { SAFE_FREE(dbuf.dptr); DEBUG(0,("upgrade_to_version_3: failed to delete secdesc. Error (%s)\n", tdb_errorstr(tdb_drivers))); return False; } } SAFE_FREE(dbuf.dptr); } return True;}/******************************************************************* Fix an issue with security descriptors. Printer sec_desc must use more than the generic bits that were previously used in <= 3.0.14a. They must also have a owner and group SID assigned. Otherwise, any printers than have been migrated to a Windows host using printmig.exe will not be accessible.*******************************************************************/static int sec_desc_upg_fn( TDB_CONTEXT *the_tdb, TDB_DATA key, TDB_DATA data, void *state ){ prs_struct ps; SEC_DESC_BUF *sd_orig = NULL; SEC_DESC_BUF *sd_new, *sd_store; SEC_DESC *sec, *new_sec; TALLOC_CTX *ctx = state; int result, i; uint32 sd_size; size_t size_new_sec; DOM_SID sid; if (!data.dptr || data.dsize == 0) return 0; if ( strncmp( key.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX) ) != 0 ) return 0; /* upgrade the security descriptor */ ZERO_STRUCT( ps ); prs_init( &ps, 0, ctx, UNMARSHALL ); prs_give_memory( &ps, data.dptr, data.dsize, True ); if ( !sec_io_desc_buf( "sec_desc_upg_fn", &sd_orig, &ps, 1 ) ) { /* delete bad entries */ DEBUG(0,("sec_desc_upg_fn: Failed to parse original sec_desc for %si. Deleting....\n", key.dptr )); tdb_delete( tdb_printers, key ); return 0; } sec = sd_orig->sec; /* is this even valid? */ if ( !sec->dacl ) return 0; /* update access masks */ for ( i=0; i<sec->dacl->num_aces; i++ ) { switch ( sec->dacl->ace[i].info.mask ) { case (GENERIC_READ_ACCESS | GENERIC_WRITE_ACCESS | GENERIC_EXECUTE_ACCESS): sec->dacl->ace[i].info.mask = PRINTER_ACE_PRINT; break; case GENERIC_ALL_ACCESS: sec->dacl->ace[i].info.mask = PRINTER_ACE_FULL_CONTROL; break; case READ_CONTROL_ACCESS: sec->dacl->ace[i].info.mask = PRINTER_ACE_MANAGE_DOCUMENTS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -