2002-04-02 05:10:41 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-01-12 01:49:30 +03:00
RPC pipe client
2005-07-20 19:35:29 +04:00
Copyright ( C ) Gerald Carter 2001 - 2005
2001-01-12 01:49:30 +03:00
Copyright ( C ) Tim Potter 2000
Copyright ( C ) Andrew Tridgell 1992 - 1999
Copyright ( C ) Luke Kenneth Casson Leighton 1996 - 1999
2009-02-25 16:33:59 +03:00
Copyright ( C ) Guenther Deschner 2009
2009-02-09 14:40:12 +03:00
2000-07-07 10:18:00 +04:00
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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2000-07-07 10:18:00 +04:00
( at your option ) any later version .
2009-02-09 14:40:12 +03:00
2000-07-07 10:18:00 +04:00
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 .
2009-02-09 14:40:12 +03:00
2000-07-07 10:18:00 +04:00
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2000-07-07 10:18:00 +04:00
*/
# include "includes.h"
2001-10-12 09:56:23 +04:00
# include "rpcclient.h"
2011-01-19 00:10:30 +03:00
# include "../librpc/gen_ndr/ndr_spoolss_c.h"
2013-01-22 18:57:22 +04:00
# include "../librpc/gen_ndr/ndr_spoolss.h"
2010-05-18 20:26:48 +04:00
# include "rpc_client/cli_spoolss.h"
2010-05-18 20:58:45 +04:00
# include "rpc_client/init_spoolss.h"
2010-07-31 02:47:20 +04:00
# include "nt_printing.h"
2011-02-24 12:47:16 +03:00
# include "../libcli/security/display_sec.h"
2011-02-26 01:34:23 +03:00
# include "../libcli/security/security_descriptor.h"
2011-02-26 02:28:15 +03:00
# include "../libcli/registry/util_reg.h"
2011-05-06 13:47:43 +04:00
# include "libsmb/libsmb.h"
2020-07-03 09:11:20 +03:00
# include "lib/util/smb_strtox.h"
2020-08-07 21:17:34 +03:00
# include "lib/util/string_wrappers.h"
2020-12-01 15:48:03 +03:00
# include "lib/cmdline/cmdline.h"
2000-07-07 10:18:00 +04:00
2009-02-10 17:11:29 +03:00
# define RPCCLIENT_PRINTERNAME(_printername, _cli, _arg) \
{ \
_printername = talloc_asprintf_strupper_m ( mem_ctx , " %s \\ %s " , \
_cli - > srv_name_slash , _arg ) ; \
W_ERROR_HAVE_NO_MEMORY ( _printername ) ; \
}
2001-03-15 10:13:27 +03:00
2003-02-26 02:51:56 +03:00
/**
* @ file
*
* rpcclient module for SPOOLSS rpc pipe .
*
* This generally just parses and checks command lines , and then calls
* a cli_spoolss function .
* */
2001-03-16 01:06:53 +03:00
/****************************************************************************
2005-07-20 19:35:29 +04:00
function to do the mapping between the long architecture name and
the short one .
2001-03-16 01:06:53 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2003-04-23 17:27:35 +04:00
static const char * cmd_spoolss_get_short_archi ( const char * long_archi )
2001-03-16 01:06:53 +03:00
{
int i = - 1 ;
2011-03-01 00:04:29 +03:00
DEBUG ( 107 , ( " Getting architecture dependent directory \n " ) ) ;
2001-03-16 01:06:53 +03:00
do {
i + + ;
} while ( ( archi_table [ i ] . long_archi ! = NULL ) & &
2011-05-13 22:21:30 +04:00
strcasecmp_m ( long_archi , archi_table [ i ] . long_archi ) ) ;
2001-03-16 01:06:53 +03:00
if ( archi_table [ i ] . long_archi = = NULL ) {
DEBUGADD ( 10 , ( " Unknown architecture [%s] ! \n " , long_archi ) ) ;
2003-04-23 17:27:35 +04:00
return NULL ;
2001-03-16 01:06:53 +03:00
}
2003-01-14 11:53:59 +03:00
/* this might be client code - but shouldn't this be an fstrcpy etc? */
2001-03-16 01:06:53 +03:00
DEBUGADD ( 108 , ( " index: [%d] \n " , i ) ) ;
2003-04-23 17:27:35 +04:00
DEBUGADD ( 108 , ( " long architecture: [%s] \n " , archi_table [ i ] . long_archi ) ) ;
DEBUGADD ( 108 , ( " short architecture: [%s] \n " , archi_table [ i ] . short_archi ) ) ;
2001-03-16 01:06:53 +03:00
2003-04-23 17:27:35 +04:00
return archi_table [ i ] . short_archi ;
2001-03-16 01:06:53 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-03-15 05:15:05 +03:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_open_printer_ex ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-03-15 05:15:05 +03:00
{
2002-01-06 06:54:40 +03:00
WERROR werror ;
2009-03-19 00:49:41 +03:00
struct policy_handle hnd ;
2010-06-04 18:55:07 +04:00
uint32_t access_mask = PRINTER_ALL_ACCESS ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 14:40:12 +03:00
2010-06-04 18:55:07 +04:00
if ( argc < 2 ) {
printf ( " Usage: %s <printername> [access_mask] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-15 05:15:05 +03:00
}
2009-02-09 14:40:12 +03:00
2010-06-04 18:55:07 +04:00
if ( argc > = 3 ) {
sscanf ( argv [ 2 ] , " %x " , & access_mask ) ;
}
2001-04-28 04:32:56 +04:00
2001-03-15 10:13:27 +03:00
/* Open the printer handle */
2001-03-15 05:15:05 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
argv [ 1 ] ,
2010-06-04 18:55:07 +04:00
access_mask ,
2009-02-09 20:49:34 +03:00
& hnd ) ;
2002-01-06 06:54:40 +03:00
if ( W_ERROR_IS_OK ( werror ) ) {
2009-02-09 20:49:34 +03:00
printf ( " Printer %s opened successfully \n " , argv [ 1 ] ) ;
2011-01-19 00:10:30 +03:00
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & werror ) ;
2002-01-06 06:54:40 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2009-02-09 14:40:12 +03:00
printf ( " Error closing printer handle! (%s) \n " ,
2002-01-06 06:54:40 +03:00
get_dos_error_msg ( werror ) ) ;
2001-03-15 05:15:05 +03:00
}
}
2003-03-18 09:30:30 +03:00
return werror ;
2001-03-15 05:15:05 +03:00
}
2010-10-02 23:54:32 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static WERROR cmd_spoolss_open_printer ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
WERROR werror ;
struct policy_handle hnd ;
uint32_t access_mask = PRINTER_ALL_ACCESS ;
NTSTATUS status ;
struct spoolss_DevmodeContainer devmode_ctr ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2010-10-02 23:54:32 +04:00
ZERO_STRUCT ( devmode_ctr ) ;
if ( argc < 2 ) {
printf ( " Usage: %s <printername> [access_mask] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > = 3 ) {
sscanf ( argv [ 2 ] , " %x " , & access_mask ) ;
}
/* Open the printer handle */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_OpenPrinter ( b , mem_ctx ,
2010-10-02 23:54:32 +04:00
argv [ 1 ] ,
NULL ,
devmode_ctr ,
access_mask ,
& hnd ,
& werror ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2010-10-02 23:54:32 +04:00
if ( W_ERROR_IS_OK ( werror ) ) {
printf ( " Printer %s opened successfully \n " , argv [ 1 ] ) ;
2011-01-19 00:10:30 +03:00
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & werror ) ;
2010-10-02 23:54:32 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
printf ( " Error closing printer handle! (%s) \n " ,
get_dos_error_msg ( werror ) ) ;
}
}
return werror ;
}
2001-03-15 05:15:05 +03:00
2000-07-14 20:29:22 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-10 00:41:43 +03:00
static void display_print_info0 ( struct spoolss_PrinterInfo0 * r )
2000-07-14 20:29:22 +04:00
{
2009-03-10 00:41:43 +03:00
if ( ! r )
2002-03-07 07:22:16 +03:00
return ;
2000-07-14 20:29:22 +04:00
2009-03-10 00:41:43 +03:00
printf ( " \t printername:[%s] \n " , r - > printername ) ;
printf ( " \t servername:[%s] \n " , r - > servername ) ;
printf ( " \t cjobs:[0x%x] \n " , r - > cjobs ) ;
printf ( " \t total_jobs:[0x%x] \n " , r - > total_jobs ) ;
printf ( " \t total_bytes:[0x%x] \n " , r - > total_bytes ) ;
printf ( " \t :date: [%d]-[%d]-[%d] (%d) \n " , r - > time . year , r - > time . month ,
r - > time . day , r - > time . day_of_week ) ;
printf ( " \t :time: [%d]-[%d]-[%d]-[%d] \n " , r - > time . hour , r - > time . minute ,
r - > time . second , r - > time . millisecond ) ;
printf ( " \t global_counter:[0x%x] \n " , r - > global_counter ) ;
printf ( " \t total_pages:[0x%x] \n " , r - > total_pages ) ;
printf ( " \t version:[0x%x] \n " , r - > version ) ;
printf ( " \t free_build:[0x%x] \n " , r - > free_build ) ;
printf ( " \t spooling:[0x%x] \n " , r - > spooling ) ;
printf ( " \t max_spooling:[0x%x] \n " , r - > max_spooling ) ;
printf ( " \t session_counter:[0x%x] \n " , r - > session_counter ) ;
printf ( " \t num_error_out_of_paper:[0x%x] \n " , r - > num_error_out_of_paper ) ;
printf ( " \t num_error_not_ready:[0x%x] \n " , r - > num_error_not_ready ) ;
printf ( " \t job_error:[0x%x] \n " , r - > job_error ) ;
printf ( " \t number_of_processors:[0x%x] \n " , r - > number_of_processors ) ;
printf ( " \t processor_type:[0x%x] \n " , r - > processor_type ) ;
printf ( " \t high_part_total_bytes:[0x%x] \n " , r - > high_part_total_bytes ) ;
printf ( " \t change_id:[0x%x] \n " , r - > change_id ) ;
printf ( " \t last_error: %s \n " , win_errstr ( r - > last_error ) ) ;
printf ( " \t status:[0x%x] \n " , r - > status ) ;
printf ( " \t enumerate_network_printers:[0x%x] \n " , r - > enumerate_network_printers ) ;
printf ( " \t c_setprinter:[0x%x] \n " , r - > c_setprinter ) ;
printf ( " \t processor_architecture:[0x%x] \n " , r - > processor_architecture ) ;
printf ( " \t processor_level:[0x%x] \n " , r - > processor_level ) ;
printf ( " \t ref_ic:[0x%x] \n " , r - > ref_ic ) ;
printf ( " \t reserved2:[0x%x] \n " , r - > reserved2 ) ;
printf ( " \t reserved3:[0x%x] \n " , r - > reserved3 ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-10 00:41:43 +03:00
static void display_print_info1 ( struct spoolss_PrinterInfo1 * r )
2000-07-14 20:29:22 +04:00
{
2009-03-10 00:41:43 +03:00
printf ( " \t flags:[0x%x] \n " , r - > flags ) ;
printf ( " \t name:[%s] \n " , r - > name ) ;
printf ( " \t description:[%s] \n " , r - > description ) ;
printf ( " \t comment:[%s] \n " , r - > comment ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-10 00:41:43 +03:00
static void display_print_info2 ( struct spoolss_PrinterInfo2 * r )
2000-07-14 20:29:22 +04:00
{
2009-03-10 00:41:43 +03:00
printf ( " \t servername:[%s] \n " , r - > servername ) ;
printf ( " \t printername:[%s] \n " , r - > printername ) ;
printf ( " \t sharename:[%s] \n " , r - > sharename ) ;
printf ( " \t portname:[%s] \n " , r - > portname ) ;
printf ( " \t drivername:[%s] \n " , r - > drivername ) ;
printf ( " \t comment:[%s] \n " , r - > comment ) ;
printf ( " \t location:[%s] \n " , r - > location ) ;
printf ( " \t sepfile:[%s] \n " , r - > sepfile ) ;
printf ( " \t printprocessor:[%s] \n " , r - > printprocessor ) ;
printf ( " \t datatype:[%s] \n " , r - > datatype ) ;
printf ( " \t parameters:[%s] \n " , r - > parameters ) ;
printf ( " \t attributes:[0x%x] \n " , r - > attributes ) ;
printf ( " \t priority:[0x%x] \n " , r - > priority ) ;
printf ( " \t defaultpriority:[0x%x] \n " , r - > defaultpriority ) ;
printf ( " \t starttime:[0x%x] \n " , r - > starttime ) ;
printf ( " \t untiltime:[0x%x] \n " , r - > untiltime ) ;
printf ( " \t status:[0x%x] \n " , r - > status ) ;
printf ( " \t cjobs:[0x%x] \n " , r - > cjobs ) ;
printf ( " \t averageppm:[0x%x] \n " , r - > averageppm ) ;
if ( r - > secdesc )
display_sec_desc ( r - > secdesc ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-10 00:41:43 +03:00
static void display_print_info3 ( struct spoolss_PrinterInfo3 * r )
2000-07-14 20:29:22 +04:00
{
2009-03-10 00:41:43 +03:00
display_sec_desc ( r - > secdesc ) ;
2002-03-07 07:22:16 +03:00
printf ( " \n " ) ;
2000-07-14 20:29:22 +04:00
}
2004-08-26 01:26:37 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-05-04 19:25:41 +04:00
static void display_print_info4 ( struct spoolss_PrinterInfo4 * r )
{
printf ( " \t servername:[%s] \n " , r - > servername ) ;
printf ( " \t printername:[%s] \n " , r - > printername ) ;
printf ( " \t attributes:[0x%x] \n " , r - > attributes ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_info5 ( struct spoolss_PrinterInfo5 * r )
{
printf ( " \t printername:[%s] \n " , r - > printername ) ;
printf ( " \t portname:[%s] \n " , r - > portname ) ;
printf ( " \t attributes:[0x%x] \n " , r - > attributes ) ;
printf ( " \t device_not_selected_timeout:[0x%x] \n " , r - > device_not_selected_timeout ) ;
printf ( " \t transmission_retry_timeout:[0x%x] \n " , r - > transmission_retry_timeout ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_info6 ( struct spoolss_PrinterInfo6 * r )
{
printf ( " \t status:[0x%x] \n " , r - > status ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-14 05:08:06 +03:00
static void display_print_info7 ( struct spoolss_PrinterInfo7 * r )
2004-08-26 01:26:37 +04:00
{
2009-02-14 05:08:06 +03:00
printf ( " \t guid:[%s] \n " , r - > guid ) ;
printf ( " \t action:[0x%x] \n " , r - > action ) ;
2009-05-04 19:25:41 +04:00
printf ( " \n " ) ;
2004-08-26 01:26:37 +04:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-01-12 01:49:30 +03:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_printers ( struct rpc_pipe_client * cli ,
2009-03-10 00:41:43 +03:00
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
2000-07-14 20:29:22 +04:00
{
2002-01-06 12:03:48 +03:00
WERROR result ;
2009-03-10 00:41:43 +03:00
uint32_t level = 1 ;
union spoolss_PrinterInfo * info ;
uint32_t i , count ;
const char * name ;
2009-03-20 16:47:13 +03:00
uint32_t flags = PRINTER_ENUM_LOCAL ;
2001-04-28 04:32:56 +04:00
2009-03-20 16:47:13 +03:00
if ( argc > 4 ) {
printf ( " Usage: %s [level] [name] [flags] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-01-12 01:49:30 +03:00
}
2009-03-10 00:41:43 +03:00
if ( argc > = 2 ) {
level = atoi ( argv [ 1 ] ) ;
2001-01-12 01:49:30 +03:00
}
2009-03-20 16:47:13 +03:00
if ( argc > = 3 ) {
2009-03-10 00:41:43 +03:00
name = argv [ 2 ] ;
} else {
name = cli - > srv_name_slash ;
}
2002-01-06 12:03:48 +03:00
2009-03-20 16:47:13 +03:00
if ( argc = = 4 ) {
flags = atoi ( argv [ 3 ] ) ;
}
2009-03-10 00:41:43 +03:00
result = rpccli_spoolss_enumprinters ( cli , mem_ctx ,
2009-03-20 16:47:13 +03:00
flags ,
2009-03-10 00:41:43 +03:00
name ,
level ,
0 ,
& count ,
& info ) ;
2002-01-06 12:03:48 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
2002-03-07 07:29:13 +03:00
2009-03-10 00:41:43 +03:00
if ( ! count ) {
2002-03-07 07:29:13 +03:00
printf ( " No printers returned. \n " ) ;
goto done ;
}
2009-02-09 14:40:12 +03:00
2009-03-10 00:41:43 +03:00
for ( i = 0 ; i < count ; i + + ) {
switch ( level ) {
2002-03-07 07:22:16 +03:00
case 0 :
2009-03-10 00:41:43 +03:00
display_print_info0 ( & info [ i ] . info0 ) ;
2002-03-07 07:22:16 +03:00
break ;
case 1 :
2009-03-10 00:41:43 +03:00
display_print_info1 ( & info [ i ] . info1 ) ;
2002-03-07 07:22:16 +03:00
break ;
case 2 :
2009-03-10 00:41:43 +03:00
display_print_info2 ( & info [ i ] . info2 ) ;
2002-03-07 07:22:16 +03:00
break ;
case 3 :
2009-03-10 00:41:43 +03:00
display_print_info3 ( & info [ i ] . info3 ) ;
2002-03-07 07:22:16 +03:00
break ;
2009-05-04 19:25:41 +04:00
case 4 :
display_print_info4 ( & info [ i ] . info4 ) ;
break ;
case 5 :
display_print_info5 ( & info [ i ] . info5 ) ;
break ;
case 6 :
display_print_info6 ( & info [ i ] . info6 ) ;
break ;
2002-03-07 07:22:16 +03:00
default :
2009-03-10 00:41:43 +03:00
printf ( " unknown info level %d \n " , level ) ;
2002-03-07 07:22:16 +03:00
goto done ;
}
2001-01-12 01:49:30 +03:00
}
}
2009-03-10 00:41:43 +03:00
done :
2001-01-12 01:49:30 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2000-07-14 20:29:22 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-07 01:36:31 +03:00
static void display_port_info_1 ( struct spoolss_PortInfo1 * r )
2000-07-14 20:29:22 +04:00
{
2009-03-07 01:36:31 +03:00
printf ( " \t Port Name: \t [%s] \n " , r - > port_name ) ;
2001-01-12 01:49:30 +03:00
}
2000-07-14 20:29:22 +04:00
2001-01-12 01:49:30 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-03-07 01:36:31 +03:00
static void display_port_info_2 ( struct spoolss_PortInfo2 * r )
2001-01-12 01:49:30 +03:00
{
2009-03-07 01:36:31 +03:00
printf ( " \t Port Name: \t [%s] \n " , r - > port_name ) ;
printf ( " \t Monitor Name: \t [%s] \n " , r - > monitor_name ) ;
printf ( " \t Description: \t [%s] \n " , r - > description ) ;
2003-08-07 04:55:35 +04:00
printf ( " \t Port Type: \t " ) ;
2009-03-07 01:36:31 +03:00
if ( r - > port_type ) {
2003-08-07 04:55:35 +04:00
int comma = 0 ; /* hack */
printf ( " [ " ) ;
2009-03-07 01:36:31 +03:00
if ( r - > port_type & SPOOLSS_PORT_TYPE_READ ) {
2003-08-07 04:55:35 +04:00
printf ( " Read " ) ;
comma = 1 ;
}
2009-03-07 01:36:31 +03:00
if ( r - > port_type & SPOOLSS_PORT_TYPE_WRITE ) {
2003-08-07 04:55:35 +04:00
printf ( " %sWrite " , comma ? " , " : " " ) ;
comma = 1 ;
}
/* These two have slightly different interpretations
on 95 / 98 / ME but I ' m disregarding that for now */
2009-03-07 01:36:31 +03:00
if ( r - > port_type & SPOOLSS_PORT_TYPE_REDIRECTED ) {
2003-08-07 04:55:35 +04:00
printf ( " %sRedirected " , comma ? " , " : " " ) ;
comma = 1 ;
}
2009-03-07 01:36:31 +03:00
if ( r - > port_type & SPOOLSS_PORT_TYPE_NET_ATTACHED ) {
2003-08-07 04:55:35 +04:00
printf ( " %sNet-Attached " , comma ? " , " : " " ) ;
}
printf ( " ] \n " ) ;
} else {
printf ( " [Unset] \n " ) ;
}
2009-03-07 01:36:31 +03:00
printf ( " \t Reserved: \t [%d] \n " , r - > reserved ) ;
2001-01-12 01:49:30 +03:00
printf ( " \n " ) ;
}
2000-07-14 20:29:22 +04:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2000-07-14 20:29:22 +04:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_ports ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2001-01-12 01:49:30 +03:00
{
2002-01-06 12:03:48 +03:00
WERROR result ;
2009-03-11 13:48:58 +03:00
uint32_t level = 1 ;
uint32_t count ;
2009-03-07 01:36:31 +03:00
union spoolss_PortInfo * info ;
2009-02-09 14:40:12 +03:00
2001-03-15 10:13:27 +03:00
if ( argc > 2 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-01-12 01:49:30 +03:00
}
2009-02-09 14:40:12 +03:00
2009-03-11 13:48:58 +03:00
if ( argc = = 2 ) {
level = atoi ( argv [ 1 ] ) ;
}
2000-07-14 20:29:22 +04:00
2001-03-14 23:22:57 +03:00
/* Enumerate ports */
2002-01-06 12:03:48 +03:00
2009-03-07 01:36:31 +03:00
result = rpccli_spoolss_enumports ( cli , mem_ctx ,
cli - > srv_name_slash ,
2009-03-11 13:48:58 +03:00
level ,
2009-03-07 01:36:31 +03:00
0 ,
2009-03-11 13:48:58 +03:00
& count ,
2009-03-07 01:36:31 +03:00
& info ) ;
2002-01-06 12:03:48 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
2001-01-12 01:49:30 +03:00
int i ;
2009-03-11 13:48:58 +03:00
for ( i = 0 ; i < count ; i + + ) {
switch ( level ) {
2001-01-12 01:49:30 +03:00
case 1 :
2009-03-07 01:36:31 +03:00
display_port_info_1 ( & info [ i ] . info1 ) ;
2002-01-06 12:03:48 +03:00
break ;
2001-01-12 01:49:30 +03:00
case 2 :
2009-03-07 01:36:31 +03:00
display_port_info_2 ( & info [ i ] . info2 ) ;
2001-01-12 01:49:30 +03:00
break ;
default :
2009-03-11 13:48:58 +03:00
printf ( " unknown info level %d \n " , level ) ;
2001-01-12 01:49:30 +03:00
break ;
}
2000-07-26 01:07:46 +04:00
}
}
2009-02-09 14:40:12 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2000-07-26 01:07:46 +04:00
}
2000-08-08 10:57:48 +04:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_setprinter ( struct rpc_pipe_client * cli ,
2002-04-02 05:10:41 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-04-02 05:10:41 +04:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-04-02 05:10:41 +04:00
WERROR result ;
2009-02-14 05:08:06 +03:00
NTSTATUS status ;
2009-03-19 14:53:01 +03:00
uint32_t info_level = 2 ;
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info ;
struct spoolss_SetPrinterInfoCtr info_ctr ;
2010-05-10 16:44:30 +04:00
struct spoolss_SetPrinterInfo2 info2 ;
2009-02-10 17:11:29 +03:00
const char * printername , * comment = NULL ;
2009-02-14 05:08:06 +03:00
struct spoolss_DevmodeContainer devmode_ctr ;
struct sec_desc_buf secdesc_ctr ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2002-04-02 05:10:41 +04:00
if ( argc = = 1 | | argc > 3 ) {
printf ( " Usage: %s printername comment \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-04-02 05:10:41 +04:00
}
/* Open a printer handle */
if ( argc = = 3 ) {
2009-02-10 17:11:29 +03:00
comment = argv [ 2 ] ;
2002-04-02 05:10:41 +04:00
}
2009-02-14 05:08:06 +03:00
ZERO_STRUCT ( devmode_ctr ) ;
ZERO_STRUCT ( secdesc_ctr ) ;
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-04-02 05:10:41 +04:00
/* get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
PRINTER_ALL_ACCESS ,
& pol ) ;
2002-04-02 05:10:41 +04:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Get printer info */
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
info_level ,
0 ,
& info ) ;
2002-04-02 05:10:41 +04:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Modify the comment. */
2010-06-03 18:30:55 +04:00
spoolss_printerinfo2_to_setprinterinfo2 ( & info . info2 , & info2 ) ;
info2 . comment = comment ;
2002-04-02 05:10:41 +04:00
2009-02-14 05:08:06 +03:00
info_ctr . level = 2 ;
2010-05-10 16:44:30 +04:00
info_ctr . info . info2 = & info2 ;
2009-02-14 05:08:06 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetPrinter ( b , mem_ctx ,
2009-02-14 05:08:06 +03:00
& pol ,
& info_ctr ,
& devmode_ctr ,
& secdesc_ctr ,
0 , /* command */
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-04-02 05:10:41 +04:00
if ( W_ERROR_IS_OK ( result ) )
printf ( " Success in setting comment. \n " ) ;
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
}
2002-04-02 05:10:41 +04:00
2003-03-18 09:30:30 +03:00
return result ;
2002-04-02 05:10:41 +04:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_setprintername ( struct rpc_pipe_client * cli ,
2004-06-10 17:07:44 +04:00
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2004-06-10 17:07:44 +04:00
WERROR result ;
2009-02-14 05:08:06 +03:00
NTSTATUS status ;
2009-03-19 14:53:01 +03:00
uint32_t info_level = 2 ;
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info ;
2009-02-10 17:11:29 +03:00
const char * printername ,
* new_printername = NULL ;
2009-02-14 05:08:06 +03:00
struct spoolss_SetPrinterInfoCtr info_ctr ;
2010-05-10 16:44:30 +04:00
struct spoolss_SetPrinterInfo2 info2 ;
2009-02-14 05:08:06 +03:00
struct spoolss_DevmodeContainer devmode_ctr ;
struct sec_desc_buf secdesc_ctr ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-14 05:08:06 +03:00
ZERO_STRUCT ( devmode_ctr ) ;
ZERO_STRUCT ( secdesc_ctr ) ;
2004-06-10 17:07:44 +04:00
if ( argc = = 1 | | argc > 3 ) {
printf ( " Usage: %s printername new_printername \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
/* Open a printer handle */
if ( argc = = 3 ) {
2009-02-10 17:11:29 +03:00
new_printername = argv [ 2 ] ;
2004-06-10 17:07:44 +04:00
}
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2004-06-10 17:07:44 +04:00
/* get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
PRINTER_ALL_ACCESS ,
& pol ) ;
2004-06-10 17:07:44 +04:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Get printer info */
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
info_level ,
0 ,
& info ) ;
2004-06-10 17:07:44 +04:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Modify the printername. */
2010-06-03 18:30:55 +04:00
spoolss_printerinfo2_to_setprinterinfo2 ( & info . info2 , & info2 ) ;
info2 . printername = new_printername ;
2009-02-14 05:08:06 +03:00
2010-05-10 16:44:30 +04:00
info_ctr . level = 2 ;
info_ctr . info . info2 = & info2 ;
2009-02-14 05:08:06 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetPrinter ( b , mem_ctx ,
2009-02-14 05:08:06 +03:00
& pol ,
& info_ctr ,
& devmode_ctr ,
& secdesc_ctr ,
0 , /* command */
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2004-06-10 17:07:44 +04:00
if ( W_ERROR_IS_OK ( result ) )
printf ( " Success in setting printername. \n " ) ;
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
}
2004-06-10 17:07:44 +04:00
return result ;
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_getprinter ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2000-08-08 10:57:48 +04:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-02-19 05:12:01 +03:00
WERROR result ;
2009-03-11 13:52:04 +03:00
uint32_t level = 1 ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2001-01-12 01:49:30 +03:00
if ( argc = = 1 | | argc > 3 ) {
2001-04-28 04:32:56 +04:00
printf ( " Usage: %s <printername> [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2000-08-08 10:57:48 +04:00
}
2001-01-12 01:49:30 +03:00
/* Open a printer handle */
if ( argc = = 3 ) {
2009-03-11 13:52:04 +03:00
level = atoi ( argv [ 2 ] ) ;
2001-01-12 01:49:30 +03:00
}
2000-08-10 00:14:29 +04:00
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2009-02-09 14:40:12 +03:00
2001-03-15 10:13:27 +03:00
/* get a printer handle */
2002-01-06 06:54:40 +03:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& pol ) ;
2009-03-11 13:52:04 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2001-01-12 01:49:30 +03:00
goto done ;
2009-03-11 13:52:04 +03:00
}
2009-02-09 14:40:12 +03:00
2001-01-12 01:49:30 +03:00
/* Get printer info */
2002-01-06 06:54:40 +03:00
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
2009-03-11 13:52:04 +03:00
level ,
2009-02-14 05:08:06 +03:00
0 ,
& info ) ;
2009-03-11 13:52:04 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2001-01-12 01:49:30 +03:00
goto done ;
2009-03-11 13:52:04 +03:00
}
2001-01-12 01:49:30 +03:00
/* Display printer info */
2009-03-11 13:52:04 +03:00
switch ( level ) {
2009-02-09 14:40:12 +03:00
case 0 :
2009-03-10 00:41:43 +03:00
display_print_info0 ( & info . info0 ) ;
2001-01-12 01:49:30 +03:00
break ;
case 1 :
2009-03-10 00:41:43 +03:00
display_print_info1 ( & info . info1 ) ;
2001-01-12 01:49:30 +03:00
break ;
case 2 :
2009-03-10 00:41:43 +03:00
display_print_info2 ( & info . info2 ) ;
2001-01-12 01:49:30 +03:00
break ;
case 3 :
2009-03-10 00:41:43 +03:00
display_print_info3 ( & info . info3 ) ;
2001-01-12 01:49:30 +03:00
break ;
2009-05-04 19:25:41 +04:00
case 4 :
display_print_info4 ( & info . info4 ) ;
break ;
case 5 :
display_print_info5 ( & info . info5 ) ;
break ;
case 6 :
display_print_info6 ( & info . info6 ) ;
break ;
2004-08-26 01:26:37 +04:00
case 7 :
2009-02-14 05:08:06 +03:00
display_print_info7 ( & info . info7 ) ;
2004-08-26 01:26:37 +04:00
break ;
2001-01-12 01:49:30 +03:00
default :
2009-03-11 13:52:04 +03:00
printf ( " unknown info level %d \n " , level ) ;
2001-01-12 01:49:30 +03:00
break ;
2000-08-08 10:57:48 +04:00
}
2009-02-09 14:40:12 +03:00
done :
2009-03-11 13:52:04 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
2009-03-11 13:52:04 +03:00
}
2001-01-12 20:53:47 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2000-08-08 10:57:48 +04:00
}
2000-08-10 00:14:29 +04:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2012-04-19 16:00:36 +04:00
static void display_reg_value ( const char * name , enum winreg_Type type , DATA_BLOB blob )
2002-11-11 18:43:09 +03:00
{
2009-09-30 22:00:52 +04:00
const char * text = NULL ;
2002-11-11 18:43:09 +03:00
2012-04-19 16:00:36 +04:00
switch ( type ) {
2002-11-11 18:43:09 +03:00
case REG_DWORD :
2017-05-03 12:31:20 +03:00
if ( blob . length > = sizeof ( uint32_t ) ) {
2012-04-19 16:00:36 +04:00
printf ( " %s: REG_DWORD: 0x%08x \n " , name , IVAL ( blob . data , 0 ) ) ;
} else {
printf ( " %s: REG_DWORD: <invalid> \n " , name ) ;
}
2002-11-11 18:43:09 +03:00
break ;
case REG_SZ :
2010-05-10 02:42:06 +04:00
pull_reg_sz ( talloc_tos ( ) , & blob , & text ) ;
2012-04-19 16:00:36 +04:00
printf ( " %s: REG_SZ: %s \n " , name , text ? text : " " ) ;
2002-11-11 18:43:09 +03:00
break ;
2005-08-08 01:23:38 +04:00
case REG_BINARY : {
2012-04-19 16:00:36 +04:00
char * hex = hex_encode_talloc ( NULL , blob . data , blob . length ) ;
2005-08-08 01:23:38 +04:00
size_t i , len ;
2012-04-19 16:00:36 +04:00
printf ( " %s: REG_BINARY: " , name ) ;
2005-08-08 01:23:38 +04:00
len = strlen ( hex ) ;
for ( i = 0 ; i < len ; i + + ) {
if ( hex [ i ] = = ' \0 ' ) {
break ;
}
if ( i % 40 = = 0 ) {
putchar ( ' \n ' ) ;
}
putchar ( hex [ i ] ) ;
}
2006-02-20 20:59:58 +03:00
TALLOC_FREE ( hex ) ;
2005-08-08 01:23:38 +04:00
putchar ( ' \n ' ) ;
2002-11-11 18:43:09 +03:00
break ;
2005-08-08 01:23:38 +04:00
}
2002-11-11 18:43:09 +03:00
case REG_MULTI_SZ : {
2009-09-30 01:22:46 +04:00
uint32_t i ;
const char * * values ;
2006-07-11 22:01:26 +04:00
2010-05-10 02:42:06 +04:00
if ( ! pull_reg_multi_sz ( NULL , & blob , & values ) ) {
2009-09-30 01:22:46 +04:00
d_printf ( " pull_reg_multi_sz failed \n " ) ;
2006-07-11 22:01:26 +04:00
break ;
}
2012-04-19 16:00:36 +04:00
printf ( " %s: REG_MULTI_SZ: \n " , name ) ;
2009-09-30 01:22:46 +04:00
for ( i = 0 ; values [ i ] ! = NULL ; i + + ) {
2006-07-11 22:01:26 +04:00
d_printf ( " %s \n " , values [ i ] ) ;
2002-11-11 18:43:09 +03:00
}
2006-07-11 22:01:26 +04:00
TALLOC_FREE ( values ) ;
break ;
2002-11-11 18:43:09 +03:00
}
default :
2012-04-19 16:00:36 +04:00
printf ( " %s: unknown type %d \n " , name , type ) ;
2002-11-11 18:43:09 +03:00
}
2009-02-09 14:40:12 +03:00
2002-11-11 18:43:09 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-03-14 03:28:55 +03:00
static void display_printer_data ( const char * v ,
enum winreg_Type type ,
2010-03-04 17:46:28 +03:00
uint8_t * data ,
uint32_t length )
2009-03-14 03:28:55 +03:00
{
int i ;
2010-03-04 17:46:28 +03:00
union spoolss_PrinterData r ;
DATA_BLOB blob = data_blob_const ( data , length ) ;
WERROR result ;
2013-01-22 18:57:22 +04:00
enum ndr_err_code ndr_err ;
2010-03-04 17:46:28 +03:00
result = pull_spoolss_PrinterData ( talloc_tos ( ) , & blob , & r , type ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
return ;
}
2009-03-14 03:28:55 +03:00
switch ( type ) {
case REG_DWORD :
2010-03-04 17:46:28 +03:00
printf ( " %s: REG_DWORD: 0x%08x \n " , v , r . value ) ;
2009-03-14 03:28:55 +03:00
break ;
case REG_SZ :
2010-03-04 17:46:28 +03:00
printf ( " %s: REG_SZ: %s \n " , v , r . string ) ;
2009-03-14 03:28:55 +03:00
break ;
case REG_BINARY : {
char * hex = hex_encode_talloc ( NULL ,
2010-03-04 17:46:28 +03:00
r . binary . data , r . binary . length ) ;
2009-03-14 03:28:55 +03:00
size_t len ;
printf ( " %s: REG_BINARY: " , v ) ;
len = strlen ( hex ) ;
for ( i = 0 ; i < len ; i + + ) {
if ( hex [ i ] = = ' \0 ' ) {
break ;
}
if ( i % 40 = = 0 ) {
putchar ( ' \n ' ) ;
}
putchar ( hex [ i ] ) ;
}
TALLOC_FREE ( hex ) ;
putchar ( ' \n ' ) ;
2015-01-30 15:18:20 +03:00
putchar ( ' \n ' ) ;
2013-01-22 18:57:22 +04:00
if ( strequal ( v , " OsVersion " ) ) {
struct spoolss_OSVersion os ;
ndr_err = ndr_pull_struct_blob ( & blob , talloc_tos ( ) , & os ,
( ndr_pull_flags_fn_t ) ndr_pull_spoolss_OSVersion ) ;
if ( NDR_ERR_CODE_IS_SUCCESS ( ndr_err ) ) {
2015-01-30 15:18:20 +03:00
// add output here;
printf ( " OsMajor: %u \n " , os . major ) ;
printf ( " OsMinor: %u \n " , os . minor ) ;
printf ( " OsBuild: %u \n " , os . build ) ;
2013-01-22 18:57:22 +04:00
NDR_PRINT_DEBUG ( spoolss_OSVersion , & os ) ;
}
}
if ( strequal ( v , " OsVersionEx " ) ) {
struct spoolss_OSVersionEx os ;
ndr_err = ndr_pull_struct_blob ( & blob , talloc_tos ( ) , & os ,
( ndr_pull_flags_fn_t ) ndr_pull_spoolss_OSVersionEx ) ;
if ( NDR_ERR_CODE_IS_SUCCESS ( ndr_err ) ) {
2015-01-30 15:18:20 +03:00
printf ( " OsMajor: %u \n " , os . major ) ;
printf ( " OsMinor: %u \n " , os . minor ) ;
printf ( " OsBuild: %u \n " , os . build ) ;
printf ( " ServicePackMajor: %u \n " , os . service_pack_major ) ;
printf ( " ServicePackMinor: %u \n " , os . service_pack_minor ) ;
2013-01-22 18:57:22 +04:00
NDR_PRINT_DEBUG ( spoolss_OSVersionEx , & os ) ;
}
}
2009-03-14 03:28:55 +03:00
break ;
}
case REG_MULTI_SZ :
printf ( " %s: REG_MULTI_SZ: " , v ) ;
2010-03-04 17:46:28 +03:00
for ( i = 0 ; r . string_array [ i ] ! = NULL ; i + + ) {
printf ( " %s " , r . string_array [ i ] ) ;
2009-03-14 03:28:55 +03:00
}
printf ( " \n " ) ;
break ;
default :
printf ( " %s: unknown type 0x%02x: \n " , v , type ) ;
break ;
}
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_getprinterdata ( struct rpc_pipe_client * cli ,
2002-11-11 18:43:09 +03:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-11-11 18:43:09 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-11-11 18:43:09 +03:00
WERROR result ;
2009-02-09 21:02:56 +03:00
fstring printername ;
2003-02-26 02:51:56 +03:00
const char * valuename ;
2009-03-14 03:28:55 +03:00
enum winreg_Type type ;
2010-03-04 17:46:28 +03:00
uint8_t * data ;
uint32_t needed ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2002-11-11 18:43:09 +03:00
if ( argc ! = 3 ) {
printf ( " Usage: %s <printername> <valuename> \n " , argv [ 0 ] ) ;
printf ( " <printername> of . queries print server \n " ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-11-11 18:43:09 +03:00
}
valuename = argv [ 2 ] ;
/* Open a printer handle */
if ( strncmp ( argv [ 1 ] , " . " , sizeof ( " . " ) ) = = 0 )
2009-02-09 20:10:18 +03:00
fstrcpy ( printername , cli - > srv_name_slash ) ;
2002-11-11 18:43:09 +03:00
else
2009-02-09 20:10:18 +03:00
slprintf ( printername , sizeof ( printername ) - 1 , " %s \\ %s " ,
cli - > srv_name_slash , argv [ 1 ] ) ;
2009-02-09 14:40:12 +03:00
2002-11-11 18:43:09 +03:00
/* get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& pol ) ;
2002-11-11 18:43:09 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
2009-02-09 14:40:12 +03:00
2002-11-11 18:43:09 +03:00
/* Get printer info */
2009-03-14 03:28:55 +03:00
result = rpccli_spoolss_getprinterdata ( cli , mem_ctx ,
& pol ,
valuename ,
0 ,
& type ,
2010-03-04 17:46:28 +03:00
& needed ,
2009-03-14 03:28:55 +03:00
& data ) ;
2002-11-11 18:43:09 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Display printer data */
2010-03-04 17:46:28 +03:00
display_printer_data ( valuename , type , data , needed ) ;
2009-02-09 14:40:12 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
}
2002-11-11 18:43:09 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2002-11-11 18:43:09 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_getprinterdataex ( struct rpc_pipe_client * cli ,
2002-11-11 18:43:09 +03:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-11-11 18:43:09 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-11-11 18:43:09 +03:00
WERROR result ;
2009-02-13 00:06:54 +03:00
NTSTATUS status ;
2009-02-09 21:02:56 +03:00
fstring printername ;
2003-02-26 02:51:56 +03:00
const char * valuename , * keyname ;
2002-11-11 18:43:09 +03:00
2009-03-16 18:02:21 +03:00
enum winreg_Type type ;
2010-03-04 17:46:28 +03:00
uint8_t * data = NULL ;
2009-02-13 00:06:54 +03:00
uint32_t offered = 0 ;
uint32_t needed ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-13 00:06:54 +03:00
2002-11-11 18:43:09 +03:00
if ( argc ! = 4 ) {
2009-02-09 14:40:12 +03:00
printf ( " Usage: %s <printername> <keyname> <valuename> \n " ,
2002-11-11 18:43:09 +03:00
argv [ 0 ] ) ;
printf ( " <printername> of . queries print server \n " ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-11-11 18:43:09 +03:00
}
valuename = argv [ 3 ] ;
keyname = argv [ 2 ] ;
/* Open a printer handle */
if ( strncmp ( argv [ 1 ] , " . " , sizeof ( " . " ) ) = = 0 )
2009-02-09 20:10:18 +03:00
fstrcpy ( printername , cli - > srv_name_slash ) ;
2002-11-11 18:43:09 +03:00
else
2009-02-09 14:40:12 +03:00
slprintf ( printername , sizeof ( printername ) - 1 , " %s \\ %s " ,
2009-02-09 20:10:18 +03:00
cli - > srv_name_slash , argv [ 1 ] ) ;
2009-02-09 14:40:12 +03:00
2002-11-11 18:43:09 +03:00
/* get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& pol ) ;
2002-11-11 18:43:09 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
2009-02-09 14:40:12 +03:00
2002-11-11 18:43:09 +03:00
/* Get printer info */
2010-03-04 17:46:28 +03:00
data = talloc_zero_array ( mem_ctx , uint8_t , offered ) ;
if ( ! data ) {
goto done ;
}
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrinterDataEx ( b , mem_ctx ,
2009-02-13 00:06:54 +03:00
& pol ,
keyname ,
valuename ,
2009-12-07 13:54:26 +03:00
& type ,
2010-03-04 17:46:28 +03:00
data ,
offered ,
2009-02-13 00:06:54 +03:00
& needed ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2009-02-13 00:06:54 +03:00
if ( W_ERROR_EQUAL ( result , WERR_MORE_DATA ) ) {
offered = needed ;
2010-03-04 17:46:28 +03:00
data = talloc_zero_array ( mem_ctx , uint8_t , offered ) ;
if ( ! data ) {
goto done ;
}
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrinterDataEx ( b , mem_ctx ,
2009-02-13 00:06:54 +03:00
& pol ,
keyname ,
valuename ,
2009-12-07 13:54:26 +03:00
& type ,
2010-03-04 17:46:28 +03:00
data ,
offered ,
2009-02-13 00:06:54 +03:00
& needed ,
& result ) ;
}
if ( ! NT_STATUS_IS_OK ( status ) ) {
2011-01-19 00:10:30 +03:00
result = ntstatus_to_werror ( status ) ;
2009-02-13 00:06:54 +03:00
goto done ;
}
2002-11-11 18:43:09 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
/* Display printer data */
2010-03-04 17:46:28 +03:00
display_printer_data ( valuename , type , data , needed ) ;
2002-11-11 18:43:09 +03:00
2009-02-09 14:40:12 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
}
2002-11-11 18:43:09 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2002-11-11 18:43:09 +03:00
}
2001-03-15 10:13:27 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-02-25 00:20:30 +03:00
static void display_print_driver1 ( struct spoolss_DriverInfo1 * r )
{
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 1: \n " ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \n " ) ;
2009-02-25 00:20:30 +03:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver2 ( struct spoolss_DriverInfo2 * r )
{
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 2: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \n " ) ;
2009-02-25 00:20:30 +03:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver3 ( struct spoolss_DriverInfo3 * r )
{
int i ;
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 3: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \t Helpfile: [%s] \n " , r - > help_file ) ;
2009-02-25 00:20:30 +03:00
2009-05-04 19:25:41 +04:00
for ( i = 0 ; r - > dependent_files & & r - > dependent_files [ i ] ! = NULL ; i + + ) {
2009-02-25 00:20:30 +03:00
printf ( " \t Dependentfiles: [%s] \n " , r - > dependent_files [ i ] ) ;
}
2009-05-04 19:25:41 +04:00
printf ( " \t Monitorname: [%s] \n " , r - > monitor_name ) ;
printf ( " \t Defaultdatatype: [%s] \n " , r - > default_datatype ) ;
2009-02-25 00:20:30 +03:00
printf ( " \n " ) ;
2009-05-04 19:25:41 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver4 ( struct spoolss_DriverInfo4 * r )
{
int i ;
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 4: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \t Helpfile: [%s] \n " , r - > help_file ) ;
for ( i = 0 ; r - > dependent_files & & r - > dependent_files [ i ] ! = NULL ; i + + ) {
printf ( " \t Dependentfiles: [%s] \n " , r - > dependent_files [ i ] ) ;
}
2009-02-25 00:20:30 +03:00
printf ( " \t Monitorname: [%s] \n " , r - > monitor_name ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Defaultdatatype: [%s] \n " , r - > default_datatype ) ;
for ( i = 0 ; r - > previous_names & & r - > previous_names [ i ] ! = NULL ; i + + ) {
printf ( " \t Previous Names: [%s] \n " , r - > previous_names [ i ] ) ;
}
printf ( " \n " ) ;
2009-02-25 00:20:30 +03:00
}
2009-05-04 19:25:41 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver5 ( struct spoolss_DriverInfo5 * r )
{
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 5: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \t Driver Attributes: [0x%x] \n " , r - > driver_attributes ) ;
printf ( " \t Config Version: [0x%x] \n " , r - > config_version ) ;
printf ( " \t Driver Version: [0x%x] \n " , r - > driver_version ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver6 ( struct spoolss_DriverInfo6 * r )
{
int i ;
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 6: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \t Helpfile: [%s] \n " , r - > help_file ) ;
for ( i = 0 ; r - > dependent_files & & r - > dependent_files [ i ] ! = NULL ; i + + ) {
printf ( " \t Dependentfiles: [%s] \n " , r - > dependent_files [ i ] ) ;
}
printf ( " \t Monitorname: [%s] \n " , r - > monitor_name ) ;
printf ( " \t Defaultdatatype: [%s] \n " , r - > default_datatype ) ;
for ( i = 0 ; r - > previous_names & & r - > previous_names [ i ] ! = NULL ; i + + ) {
printf ( " \t Previous Names: [%s] \n " , r - > previous_names [ i ] ) ;
}
printf ( " \t Driver Date: [%s] \n " , nt_time_string ( talloc_tos ( ) , r - > driver_date ) ) ;
2009-05-12 08:56:57 +04:00
printf ( " \t Driver Version: [0x%016llx] \n " , ( long long unsigned int ) r - > driver_version ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Manufacturer Name: [%s] \n " , r - > manufacturer_name ) ;
printf ( " \t Manufacturer Url: [%s] \n " , r - > manufacturer_url ) ;
printf ( " \t Hardware ID: [%s] \n " , r - > hardware_id ) ;
printf ( " \t Provider: [%s] \n " , r - > provider ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_print_driver8 ( struct spoolss_DriverInfo8 * r )
{
int i ;
if ( ! r ) {
return ;
}
printf ( " Printer Driver Info 8: \n " ) ;
printf ( " \t Version: [%x] \n " , r - > version ) ;
printf ( " \t Driver Name: [%s] \n " , r - > driver_name ) ;
printf ( " \t Architecture: [%s] \n " , r - > architecture ) ;
printf ( " \t Driver Path: [%s] \n " , r - > driver_path ) ;
printf ( " \t Datafile: [%s] \n " , r - > data_file ) ;
printf ( " \t Configfile: [%s] \n " , r - > config_file ) ;
printf ( " \t Helpfile: [%s] \n " , r - > help_file ) ;
printf ( " \t Monitorname: [%s] \n " , r - > monitor_name ) ;
printf ( " \t Defaultdatatype: [%s] \n " , r - > default_datatype ) ;
for ( i = 0 ; r - > dependent_files & & r - > dependent_files [ i ] ! = NULL ; i + + ) {
printf ( " \t Dependentfiles: [%s] \n " , r - > dependent_files [ i ] ) ;
}
for ( i = 0 ; r - > previous_names & & r - > previous_names [ i ] ! = NULL ; i + + ) {
printf ( " \t Previous Names: [%s] \n " , r - > previous_names [ i ] ) ;
}
printf ( " \t Driver Date: [%s] \n " , nt_time_string ( talloc_tos ( ) , r - > driver_date ) ) ;
2009-05-12 08:56:57 +04:00
printf ( " \t Driver Version: [0x%016llx] \n " , ( long long unsigned int ) r - > driver_version ) ;
2009-05-04 19:25:41 +04:00
printf ( " \t Manufacturer Name: [%s] \n " , r - > manufacturer_name ) ;
printf ( " \t Manufacturer Url: [%s] \n " , r - > manufacturer_url ) ;
printf ( " \t Hardware ID: [%s] \n " , r - > hardware_id ) ;
printf ( " \t Provider: [%s] \n " , r - > provider ) ;
printf ( " \t Print Processor: [%s] \n " , r - > print_processor ) ;
printf ( " \t Vendor Setup: [%s] \n " , r - > vendor_setup ) ;
for ( i = 0 ; r - > color_profiles & & r - > color_profiles [ i ] ! = NULL ; i + + ) {
printf ( " \t Color Profiles: [%s] \n " , r - > color_profiles [ i ] ) ;
}
printf ( " \t Inf Path: [%s] \n " , r - > inf_path ) ;
printf ( " \t Printer Driver Attributes: [0x%x] \n " , r - > printer_driver_attributes ) ;
for ( i = 0 ; r - > core_driver_dependencies & & r - > core_driver_dependencies [ i ] ! = NULL ; i + + ) {
printf ( " \t Core Driver Dependencies: [%s] \n " , r - > core_driver_dependencies [ i ] ) ;
}
printf ( " \t Min Driver Inbox Driver Version Date: [%s] \n " , nt_time_string ( talloc_tos ( ) , r - > min_inbox_driver_ver_date ) ) ;
2009-05-12 08:56:57 +04:00
printf ( " \t Min Driver Inbox Driver Version Version: [0x%016llx] \n " ,
( long long unsigned int ) r - > min_inbox_driver_ver_version ) ;
2009-05-04 19:25:41 +04:00
printf ( " \n " ) ;
}
2009-02-25 00:20:30 +03:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_getdriver ( struct rpc_pipe_client * cli ,
2009-03-11 13:52:34 +03:00
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
2001-03-15 10:13:27 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-01-06 06:54:40 +03:00
WERROR werror ;
2009-03-11 13:52:34 +03:00
uint32_t level = 3 ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-03-11 13:52:34 +03:00
uint32_t i ;
bool success = false ;
2009-02-25 00:20:30 +03:00
union spoolss_DriverInfo info ;
uint32_t server_major_version ;
uint32_t server_minor_version ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2001-03-15 10:13:27 +03:00
2009-03-11 13:52:34 +03:00
if ( ( argc = = 1 ) | | ( argc > 3 ) ) {
2001-03-15 10:13:27 +03:00
printf ( " Usage: %s <printername> [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-15 10:13:27 +03:00
}
/* get the arguments need to open the printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2009-03-11 13:52:34 +03:00
if ( argc = = 3 ) {
level = atoi ( argv [ 2 ] ) ;
}
2001-03-15 10:13:27 +03:00
/* Open a printer handle */
2002-01-06 06:54:40 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
PRINTER_ACCESS_USE ,
& pol ) ;
2003-03-18 09:30:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2002-01-06 06:54:40 +03:00
printf ( " Error opening printer handle for %s! \n " , printername ) ;
2003-03-18 09:30:30 +03:00
return werror ;
2001-03-15 10:13:27 +03:00
}
/* loop through and print driver info level for each architecture */
2002-01-07 06:33:46 +03:00
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + ) {
2009-02-25 00:20:30 +03:00
werror = rpccli_spoolss_getprinterdriver2 ( cli , mem_ctx ,
& pol ,
archi_table [ i ] . long_archi ,
2009-03-11 13:52:34 +03:00
level ,
2009-02-25 00:20:30 +03:00
0 , /* offered */
archi_table [ i ] . version ,
2 ,
& info ,
& server_major_version ,
& server_minor_version ) ;
2009-03-11 13:52:34 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2002-01-07 06:33:46 +03:00
continue ;
2009-03-11 13:52:34 +03:00
}
2009-02-09 14:40:12 +03:00
2003-08-19 20:56:53 +04:00
/* need at least one success */
2009-02-09 14:40:12 +03:00
2009-03-11 13:52:34 +03:00
success = true ;
2009-02-09 14:40:12 +03:00
2009-03-11 13:52:34 +03:00
printf ( " \n [%s] \n " , archi_table [ i ] . long_archi ) ;
2002-01-07 06:33:46 +03:00
2009-03-11 13:52:34 +03:00
switch ( level ) {
2001-03-15 10:13:27 +03:00
case 1 :
2009-02-25 00:20:30 +03:00
display_print_driver1 ( & info . info1 ) ;
2001-03-15 10:13:27 +03:00
break ;
case 2 :
2009-02-25 00:20:30 +03:00
display_print_driver2 ( & info . info2 ) ;
2001-03-15 10:13:27 +03:00
break ;
case 3 :
2009-02-25 00:20:30 +03:00
display_print_driver3 ( & info . info3 ) ;
2001-03-15 10:13:27 +03:00
break ;
2009-05-04 19:25:41 +04:00
case 4 :
display_print_driver4 ( & info . info4 ) ;
break ;
case 5 :
display_print_driver5 ( & info . info5 ) ;
break ;
case 6 :
display_print_driver6 ( & info . info6 ) ;
break ;
case 8 :
display_print_driver8 ( & info . info8 ) ;
break ;
2001-03-15 10:13:27 +03:00
default :
2009-03-11 13:52:34 +03:00
printf ( " unknown info level %d \n " , level ) ;
2001-03-15 10:13:27 +03:00
break ;
}
}
2009-02-09 14:40:12 +03:00
2002-01-06 06:54:40 +03:00
/* Cleanup */
2009-03-11 13:52:34 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
2009-03-11 13:52:34 +03:00
}
2009-02-09 14:40:12 +03:00
2009-03-11 13:52:34 +03:00
if ( success ) {
2003-08-19 20:56:53 +04:00
werror = WERR_OK ;
2009-03-11 13:52:34 +03:00
}
2009-02-09 14:40:12 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2001-03-15 10:13:27 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-05-07 15:35:00 +04:00
static WERROR enum_driver_by_architecture ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
const char * architecture ,
uint32_t level )
{
WERROR werror ;
uint32_t count = 0 ;
union spoolss_DriverInfo * info = NULL ;
uint32_t j ;
werror = rpccli_spoolss_enumprinterdrivers ( cli , mem_ctx ,
cli - > srv_name_slash ,
architecture ,
level ,
0 ,
& count ,
& info ) ;
if ( W_ERROR_EQUAL ( werror , WERR_INVALID_ENVIRONMENT ) ) {
printf ( " Server does not support environment [%s] \n " ,
architecture ) ;
return WERR_OK ;
}
if ( count = = 0 ) {
return WERR_OK ;
}
if ( ! W_ERROR_IS_OK ( werror ) ) {
printf ( " Error getting driver for environment [%s] - %s \n " ,
architecture , win_errstr ( werror ) ) ;
return werror ;
}
printf ( " \n [%s] \n " , architecture ) ;
switch ( level ) {
case 1 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver1 ( & info [ j ] . info1 ) ;
}
break ;
case 2 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver2 ( & info [ j ] . info2 ) ;
}
break ;
case 3 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver3 ( & info [ j ] . info3 ) ;
}
break ;
case 4 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver4 ( & info [ j ] . info4 ) ;
}
break ;
case 5 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver5 ( & info [ j ] . info5 ) ;
}
break ;
case 6 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver6 ( & info [ j ] . info6 ) ;
}
break ;
case 8 :
for ( j = 0 ; j < count ; j + + ) {
display_print_driver8 ( & info [ j ] . info8 ) ;
}
break ;
default :
printf ( " unknown info level %d \n " , level ) ;
2015-12-03 17:24:42 +03:00
return WERR_INVALID_LEVEL ;
2009-05-07 15:35:00 +04:00
}
return werror ;
}
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_drivers ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-03-15 10:13:27 +03:00
{
2005-11-02 03:37:35 +03:00
WERROR werror = WERR_OK ;
2009-03-09 17:00:29 +03:00
uint32_t level = 1 ;
2009-05-07 15:35:00 +04:00
uint32_t i ;
const char * architecture = NULL ;
2001-03-15 10:13:27 +03:00
2009-05-07 15:35:00 +04:00
if ( argc > 3 ) {
printf ( " Usage: enumdrivers [level] [architecture] \n " ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-15 10:13:27 +03:00
}
2009-05-07 15:35:00 +04:00
if ( argc > = 2 ) {
2009-03-09 17:00:29 +03:00
level = atoi ( argv [ 1 ] ) ;
}
2001-03-15 10:13:27 +03:00
2009-05-07 15:35:00 +04:00
if ( argc = = 3 ) {
architecture = argv [ 2 ] ;
}
if ( architecture ) {
return enum_driver_by_architecture ( cli , mem_ctx ,
architecture ,
level ) ;
}
2001-03-15 10:13:27 +03:00
/* loop through and print driver info level for each architecture */
2005-11-02 03:37:35 +03:00
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + ) {
2005-01-24 21:42:33 +03:00
/* check to see if we already asked for this architecture string */
2009-03-09 17:00:29 +03:00
if ( i > 0 & & strequal ( archi_table [ i ] . long_archi , archi_table [ i - 1 ] . long_archi ) ) {
2005-01-24 21:42:33 +03:00
continue ;
2009-03-09 17:00:29 +03:00
}
2005-01-24 21:42:33 +03:00
2009-05-07 15:35:00 +04:00
werror = enum_driver_by_architecture ( cli , mem_ctx ,
archi_table [ i ] . long_archi ,
level ) ;
2002-02-19 04:06:55 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2001-03-15 10:13:27 +03:00
break ;
}
}
2009-02-09 14:40:12 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2001-03-15 10:13:27 +03:00
}
2001-03-15 19:43:19 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-07-20 19:35:29 +04:00
2009-02-19 03:55:39 +03:00
static void display_printdriverdir_1 ( struct spoolss_DriverDirectoryInfo1 * r )
2001-03-15 19:43:19 +03:00
{
2009-02-19 03:55:39 +03:00
printf ( " \t Directory Name:[%s] \n " , r - > directory_name ) ;
2001-03-15 19:43:19 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_getdriverdir ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-03-15 19:43:19 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2009-02-19 03:55:39 +03:00
NTSTATUS status ;
2009-02-19 19:41:10 +03:00
const char * env = SPOOLSS_ARCHITECTURE_NT_X86 ;
2009-02-19 03:55:39 +03:00
DATA_BLOB buffer ;
uint32_t offered ;
2024-07-03 18:33:20 +03:00
union spoolss_DriverDirectoryInfo info = { } ;
2009-02-19 03:55:39 +03:00
uint32_t needed ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2001-03-15 19:43:19 +03:00
2002-02-20 21:41:07 +03:00
if ( argc > 2 ) {
2001-03-15 19:43:19 +03:00
printf ( " Usage: %s [environment] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-15 19:43:19 +03:00
}
2002-02-20 21:41:07 +03:00
/* Get the arguments need to open the printer handle */
2009-02-19 03:55:39 +03:00
if ( argc = = 2 ) {
env = argv [ 1 ] ;
}
2001-03-15 19:43:19 +03:00
/* Get the directory. Only use Info level 1 */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrinterDriverDirectory ( b , mem_ctx ,
2009-02-19 03:55:39 +03:00
cli - > srv_name_slash ,
env ,
1 ,
NULL , /* buffer */
0 , /* offered */
NULL , /* info */
& needed ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-19 03:55:39 +03:00
if ( W_ERROR_EQUAL ( result , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrinterDriverDirectory ( b , mem_ctx ,
2009-02-19 03:55:39 +03:00
cli - > srv_name_slash ,
env ,
1 ,
& buffer ,
offered ,
& info ,
& needed ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-19 03:55:39 +03:00
}
2001-03-15 19:43:19 +03:00
2009-02-19 03:55:39 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
display_printdriverdir_1 ( & info . info1 ) ;
}
2002-02-20 21:41:07 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2001-03-15 19:43:19 +03:00
}
2016-09-08 21:57:05 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static WERROR cmd_spoolss_getdriverpackagepath ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
HRESULT hresult ;
NTSTATUS status ;
const char * env = SPOOLSS_ARCHITECTURE_NT_X86 ;
uint32_t offered ;
uint32_t needed ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
const char * package_id = " " ;
const char * cab = NULL ;
if ( argc > 4 ) {
printf ( " Usage: %s [environment] [package_id] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
/* Get the arguments need to open the printer handle */
if ( argc > = 2 ) {
env = argv [ 1 ] ;
}
if ( argc = = 3 ) {
package_id = argv [ 2 ] ;
}
offered = 1 ;
2019-12-19 15:49:53 +03:00
cab = talloc_zero_array ( mem_ctx , char , offered ) ;
if ( cab = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
2016-09-08 21:57:05 +03:00
status = dcerpc_spoolss_GetPrinterDriverPackagePath ( b , mem_ctx ,
cli - > srv_name_slash ,
env ,
NULL ,
package_id ,
cab ,
offered ,
& needed ,
& hresult ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
if ( W_ERROR_EQUAL ( W_ERROR ( WIN32_FROM_HRESULT ( hresult ) ) , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
cab = talloc_zero_array ( mem_ctx , char , offered ) ;
2019-12-19 15:49:53 +03:00
if ( cab = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
2016-09-08 21:57:05 +03:00
status = dcerpc_spoolss_GetPrinterDriverPackagePath ( b , mem_ctx ,
cli - > srv_name_slash ,
env ,
NULL ,
package_id ,
cab ,
offered ,
& needed ,
& hresult ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
}
return W_ERROR ( WIN32_FROM_HRESULT ( hresult ) ) ;
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-19 02:43:23 +03:00
static void set_drv_info_3_env ( TALLOC_CTX * mem_ctx ,
struct spoolss_AddDriverInfo3 * info ,
const char * arch )
2001-03-16 01:06:53 +03:00
{
int i ;
2009-02-09 14:40:12 +03:00
for ( i = 0 ; archi_table [ i ] . long_archi ! = NULL ; i + + )
2001-03-16 01:06:53 +03:00
{
if ( strcmp ( arch , archi_table [ i ] . short_archi ) = = 0 )
{
info - > version = archi_table [ i ] . version ;
2009-02-19 02:43:23 +03:00
info - > architecture = talloc_strdup ( mem_ctx , archi_table [ i ] . long_archi ) ;
2001-03-16 01:06:53 +03:00
break ;
}
}
2009-02-09 14:40:12 +03:00
2001-03-16 01:06:53 +03:00
if ( archi_table [ i ] . long_archi = = NULL )
{
DEBUG ( 0 , ( " set_drv_info_3_env: Unknown arch [%s] \n " , arch ) ) ;
}
2009-02-09 14:40:12 +03:00
2001-03-16 01:06:53 +03:00
return ;
}
/**************************************************************************
wrapper for strtok to get the next parameter from a delimited list .
Needed to handle the empty parameter string denoted by " NULL "
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
2009-02-19 02:43:23 +03:00
static char * get_driver_3_param ( TALLOC_CTX * mem_ctx , char * str ,
const char * delim , const char * * dest ,
char * * saveptr )
2001-03-16 01:06:53 +03:00
{
char * ptr ;
/* get the next token */
2008-06-26 17:32:27 +04:00
ptr = strtok_r ( str , delim , saveptr ) ;
2001-03-16 01:06:53 +03:00
/* a string of 'NULL' is used to represent an empty
parameter because two consecutive delimiters
will not return an empty string . See man strtok ( 3 )
for details */
2011-05-13 22:21:30 +04:00
if ( ptr & & ( strcasecmp_m ( ptr , " NULL " ) = = 0 ) ) {
2001-03-16 01:06:53 +03:00
ptr = NULL ;
2009-02-19 02:43:23 +03:00
}
2001-03-16 01:06:53 +03:00
2009-02-19 02:43:23 +03:00
if ( dest ! = NULL ) {
* dest = talloc_strdup ( mem_ctx , ptr ) ;
}
2001-03-16 01:06:53 +03:00
return ptr ;
}
/********************************************************************************
2009-02-19 02:43:23 +03:00
fill in the members of a spoolss_AddDriverInfo3 struct using a character
2001-03-16 01:06:53 +03:00
string in the form of
2012-11-29 15:22:48 +04:00
< Long Driver Name > : < Driver File Name > : < Data File Name > : \
2001-03-16 01:06:53 +03:00
< Config File Name > : < Help File Name > : < Language Monitor Name > : \
2009-02-09 14:40:12 +03:00
< Default Data Type > : < Comma Separated list of Files >
2001-03-16 01:06:53 +03:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-19 02:43:23 +03:00
static bool init_drv_info_3_members ( TALLOC_CTX * mem_ctx , struct spoolss_AddDriverInfo3 * r ,
char * args )
2001-03-16 01:06:53 +03:00
{
char * str , * str2 ;
2014-11-14 16:12:26 +03:00
size_t count = 0 ;
2008-01-25 23:20:39 +03:00
char * saveptr = NULL ;
2009-02-19 02:43:23 +03:00
struct spoolss_StringArray * deps ;
const char * * file_array = NULL ;
int i ;
2008-01-23 13:04:10 +03:00
2001-03-16 01:06:53 +03:00
/* fill in the UNISTR fields */
2009-02-19 02:43:23 +03:00
str = get_driver_3_param ( mem_ctx , args , " : " , & r - > driver_name , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > driver_path , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > data_file , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > config_file , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > help_file , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > monitor_name , & saveptr ) ;
str = get_driver_3_param ( mem_ctx , NULL , " : " , & r - > default_datatype , & saveptr ) ;
2001-03-16 01:06:53 +03:00
/* <Comma Separated List of Dependent Files> */
2008-06-26 17:32:27 +04:00
/* save the beginning of the string */
2009-02-19 02:43:23 +03:00
str2 = get_driver_3_param ( mem_ctx , NULL , " : " , NULL , & saveptr ) ;
2008-06-26 17:32:27 +04:00
str = str2 ;
2001-03-16 01:06:53 +03:00
/* begin to strip out each filename */
2008-01-23 13:04:10 +03:00
str = strtok_r ( str , " , " , & saveptr ) ;
2009-02-19 02:43:23 +03:00
/* no dependent files, we are done */
if ( ! str ) {
return true ;
}
deps = talloc_zero ( mem_ctx , struct spoolss_StringArray ) ;
if ( ! deps ) {
return false ;
}
while ( str ! = NULL ) {
2012-12-10 20:41:46 +04:00
bool ok ;
ok = add_string_to_array ( deps , str , & file_array , & count ) ;
if ( ! ok ) {
return false ;
}
2008-01-23 13:04:10 +03:00
str = strtok_r ( NULL , " , " , & saveptr ) ;
2001-03-16 01:06:53 +03:00
}
2009-02-19 02:43:23 +03:00
deps - > string = talloc_zero_array ( deps , const char * , count + 1 ) ;
if ( ! deps - > string ) {
return false ;
2001-03-16 01:06:53 +03:00
}
2009-02-19 02:43:23 +03:00
for ( i = 0 ; i < count ; i + + ) {
deps - > string [ i ] = file_array [ i ] ;
2001-03-16 01:06:53 +03:00
}
2009-02-19 02:43:23 +03:00
r - > dependent_files = deps ;
2001-03-16 01:06:53 +03:00
2009-02-19 02:43:23 +03:00
return true ;
}
2001-03-16 01:06:53 +03:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_addprinterdriver ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-03-16 01:06:53 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2009-02-19 02:43:23 +03:00
NTSTATUS status ;
2009-03-19 14:53:01 +03:00
uint32_t level = 3 ;
2009-02-19 02:43:23 +03:00
struct spoolss_AddDriverInfoCtr info_ctr ;
struct spoolss_AddDriverInfo3 info3 ;
2003-04-23 17:27:35 +04:00
const char * arch ;
2005-03-22 17:33:30 +03:00
char * driver_args ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2001-03-16 01:06:53 +03:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2003-11-05 19:40:13 +03:00
if ( argc ! = 3 & & argc ! = 4 )
2001-03-16 01:06:53 +03:00
{
2003-11-05 19:40:13 +03:00
printf ( " Usage: %s <Environment> \\ \n " , argv [ 0 ] ) ;
2012-11-29 15:22:48 +04:00
printf ( " \t <Long Driver Name>:<Driver File Name>:<Data File Name>: \\ \n " ) ;
2001-03-16 01:06:53 +03:00
printf ( " \t <Config File Name>:<Help File Name>:<Language Monitor Name>: \\ \n " ) ;
2003-11-05 19:40:13 +03:00
printf ( " \t <Default Data Type>:<Comma Separated list of Files> \\ \n " ) ;
printf ( " \t [version] \n " ) ;
2001-03-16 01:06:53 +03:00
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-16 01:06:53 +03:00
}
2009-02-09 14:40:12 +03:00
2009-02-19 02:43:23 +03:00
/* Fill in the spoolss_AddDriverInfo3 struct */
2001-03-16 01:06:53 +03:00
ZERO_STRUCT ( info3 ) ;
2009-02-19 02:43:23 +03:00
arch = cmd_spoolss_get_short_archi ( argv [ 1 ] ) ;
if ( ! arch ) {
2011-03-01 00:04:29 +03:00
printf ( " Error Unknown architecture [%s] \n " , argv [ 1 ] ) ;
2015-12-03 17:24:25 +03:00
return WERR_INVALID_PARAMETER ;
2001-03-16 01:06:53 +03:00
}
2009-02-19 02:43:23 +03:00
set_drv_info_3_env ( mem_ctx , & info3 , arch ) ;
2001-03-16 01:06:53 +03:00
2005-03-22 17:33:30 +03:00
driver_args = talloc_strdup ( mem_ctx , argv [ 2 ] ) ;
if ( ! init_drv_info_3_members ( mem_ctx , & info3 , driver_args ) )
2001-03-16 01:06:53 +03:00
{
printf ( " Error Invalid parameter list - %s. \n " , argv [ 2 ] ) ;
2015-12-03 17:24:25 +03:00
return WERR_INVALID_PARAMETER ;
2001-03-16 01:06:53 +03:00
}
2003-11-05 19:40:13 +03:00
/* if printer driver version specified, override the default version
* used by the architecture . This allows installation of Windows
* 2000 ( version 3 ) printer drivers . */
if ( argc = = 4 )
{
info3 . version = atoi ( argv [ 3 ] ) ;
}
2001-03-16 01:06:53 +03:00
2009-02-19 02:43:23 +03:00
info_ctr . level = level ;
info_ctr . info . info3 = & info3 ;
2001-03-16 01:06:53 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_AddPrinterDriver ( b , mem_ctx ,
2009-02-19 02:43:23 +03:00
cli - > srv_name_slash ,
& info_ctr ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) ) {
2002-04-02 05:10:41 +04:00
printf ( " Printer Driver %s successfully installed. \n " ,
2009-02-19 02:43:23 +03:00
info3 . driver_name ) ;
2002-02-20 21:41:07 +03:00
}
2001-03-16 01:06:53 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2001-03-16 01:06:53 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_addprinterex ( struct rpc_pipe_client * cli ,
2002-04-02 05:10:41 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-03-16 01:06:53 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2009-02-13 20:06:45 +03:00
struct spoolss_SetPrinterInfoCtr info_ctr ;
struct spoolss_SetPrinterInfo2 info2 ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2001-03-16 01:06:53 +03:00
if ( argc ! = 5 )
{
printf ( " Usage: %s <name> <shared name> <driver> <port> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-03-16 01:06:53 +03:00
}
2009-02-09 14:40:12 +03:00
2003-12-07 13:48:31 +03:00
/* Fill in the DRIVER_INFO_2 struct */
2001-03-16 01:06:53 +03:00
ZERO_STRUCT ( info2 ) ;
2009-02-13 20:06:45 +03:00
info2 . printername = argv [ 1 ] ;
info2 . drivername = argv [ 3 ] ;
info2 . sharename = argv [ 2 ] ;
info2 . portname = argv [ 4 ] ;
info2 . comment = " Created by rpcclient " ;
info2 . printprocessor = " winprint " ;
info2 . datatype = " RAW " ;
2016-11-11 18:29:20 +03:00
info2 . devmode_ptr = 0 ;
info2 . secdesc_ptr = 0 ;
2001-03-16 01:06:53 +03:00
info2 . attributes = PRINTER_ATTRIBUTE_SHARED ;
info2 . priority = 0 ;
info2 . defaultpriority = 0 ;
info2 . starttime = 0 ;
info2 . untiltime = 0 ;
2009-02-09 14:40:12 +03:00
/* These three fields must not be used by AddPrinter()
as defined in the MS Platform SDK documentation . .
2001-03-16 01:06:53 +03:00
- - jerry
info2 . status = 0 ;
info2 . cjobs = 0 ;
info2 . averageppm = 0 ;
*/
2009-02-13 20:06:45 +03:00
info_ctr . level = 2 ;
info_ctr . info . info2 = & info2 ;
2009-02-25 03:11:01 +03:00
result = rpccli_spoolss_addprinterex ( cli , mem_ctx ,
& info_ctr ) ;
2002-02-20 21:41:07 +03:00
if ( W_ERROR_IS_OK ( result ) )
printf ( " Printer %s successfully installed. \n " , argv [ 1 ] ) ;
2001-03-16 01:06:53 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2001-03-16 01:06:53 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_setdriver ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-04-28 04:32:56 +04:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle pol ;
2002-01-06 06:54:40 +03:00
WERROR result ;
2009-02-14 05:08:06 +03:00
NTSTATUS status ;
2009-03-19 14:53:01 +03:00
uint32_t level = 2 ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info ;
struct spoolss_SetPrinterInfoCtr info_ctr ;
2010-05-03 17:54:14 +04:00
struct spoolss_SetPrinterInfo2 info2 ;
2009-02-14 05:08:06 +03:00
struct spoolss_DevmodeContainer devmode_ctr ;
struct sec_desc_buf secdesc_ctr ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-14 05:08:06 +03:00
ZERO_STRUCT ( devmode_ctr ) ;
ZERO_STRUCT ( secdesc_ctr ) ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2001-04-28 04:32:56 +04:00
if ( argc ! = 3 )
{
printf ( " Usage: %s <printer> <driver> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-04-28 04:32:56 +04:00
}
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2001-04-28 04:32:56 +04:00
2002-01-06 06:54:40 +03:00
/* Get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
PRINTER_ALL_ACCESS ,
& pol ) ;
2002-02-20 21:41:07 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
2001-04-28 04:32:56 +04:00
goto done ;
2002-02-20 21:41:07 +03:00
2001-04-28 04:32:56 +04:00
/* Get printer info */
2002-01-06 06:54:40 +03:00
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
level ,
0 ,
& info ) ;
2002-02-19 05:12:01 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2001-05-31 21:28:40 +04:00
printf ( " Unable to retrieve printer information! \n " ) ;
2001-04-28 04:32:56 +04:00
goto done ;
}
2002-01-06 06:54:40 +03:00
/* Set the printer driver */
2010-06-03 18:30:55 +04:00
spoolss_printerinfo2_to_setprinterinfo2 ( & info . info2 , & info2 ) ;
info2 . drivername = argv [ 2 ] ;
2009-03-02 13:21:26 +03:00
2009-02-14 05:08:06 +03:00
info_ctr . level = 2 ;
2010-05-03 17:54:14 +04:00
info_ctr . info . info2 = & info2 ;
2009-02-14 05:08:06 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetPrinter ( b , mem_ctx ,
2009-02-14 05:08:06 +03:00
& pol ,
& info_ctr ,
& devmode_ctr ,
& secdesc_ctr ,
0 , /* command */
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-02-20 21:41:07 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-01-06 06:54:40 +03:00
printf ( " SetPrinter call failed! \n " ) ;
2011-02-02 14:50:42 +03:00
goto done ;
2001-04-28 04:32:56 +04:00
}
2008-02-05 12:34:00 +03:00
printf ( " Successfully set %s to driver %s. \n " , argv [ 1 ] , argv [ 2 ] ) ;
2001-04-28 04:32:56 +04:00
done :
2002-01-06 06:54:40 +03:00
/* Cleanup */
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
}
2002-04-02 05:10:41 +04:00
2003-03-18 09:30:30 +03:00
return result ;
2001-04-28 04:32:56 +04:00
}
2001-03-15 10:13:27 +03:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_deletedriverex ( struct rpc_pipe_client * cli ,
2004-11-10 00:15:14 +03:00
TALLOC_CTX * mem_ctx ,
int argc , const char * * argv )
{
WERROR result , ret = WERR_UNKNOWN_PRINTER_DRIVER ;
2009-02-09 13:14:00 +03:00
NTSTATUS status ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 13:14:00 +03:00
2004-11-10 00:15:14 +03:00
int i ;
int vers = - 1 ;
2009-02-09 14:40:12 +03:00
2004-11-10 00:15:14 +03:00
const char * arch = NULL ;
2009-02-09 13:14:00 +03:00
uint32_t delete_flags = 0 ;
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2012-01-11 15:29:58 +04:00
if ( argc < 2 | | argc > 5 ) {
printf ( " Usage: %s <driver> [arch] [version] [flags] \n " , argv [ 0 ] ) ;
2004-11-10 00:15:14 +03:00
return WERR_OK ;
}
if ( argc > = 3 )
arch = argv [ 2 ] ;
2012-01-11 15:29:58 +04:00
if ( argc > = 4 ) {
vers = atoi ( argv [ 3 ] ) ;
2009-02-09 13:14:00 +03:00
delete_flags | = DPD_DELETE_SPECIFIC_VERSION ;
}
2012-01-11 15:29:58 +04:00
if ( argc = = 5 )
delete_flags = atoi ( argv [ 4 ] ) ;
2009-02-09 13:14:00 +03:00
2004-11-10 00:15:14 +03:00
/* delete the driver for all architectures */
for ( i = 0 ; archi_table [ i ] . long_archi ; i + + ) {
2012-01-11 15:29:58 +04:00
if ( arch & & ! strequal ( archi_table [ i ] . long_archi , arch ) )
2004-11-10 00:15:14 +03:00
continue ;
if ( vers > = 0 & & archi_table [ i ] . version ! = vers )
continue ;
/* make the call to remove the driver */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_DeletePrinterDriverEx ( b , mem_ctx ,
2009-02-09 13:14:00 +03:00
cli - > srv_name_slash ,
archi_table [ i ] . long_archi ,
argv [ 1 ] ,
delete_flags ,
archi_table [ i ] . version ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-09 14:40:12 +03:00
if ( ! W_ERROR_IS_OK ( result ) )
2004-11-10 00:15:14 +03:00
{
if ( ! W_ERROR_EQUAL ( result , WERR_UNKNOWN_PRINTER_DRIVER ) ) {
2009-02-09 14:40:12 +03:00
printf ( " Failed to remove driver %s for arch [%s] (version: %d): %s \n " ,
2008-11-01 19:19:26 +03:00
argv [ 1 ] , archi_table [ i ] . long_archi , archi_table [ i ] . version , win_errstr ( result ) ) ;
2004-11-10 00:15:14 +03:00
}
2009-02-09 14:40:12 +03:00
}
else
2004-11-10 00:15:14 +03:00
{
2009-02-09 14:40:12 +03:00
printf ( " Driver %s and files removed for arch [%s] (version: %d). \n " , argv [ 1 ] ,
2004-11-10 03:53:35 +03:00
archi_table [ i ] . long_archi , archi_table [ i ] . version ) ;
2004-11-10 00:15:14 +03:00
ret = WERR_OK ;
}
}
2009-02-09 14:40:12 +03:00
2004-11-10 00:15:14 +03:00
return ret ;
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_deletedriver ( struct rpc_pipe_client * cli ,
2001-10-12 09:56:23 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-05-17 22:57:25 +04:00
{
2005-11-02 03:37:35 +03:00
WERROR result = WERR_OK ;
2009-02-09 03:49:40 +03:00
NTSTATUS status ;
2001-05-18 08:11:17 +04:00
int i ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2005-11-02 03:37:35 +03:00
if ( argc ! = 2 ) {
2001-05-18 08:11:17 +04:00
printf ( " Usage: %s <driver> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-05-17 22:57:25 +04:00
}
2001-05-18 08:11:17 +04:00
/* delete the driver for all architectures */
2005-11-02 03:37:35 +03:00
for ( i = 0 ; archi_table [ i ] . long_archi ; i + + ) {
2010-12-22 17:20:29 +03:00
result = WERR_OK ;
2001-05-18 08:11:17 +04:00
/* make the call to remove the driver */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_DeletePrinterDriver ( b , mem_ctx ,
2009-02-09 20:10:18 +03:00
cli - > srv_name_slash ,
2009-02-09 03:49:40 +03:00
archi_table [ i ] . long_archi ,
argv [ 1 ] ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
2011-01-19 00:10:30 +03:00
result = ntstatus_to_werror ( status ) ;
continue ;
2009-02-09 03:49:40 +03:00
}
2002-11-09 17:49:26 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
if ( ! W_ERROR_EQUAL ( result , WERR_UNKNOWN_PRINTER_DRIVER ) ) {
2011-01-19 00:10:30 +03:00
printf ( " Failed to remove driver %s for arch [%s] - error %s! \n " ,
2009-02-09 14:40:12 +03:00
argv [ 1 ] , archi_table [ i ] . long_archi ,
2011-01-19 00:10:30 +03:00
win_errstr ( result ) ) ;
2002-11-09 17:49:26 +03:00
}
2005-11-02 03:37:35 +03:00
} else {
2009-02-09 14:40:12 +03:00
printf ( " Driver %s removed for arch [%s]. \n " , argv [ 1 ] ,
2002-02-20 21:41:07 +03:00
archi_table [ i ] . long_archi ) ;
2002-11-09 17:49:26 +03:00
}
2001-05-17 22:57:25 +04:00
}
2009-02-09 14:40:12 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2001-05-17 22:57:25 +04:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_getprintprocdir ( struct rpc_pipe_client * cli ,
2001-12-10 08:03:17 +03:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2001-12-10 08:03:17 +03:00
{
2002-02-20 21:41:07 +03:00
WERROR result ;
2009-02-19 12:26:00 +03:00
NTSTATUS status ;
const char * environment = SPOOLSS_ARCHITECTURE_NT_X86 ;
DATA_BLOB buffer ;
uint32_t offered ;
2023-10-06 05:07:24 +03:00
union spoolss_PrintProcessorDirectoryInfo info = { } ;
2009-02-19 12:26:00 +03:00
uint32_t needed ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2002-02-20 21:41:07 +03:00
if ( argc > 2 ) {
printf ( " Usage: %s [environment] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2001-12-10 08:03:17 +03:00
}
2009-02-19 12:26:00 +03:00
if ( argc = = 2 ) {
environment = argv [ 1 ] ;
2002-01-19 20:29:32 +03:00
}
2001-12-10 08:03:17 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrintProcessorDirectory ( b , mem_ctx ,
2009-02-19 12:26:00 +03:00
cli - > srv_name_slash ,
environment ,
1 ,
NULL , /* buffer */
0 , /* offered */
NULL , /* info */
& needed ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-19 12:26:00 +03:00
if ( W_ERROR_EQUAL ( result , WERR_INSUFFICIENT_BUFFER ) ) {
offered = needed ;
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
2001-12-10 08:03:17 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetPrintProcessorDirectory ( b , mem_ctx ,
2009-02-19 12:26:00 +03:00
cli - > srv_name_slash ,
environment ,
1 ,
& buffer ,
offered ,
& info ,
& needed ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
2009-02-19 12:26:00 +03:00
}
2001-12-10 08:03:17 +03:00
2023-10-06 05:07:24 +03:00
if ( W_ERROR_IS_OK ( result ) & & info . info1 . directory_name ! = NULL ) {
2009-02-19 12:26:00 +03:00
printf ( " %s \n " , info . info1 . directory_name ) ;
}
2001-12-10 08:03:17 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2001-12-10 08:03:17 +03:00
}
2001-05-17 22:57:25 +04:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-01-31 14:36:30 +03:00
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_addform ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-01-31 14:36:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle handle ;
2002-01-31 14:36:30 +03:00
WERROR werror ;
2009-02-08 02:03:00 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2013-01-16 04:15:49 +04:00
struct spoolss_AddFormInfoCtr info_ctr ;
2009-02-08 02:03:00 +03:00
struct spoolss_AddFormInfo1 info1 ;
2009-02-25 22:50:34 +03:00
struct spoolss_AddFormInfo2 info2 ;
uint32_t level = 1 ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-08 02:03:00 +03:00
2008-06-17 11:44:21 +04:00
/* Parse the command arguments */
2002-01-31 14:36:30 +03:00
2009-02-25 22:50:34 +03:00
if ( argc < 3 | | argc > 5 ) {
printf ( " Usage: %s <printer> <formname> [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-01-31 14:36:30 +03:00
}
2009-02-09 14:40:12 +03:00
2002-01-31 14:36:30 +03:00
/* Get a printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-01-31 14:36:30 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
PRINTER_ALL_ACCESS ,
& handle ) ;
2002-01-31 14:36:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Dummy up some values for the form data */
2009-02-25 22:50:34 +03:00
if ( argc = = 4 ) {
level = atoi ( argv [ 3 ] ) ;
}
switch ( level ) {
case 1 :
2009-03-06 14:01:54 +03:00
info1 . flags = SPOOLSS_FORM_USER ;
2009-02-25 22:50:34 +03:00
info1 . form_name = argv [ 2 ] ;
info1 . size . width = 100 ;
info1 . size . height = 100 ;
info1 . area . left = 0 ;
info1 . area . top = 10 ;
info1 . area . right = 20 ;
info1 . area . bottom = 30 ;
2013-01-16 04:15:49 +04:00
info_ctr . level = 1 ;
info_ctr . info . info1 = & info1 ;
2002-01-31 14:36:30 +03:00
2009-02-25 22:50:34 +03:00
break ;
case 2 :
2009-03-06 14:01:54 +03:00
info2 . flags = SPOOLSS_FORM_USER ;
2009-02-25 22:50:34 +03:00
info2 . form_name = argv [ 2 ] ;
info2 . size . width = 100 ;
info2 . size . height = 100 ;
info2 . area . left = 0 ;
info2 . area . top = 10 ;
info2 . area . right = 20 ;
info2 . area . bottom = 30 ;
info2 . keyword = argv [ 2 ] ;
info2 . string_type = SPOOLSS_FORM_STRING_TYPE_NONE ;
info2 . mui_dll = NULL ;
info2 . ressource_id = 0 ;
info2 . display_name = argv [ 2 ] ;
info2 . lang_id = 0 ;
2013-01-16 04:15:49 +04:00
info_ctr . level = 2 ;
info_ctr . info . info2 = & info2 ;
2009-02-25 22:50:34 +03:00
break ;
2011-01-19 00:10:30 +03:00
default :
2015-12-03 17:24:25 +03:00
werror = WERR_INVALID_PARAMETER ;
2011-01-19 00:10:30 +03:00
goto done ;
2009-02-25 22:50:34 +03:00
}
2002-01-31 14:36:30 +03:00
/* Add the form */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_AddForm ( b , mem_ctx ,
2009-02-08 02:03:00 +03:00
& handle ,
2013-01-16 04:15:49 +04:00
& info_ctr ,
2009-02-08 02:03:00 +03:00
& werror ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
werror = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-01-31 14:36:30 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
2002-01-31 14:36:30 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2002-01-31 14:36:30 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-01-31 14:36:30 +03:00
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_setform ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-01-31 14:36:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle handle ;
2002-01-31 14:36:30 +03:00
WERROR werror ;
2009-02-08 21:19:20 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2013-01-16 16:41:28 +04:00
struct spoolss_AddFormInfoCtr info_ctr ;
2009-02-08 21:19:20 +03:00
struct spoolss_AddFormInfo1 info1 ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-08 21:19:20 +03:00
2008-06-17 11:44:21 +04:00
/* Parse the command arguments */
2002-01-31 14:36:30 +03:00
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-01-31 14:36:30 +03:00
}
2009-02-09 14:40:12 +03:00
2002-01-31 14:36:30 +03:00
/* Get a printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-01-31 14:36:30 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
2002-01-31 14:36:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Dummy up some values for the form data */
2009-03-06 14:01:54 +03:00
info1 . flags = SPOOLSS_FORM_PRINTER ;
2009-02-08 21:19:20 +03:00
info1 . size . width = 100 ;
info1 . size . height = 100 ;
info1 . area . left = 0 ;
info1 . area . top = 1000 ;
info1 . area . right = 2000 ;
info1 . area . bottom = 3000 ;
info1 . form_name = argv [ 2 ] ;
2002-01-31 14:36:30 +03:00
2013-01-16 16:41:28 +04:00
info_ctr . info . info1 = & info1 ;
info_ctr . level = 1 ;
2002-01-31 14:36:30 +03:00
/* Set the form */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetForm ( b , mem_ctx ,
2009-02-08 21:19:20 +03:00
& handle ,
argv [ 2 ] ,
2013-01-16 16:41:28 +04:00
& info_ctr ,
2009-02-08 21:19:20 +03:00
& werror ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
werror = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-01-31 14:36:30 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
2002-01-31 14:36:30 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2002-01-31 14:36:30 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-03-19 02:48:46 +03:00
static const char * get_form_flag ( int form_flag )
{
switch ( form_flag ) {
2009-03-06 14:01:54 +03:00
case SPOOLSS_FORM_USER :
2005-03-19 02:48:46 +03:00
return " FORM_USER " ;
2009-03-06 14:01:54 +03:00
case SPOOLSS_FORM_BUILTIN :
2005-03-19 02:48:46 +03:00
return " FORM_BUILTIN " ;
2009-03-06 14:01:54 +03:00
case SPOOLSS_FORM_PRINTER :
2005-03-19 02:48:46 +03:00
return " FORM_PRINTER " ;
default :
return " unknown " ;
}
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-08 21:51:20 +03:00
static void display_form_info1 ( struct spoolss_FormInfo1 * r )
{
printf ( " %s \n " \
" \t flag: %s (%d) \n " \
" \t width: %d, length: %d \n " \
" \t left: %d, right: %d, top: %d, bottom: %d \n \n " ,
r - > form_name , get_form_flag ( r - > flags ) , r - > flags ,
r - > size . width , r - > size . height ,
r - > area . left , r - > area . right ,
r - > area . top , r - > area . bottom ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-25 15:46:08 +03:00
static void display_form_info2 ( struct spoolss_FormInfo2 * r )
{
printf ( " %s \n " \
" \t flag: %s (%d) \n " \
" \t width: %d, length: %d \n " \
" \t left: %d, right: %d, top: %d, bottom: %d \n " ,
r - > form_name , get_form_flag ( r - > flags ) , r - > flags ,
r - > size . width , r - > size . height ,
r - > area . left , r - > area . right ,
r - > area . top , r - > area . bottom ) ;
printf ( " \t keyword: %s \n " , r - > keyword ) ;
printf ( " \t string_type: 0x%08x \n " , r - > string_type ) ;
printf ( " \t mui_dll: %s \n " , r - > mui_dll ) ;
printf ( " \t ressource_id: 0x%08x \n " , r - > ressource_id ) ;
printf ( " \t display_name: %s \n " , r - > display_name ) ;
printf ( " \t lang_id: %d \n " , r - > lang_id ) ;
printf ( " \n " ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_getform ( struct rpc_pipe_client * cli , TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-01-31 14:36:30 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle handle ;
2002-01-31 14:36:30 +03:00
WERROR werror ;
2009-02-08 21:51:20 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-02-08 21:51:20 +03:00
DATA_BLOB buffer ;
uint32_t offered = 0 ;
union spoolss_FormInfo info ;
uint32_t needed ;
2009-02-25 15:46:08 +03:00
uint32_t level = 1 ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-08 21:51:20 +03:00
2008-06-17 11:44:21 +04:00
/* Parse the command arguments */
2002-01-31 14:36:30 +03:00
2009-02-25 15:46:08 +03:00
if ( argc < 3 | | argc > 5 ) {
printf ( " Usage: %s <printer> <formname> [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-01-31 14:36:30 +03:00
}
2009-02-09 14:40:12 +03:00
2002-01-31 14:36:30 +03:00
/* Get a printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-01-31 14:36:30 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
2002-02-25 09:43:31 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
2009-02-25 15:46:08 +03:00
if ( argc = = 4 ) {
level = atoi ( argv [ 3 ] ) ;
}
2005-03-19 02:48:46 +03:00
/* Get the form */
2002-02-25 09:43:31 +03:00
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetForm ( b , mem_ctx ,
2009-02-08 21:51:20 +03:00
& handle ,
argv [ 2 ] ,
2009-02-25 15:46:08 +03:00
level ,
2009-02-08 21:51:20 +03:00
NULL ,
offered ,
& info ,
& needed ,
& werror ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
werror = ntstatus_to_werror ( status ) ;
goto done ;
}
2009-02-08 21:51:20 +03:00
if ( W_ERROR_EQUAL ( werror , WERR_INSUFFICIENT_BUFFER ) ) {
2009-02-25 15:46:08 +03:00
buffer = data_blob_talloc_zero ( mem_ctx , needed ) ;
2009-02-08 21:51:20 +03:00
offered = needed ;
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_GetForm ( b , mem_ctx ,
2009-02-08 21:51:20 +03:00
& handle ,
argv [ 2 ] ,
2009-02-25 15:46:08 +03:00
level ,
2009-02-08 21:51:20 +03:00
& buffer ,
offered ,
& info ,
& needed ,
& werror ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
werror = ntstatus_to_werror ( status ) ;
goto done ;
}
2009-02-08 21:51:20 +03:00
}
2002-02-25 09:43:31 +03:00
2011-01-19 00:10:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
goto done ;
2009-02-08 21:51:20 +03:00
}
2002-02-25 09:43:31 +03:00
2009-02-25 15:46:08 +03:00
switch ( level ) {
case 1 :
display_form_info1 ( & info . info1 ) ;
break ;
case 2 :
display_form_info2 ( & info . info2 ) ;
break ;
}
2002-02-25 09:43:31 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
2002-02-25 09:43:31 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2002-02-25 09:43:31 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-02-25 09:43:31 +03:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_deleteform ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2002-02-25 09:43:31 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle handle ;
2002-02-25 09:43:31 +03:00
WERROR werror ;
2008-11-16 00:16:51 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* Parse the command arguments */
2002-02-25 09:43:31 +03:00
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <formname> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-02-25 09:43:31 +03:00
}
2009-02-09 14:40:12 +03:00
2002-02-25 09:43:31 +03:00
/* Get a printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-02-25 09:43:31 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
2002-01-31 14:36:30 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Delete the form */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_DeleteForm ( b , mem_ctx ,
2008-11-16 00:16:51 +03:00
& handle ,
argv [ 2 ] ,
& werror ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
2011-01-19 00:10:30 +03:00
werror = ntstatus_to_werror ( status ) ;
goto done ;
2008-11-16 00:16:51 +03:00
}
2002-01-31 14:36:30 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
2002-01-31 14:36:30 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2002-01-31 14:36:30 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-02-25 09:43:31 +03:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_forms ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2002-02-25 09:43:31 +03:00
{
2009-03-19 00:49:41 +03:00
struct policy_handle handle ;
2002-02-25 09:43:31 +03:00
WERROR werror ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-03-19 14:53:01 +03:00
uint32_t num_forms , level = 1 , i ;
2009-03-06 12:55:41 +03:00
union spoolss_FormInfo * forms ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-09 14:40:12 +03:00
2008-06-17 11:44:21 +04:00
/* Parse the command arguments */
2002-02-25 09:43:31 +03:00
2009-03-06 12:55:41 +03:00
if ( argc < 2 | | argc > 4 ) {
printf ( " Usage: %s <printer> [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-02-25 09:43:31 +03:00
}
2009-02-09 14:40:12 +03:00
2002-02-25 09:43:31 +03:00
/* Get a printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-02-25 09:43:31 +03:00
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
2002-02-25 09:43:31 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
2009-03-06 12:55:41 +03:00
if ( argc = = 3 ) {
level = atoi ( argv [ 2 ] ) ;
}
2002-02-25 09:43:31 +03:00
/* Enumerate forms */
2009-03-06 12:55:41 +03:00
werror = rpccli_spoolss_enumforms ( cli , mem_ctx ,
& handle ,
level ,
0 ,
& num_forms ,
& forms ) ;
2002-02-25 09:43:31 +03:00
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Display output */
for ( i = 0 ; i < num_forms ; i + + ) {
2009-03-06 12:55:41 +03:00
switch ( level ) {
case 1 :
display_form_info1 ( & forms [ i ] . info1 ) ;
break ;
case 2 :
display_form_info2 ( & forms [ i ] . info2 ) ;
break ;
}
2002-02-25 09:43:31 +03:00
}
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
2002-02-25 09:43:31 +03:00
2003-03-18 09:30:30 +03:00
return werror ;
2002-02-25 09:43:31 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2005-09-30 21:13:37 +04:00
static WERROR cmd_spoolss_setprinterdata ( struct rpc_pipe_client * cli ,
2002-04-02 05:10:41 +04:00
TALLOC_CTX * mem_ctx ,
2003-02-26 02:51:56 +03:00
int argc , const char * * argv )
2002-04-02 05:10:41 +04:00
{
WERROR result ;
2009-03-14 04:21:11 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2012-05-09 12:56:54 +04:00
struct policy_handle pol = { 0 , } ;
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info ;
2009-03-14 04:21:11 +03:00
enum winreg_Type type ;
union spoolss_PrinterData data ;
2010-03-04 17:34:49 +03:00
DATA_BLOB blob ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2019-01-28 16:35:30 +03:00
int error = 0 ;
2002-04-02 05:10:41 +04:00
2008-06-17 11:44:21 +04:00
/* parse the command arguments */
2005-08-07 23:09:14 +04:00
if ( argc < 5 ) {
2005-08-08 01:23:38 +04:00
printf ( " Usage: %s <printer> <string|binary|dword|multistring> "
2005-08-07 23:09:14 +04:00
" <value> <data> \n " ,
argv [ 0 ] ) ;
2010-03-05 13:15:35 +03:00
return WERR_OK ;
2005-07-20 19:35:29 +04:00
}
2002-04-02 05:10:41 +04:00
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-04-02 05:10:41 +04:00
2009-03-14 04:21:11 +03:00
type = REG_NONE ;
2005-08-07 23:09:14 +04:00
if ( strequal ( argv [ 2 ] , " string " ) ) {
2009-03-14 04:21:11 +03:00
type = REG_SZ ;
2005-08-07 23:09:14 +04:00
}
if ( strequal ( argv [ 2 ] , " binary " ) ) {
2009-03-14 04:21:11 +03:00
type = REG_BINARY ;
2005-08-07 23:09:14 +04:00
}
if ( strequal ( argv [ 2 ] , " dword " ) ) {
2009-03-14 04:21:11 +03:00
type = REG_DWORD ;
2005-08-07 23:09:14 +04:00
}
if ( strequal ( argv [ 2 ] , " multistring " ) ) {
2009-03-14 04:21:11 +03:00
type = REG_MULTI_SZ ;
2005-08-07 23:09:14 +04:00
}
2009-03-14 04:21:11 +03:00
if ( type = = REG_NONE ) {
2005-08-07 23:09:14 +04:00
printf ( " Unknown data type: %s \n " , argv [ 2 ] ) ;
2015-12-03 17:24:25 +03:00
result = WERR_INVALID_PARAMETER ;
2008-03-28 17:49:13 +03:00
goto done ;
2005-08-07 23:09:14 +04:00
}
2002-04-02 05:10:41 +04:00
/* get a printer handle */
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& pol ) ;
2009-03-14 04:21:11 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-04-02 05:10:41 +04:00
goto done ;
2009-03-14 04:21:11 +03:00
}
2002-04-02 05:10:41 +04:00
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
0 ,
0 ,
& info ) ;
2009-03-14 04:21:11 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-04-02 05:10:41 +04:00
goto done ;
2009-03-14 04:21:11 +03:00
}
2009-02-09 14:40:12 +03:00
2009-03-14 04:21:11 +03:00
printf ( " %s \n " , current_timestring ( mem_ctx , true ) ) ;
2009-02-14 05:08:06 +03:00
printf ( " \t change_id (before set) \t :[0x%x] \n " , info . info0 . change_id ) ;
2002-04-02 05:10:41 +04:00
/* Set the printer data */
2009-02-09 14:40:12 +03:00
2009-03-14 04:21:11 +03:00
switch ( type ) {
case REG_SZ :
data . string = talloc_strdup ( mem_ctx , argv [ 4 ] ) ;
W_ERROR_HAVE_NO_MEMORY ( data . string ) ;
2005-08-07 23:09:14 +04:00
break ;
2009-03-14 04:21:11 +03:00
case REG_DWORD :
2019-06-04 10:04:15 +03:00
data . value = smb_strtoul ( argv [ 4 ] ,
NULL ,
10 ,
& error ,
SMB_STR_STANDARD ) ;
2019-01-28 16:35:30 +03:00
if ( error ! = 0 ) {
result = WERR_INVALID_PARAMETER ;
goto done ;
}
2005-08-07 23:09:14 +04:00
break ;
2009-03-14 04:21:11 +03:00
case REG_BINARY :
data . binary = strhex_to_data_blob ( mem_ctx , argv [ 4 ] ) ;
2005-08-08 01:23:38 +04:00
break ;
2005-08-07 23:09:14 +04:00
case REG_MULTI_SZ : {
2014-11-14 16:12:26 +03:00
int i ;
size_t num_strings ;
2009-03-14 04:21:11 +03:00
const char * * strings = NULL ;
2005-08-07 23:09:14 +04:00
2012-05-09 12:59:49 +04:00
num_strings = 0 ;
2005-08-07 23:09:14 +04:00
for ( i = 4 ; i < argc ; i + + ) {
if ( strcmp ( argv [ i ] , " NULL " ) = = 0 ) {
argv [ i ] = " " ;
}
2009-03-14 04:21:11 +03:00
if ( ! add_string_to_array ( mem_ctx , argv [ i ] ,
& strings ,
& num_strings ) ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2009-03-14 04:21:11 +03:00
goto done ;
}
2005-08-07 23:09:14 +04:00
}
2009-03-14 04:21:11 +03:00
data . string_array = talloc_zero_array ( mem_ctx , const char * , num_strings + 1 ) ;
if ( ! data . string_array ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2005-08-07 23:09:14 +04:00
goto done ;
}
2009-03-14 04:21:11 +03:00
for ( i = 0 ; i < num_strings ; i + + ) {
data . string_array [ i ] = strings [ i ] ;
2005-08-07 23:09:14 +04:00
}
break ;
2009-03-14 04:21:11 +03:00
}
2005-08-07 23:09:14 +04:00
default :
printf ( " Unknown data type: %s \n " , argv [ 2 ] ) ;
2015-12-03 17:24:25 +03:00
result = WERR_INVALID_PARAMETER ;
2005-08-07 23:09:14 +04:00
goto done ;
}
2002-09-25 19:19:00 +04:00
2010-03-04 17:34:49 +03:00
result = push_spoolss_PrinterData ( mem_ctx , & blob , type , & data ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetPrinterData ( b , mem_ctx ,
2009-03-14 04:21:11 +03:00
& pol ,
argv [ 3 ] , /* value_name */
type ,
2010-03-04 17:34:49 +03:00
blob . data ,
blob . length ,
2009-03-14 04:21:11 +03:00
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
printf ( " Unable to set [%s=%s]! \n " , argv [ 3 ] , argv [ 4 ] ) ;
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-04-02 05:10:41 +04:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2005-08-07 23:09:14 +04:00
printf ( " Unable to set [%s=%s]! \n " , argv [ 3 ] , argv [ 4 ] ) ;
2002-04-02 05:10:41 +04:00
goto done ;
}
2005-08-07 23:09:14 +04:00
printf ( " \t SetPrinterData succeeded [%s: %s] \n " , argv [ 3 ] , argv [ 4 ] ) ;
2009-02-09 14:40:12 +03:00
2009-02-14 05:08:06 +03:00
result = rpccli_spoolss_getprinter ( cli , mem_ctx ,
& pol ,
0 ,
0 ,
& info ) ;
2009-03-14 04:21:11 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-04-02 05:10:41 +04:00
goto done ;
2009-03-14 04:21:11 +03:00
}
2009-02-09 14:40:12 +03:00
2009-03-14 04:21:11 +03:00
printf ( " %s \n " , current_timestring ( mem_ctx , true ) ) ;
2009-02-14 05:08:06 +03:00
printf ( " \t change_id (after set) \t :[0x%x] \n " , info . info0 . change_id ) ;
2002-04-02 05:10:41 +04:00
done :
/* cleanup */
2009-03-14 04:21:11 +03:00
if ( is_valid_policy_hnd ( & pol ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & pol , & _result ) ;
2009-03-14 04:21:11 +03:00
}
2002-04-02 05:10:41 +04:00
2003-03-18 09:30:30 +03:00
return result ;
2002-04-02 05:10:41 +04:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-26 17:35:12 +03:00
static void display_job_info1 ( struct spoolss_JobInfo1 * r )
{
printf ( " %d: jobid[%d]: %s %s %s %d/%d pages \n " , r - > position , r - > job_id ,
r - > user_name , r - > document_name , r - > text_status , r - > pages_printed ,
r - > total_pages ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_job_info2 ( struct spoolss_JobInfo2 * r )
{
printf ( " %d: jobid[%d]: %s %s %s %d/%d pages, %d bytes \n " ,
r - > position , r - > job_id ,
r - > user_name , r - > document_name , r - > text_status , r - > pages_printed ,
r - > total_pages , r - > size ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_job_info3 ( struct spoolss_JobInfo3 * r )
{
printf ( " jobid[%d], next_jobid[%d] \n " ,
r - > job_id , r - > next_job_id ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_job_info4 ( struct spoolss_JobInfo4 * r )
{
printf ( " %d: jobid[%d]: %s %s %s %d/%d pages, %d/%d bytes \n " ,
r - > position , r - > job_id ,
r - > user_name , r - > document_name , r - > text_status , r - > pages_printed ,
r - > total_pages , r - > size , r - > size_high ) ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_jobs ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2002-05-07 10:36:22 +04:00
{
WERROR result ;
2009-03-08 00:28:06 +03:00
uint32_t level = 1 , count , i ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-03-19 00:49:41 +03:00
struct policy_handle hnd ;
2009-03-08 00:28:06 +03:00
union spoolss_JobInfo * info ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2007-11-21 02:31:37 +03:00
2002-05-07 10:36:22 +04:00
if ( argc < 2 | | argc > 3 ) {
printf ( " Usage: %s printername [level] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-05-07 10:36:22 +04:00
}
2007-11-21 02:31:37 +03:00
2009-03-08 00:28:06 +03:00
if ( argc = = 3 ) {
2002-05-07 10:36:22 +04:00
level = atoi ( argv [ 2 ] ) ;
2009-03-08 00:28:06 +03:00
}
2002-05-07 10:36:22 +04:00
/* Open printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-05-07 10:36:22 +04:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
2002-05-07 10:36:22 +04:00
if ( ! W_ERROR_IS_OK ( result ) )
goto done ;
2007-11-21 02:31:37 +03:00
2002-05-07 10:36:22 +04:00
/* Enumerate ports */
2009-03-08 00:28:06 +03:00
result = rpccli_spoolss_enumjobs ( cli , mem_ctx ,
& hnd ,
0 , /* firstjob */
1000 , /* numjobs */
level ,
0 ,
& count ,
& info ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-05-07 10:36:22 +04:00
goto done ;
2009-03-08 00:28:06 +03:00
}
2002-05-07 10:36:22 +04:00
2009-03-08 00:28:06 +03:00
for ( i = 0 ; i < count ; i + + ) {
switch ( level ) {
2002-05-07 10:36:22 +04:00
case 1 :
2009-03-08 00:28:06 +03:00
display_job_info1 ( & info [ i ] . info1 ) ;
2002-05-07 10:36:22 +04:00
break ;
case 2 :
2009-03-08 00:28:06 +03:00
display_job_info2 ( & info [ i ] . info2 ) ;
2002-05-07 10:36:22 +04:00
break ;
default :
d_printf ( " unknown info level %d \n " , level ) ;
break ;
}
}
2009-02-09 14:40:12 +03:00
2002-05-07 10:36:22 +04:00
done :
2009-03-08 00:28:06 +03:00
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-03-08 00:28:06 +03:00
}
2002-05-07 10:36:22 +04:00
2003-03-18 09:30:30 +03:00
return result ;
2002-05-07 10:36:22 +04:00
}
2002-04-02 05:10:41 +04:00
2009-02-26 17:35:12 +03:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static WERROR cmd_spoolss_get_job ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR result ;
const char * printername ;
struct policy_handle hnd ;
uint32_t job_id ;
uint32_t level = 1 ;
union spoolss_JobInfo info ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-02-26 17:35:12 +03:00
if ( argc < 3 | | argc > 4 ) {
printf ( " Usage: %s printername job_id [level] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
job_id = atoi ( argv [ 2 ] ) ;
if ( argc = = 4 ) {
level = atoi ( argv [ 3 ] ) ;
}
/* Open printer handle */
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
/* Enumerate ports */
result = rpccli_spoolss_getjob ( cli , mem_ctx ,
& hnd ,
job_id ,
level ,
0 ,
& info ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
switch ( level ) {
case 1 :
display_job_info1 ( & info . info1 ) ;
break ;
case 2 :
display_job_info2 ( & info . info2 ) ;
break ;
case 3 :
display_job_info3 ( & info . info3 ) ;
break ;
case 4 :
display_job_info4 ( & info . info4 ) ;
break ;
default :
d_printf ( " unknown info level %d \n " , level ) ;
break ;
}
done :
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-02-26 17:35:12 +03:00
}
return result ;
}
2009-04-14 01:11:23 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2010-06-24 00:25:15 +04:00
static struct {
const char * name ;
enum spoolss_JobControl val ;
} cmdvals [ ] = {
{ " PAUSE " , SPOOLSS_JOB_CONTROL_PAUSE } ,
{ " RESUME " , SPOOLSS_JOB_CONTROL_RESUME } ,
{ " CANCEL " , SPOOLSS_JOB_CONTROL_CANCEL } ,
{ " RESTART " , SPOOLSS_JOB_CONTROL_RESTART } ,
{ " DELETE " , SPOOLSS_JOB_CONTROL_DELETE } ,
{ " SEND_TO_PRINTER " , SPOOLSS_JOB_CONTROL_SEND_TO_PRINTER } ,
{ " EJECTED " , SPOOLSS_JOB_CONTROL_LAST_PAGE_EJECTED } ,
{ " RETAIN " , SPOOLSS_JOB_CONTROL_RETAIN } ,
{ " RELEASE " , SPOOLSS_JOB_CONTROL_RELEASE }
} ;
static enum spoolss_JobControl parse_setjob_command ( const char * cmd )
{
int i ;
for ( i = 0 ; i < sizeof ( cmdvals ) / sizeof ( cmdvals [ 0 ] ) ; i + + ) {
if ( strequal ( cmdvals [ i ] . name , cmd ) ) {
return cmdvals [ i ] . val ;
}
}
return ( enum spoolss_JobControl ) atoi ( cmd ) ;
}
2009-04-14 01:11:23 +04:00
static WERROR cmd_spoolss_set_job ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR result ;
NTSTATUS status ;
const char * printername ;
struct policy_handle hnd ;
uint32_t job_id ;
enum spoolss_JobControl command ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-04-14 01:11:23 +04:00
if ( argc ! = 4 ) {
printf ( " Usage: %s printername job_id command \n " , argv [ 0 ] ) ;
2010-06-24 00:25:15 +04:00
printf ( " command = [PAUSE|RESUME|CANCEL|RESTART|DELETE| "
" SEND_TO_PRINTER|EJECTED|RETAIN|RELEASE] \n " ) ;
2009-04-14 01:11:23 +04:00
return WERR_OK ;
}
job_id = atoi ( argv [ 2 ] ) ;
2010-06-24 00:25:15 +04:00
command = parse_setjob_command ( argv [ 3 ] ) ;
2009-04-14 01:11:23 +04:00
/* Open printer handle */
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
/* Set Job */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_SetJob ( b , mem_ctx ,
2009-04-14 01:11:23 +04:00
& hnd ,
job_id ,
NULL ,
command ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2009-04-14 01:11:23 +04:00
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
done :
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-04-14 01:11:23 +04:00
}
return result ;
}
2009-02-26 17:35:12 +03:00
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-11-08 23:50:06 +03:00
2009-03-16 17:11:04 +03:00
static WERROR cmd_spoolss_enum_data ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
2002-11-08 23:50:06 +03:00
{
WERROR result ;
2009-03-16 17:11:04 +03:00
NTSTATUS status ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-03-19 00:49:41 +03:00
struct policy_handle hnd ;
2009-03-16 17:11:04 +03:00
uint32_t value_needed ;
enum winreg_Type type ;
uint32_t data_needed ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2011-01-28 20:07:07 +03:00
struct spoolss_EnumPrinterData r ;
2002-11-08 23:50:06 +03:00
if ( argc ! = 2 ) {
printf ( " Usage: %s printername \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-11-08 23:50:06 +03:00
}
2007-11-21 02:31:37 +03:00
2002-11-08 23:50:06 +03:00
/* Open printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-11-08 23:50:06 +03:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
2009-03-16 17:11:04 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-11-08 23:50:06 +03:00
goto done ;
2009-03-16 17:11:04 +03:00
}
2009-02-09 14:40:12 +03:00
2002-11-08 23:50:06 +03:00
/* Enumerate data */
2011-01-28 20:07:07 +03:00
r . in . handle = & hnd ;
r . in . enum_index = 0 ;
r . in . value_offered = 0 ;
r . in . data_offered = 0 ;
r . out . value_name = NULL ;
r . out . value_needed = & value_needed ;
r . out . type = & type ;
r . out . data = NULL ;
r . out . data_needed = & data_needed ;
status = dcerpc_spoolss_EnumPrinterData_r ( b , mem_ctx , & r ) ;
2010-11-11 15:26:10 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2011-01-28 20:07:07 +03:00
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
result = r . out . result ;
2010-11-11 15:26:10 +03:00
goto done ;
}
2011-01-28 20:07:07 +03:00
r . in . data_offered = * r . out . data_needed ;
r . in . value_offered = * r . out . value_needed ;
r . out . data = talloc_zero_array ( mem_ctx , uint8_t , r . in . data_offered ) ;
r . out . value_name = talloc_zero_array ( mem_ctx , char , r . in . value_offered ) ;
do {
status = dcerpc_spoolss_EnumPrinterData_r ( b , mem_ctx , & r ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
if ( W_ERROR_EQUAL ( r . out . result , WERR_NO_MORE_ITEMS ) ) {
result = WERR_OK ;
break ;
}
r . in . enum_index + + ;
2012-04-19 16:00:36 +04:00
display_reg_value ( r . out . value_name , * r . out . type ,
data_blob_const ( r . out . data , r . in . data_offered ) ) ;
2009-03-16 17:11:04 +03:00
2011-01-28 20:07:07 +03:00
} while ( W_ERROR_IS_OK ( r . out . result ) ) ;
2002-11-08 23:50:06 +03:00
done :
2009-03-16 17:11:04 +03:00
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-03-16 17:11:04 +03:00
}
2002-11-08 23:50:06 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2002-11-08 23:50:06 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-11-09 00:40:31 +03:00
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_enum_data_ex ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2002-11-09 00:40:31 +03:00
{
WERROR result ;
2009-03-19 14:53:01 +03:00
uint32_t i ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-03-19 00:49:41 +03:00
struct policy_handle hnd ;
2009-03-18 01:45:16 +03:00
uint32_t count ;
struct spoolss_PrinterEnumValues * info ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2002-11-09 00:40:31 +03:00
if ( argc ! = 3 ) {
printf ( " Usage: %s printername <keyname> \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-11-09 00:40:31 +03:00
}
2007-11-21 02:31:37 +03:00
2002-11-09 00:40:31 +03:00
/* Open printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-11-09 00:40:31 +03:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
2009-03-18 01:45:16 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-11-09 00:40:31 +03:00
goto done ;
2009-03-18 01:45:16 +03:00
}
2009-02-09 14:40:12 +03:00
2002-11-09 00:40:31 +03:00
/* Enumerate subkeys */
2009-03-18 01:45:16 +03:00
result = rpccli_spoolss_enumprinterdataex ( cli , mem_ctx ,
& hnd ,
argv [ 2 ] ,
0 ,
& count ,
& info ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-11-09 00:40:31 +03:00
goto done ;
}
2010-03-04 18:47:10 +03:00
2009-03-18 01:45:16 +03:00
for ( i = 0 ; i < count ; i + + ) {
display_printer_data ( info [ i ] . value_name ,
info [ i ] . type ,
2010-03-04 18:47:10 +03:00
info [ i ] . data - > data ,
info [ i ] . data - > length ) ;
2009-03-18 01:45:16 +03:00
}
2010-03-04 18:47:10 +03:00
2009-03-18 01:45:16 +03:00
done :
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-03-18 01:45:16 +03:00
}
2002-11-09 00:40:31 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2002-11-09 00:40:31 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2002-11-08 22:07:36 +03:00
2009-03-17 00:07:00 +03:00
static WERROR cmd_spoolss_enum_printerkey ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
2002-11-08 22:07:36 +03:00
{
WERROR result ;
2009-02-10 17:11:29 +03:00
const char * printername ;
2003-01-03 11:28:12 +03:00
const char * keyname = NULL ;
2009-03-19 00:49:41 +03:00
struct policy_handle hnd ;
2009-03-17 00:07:00 +03:00
const char * * key_buffer = NULL ;
int i ;
2009-12-09 17:49:46 +03:00
uint32_t offered = 0 ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2002-11-08 22:07:36 +03:00
2009-12-09 17:49:46 +03:00
if ( argc < 2 | | argc > 4 ) {
printf ( " Usage: %s printername [keyname] [offered] \n " , argv [ 0 ] ) ;
2003-03-18 09:30:30 +03:00
return WERR_OK ;
2002-11-08 22:07:36 +03:00
}
2007-11-21 02:31:37 +03:00
2009-12-09 17:49:46 +03:00
if ( argc > = 3 ) {
2002-11-08 22:07:36 +03:00
keyname = argv [ 2 ] ;
2009-03-17 00:07:00 +03:00
} else {
2002-11-08 22:07:36 +03:00
keyname = " " ;
2009-03-17 00:07:00 +03:00
}
2002-11-08 22:07:36 +03:00
2009-12-09 17:49:46 +03:00
if ( argc = = 4 ) {
offered = atoi ( argv [ 3 ] ) ;
}
2002-11-08 22:07:36 +03:00
/* Open printer handle */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2007-11-21 02:31:37 +03:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
2009-03-17 00:07:00 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-11-08 22:07:36 +03:00
goto done ;
2009-03-17 00:07:00 +03:00
}
2009-02-09 14:40:12 +03:00
2002-11-08 23:50:06 +03:00
/* Enumerate subkeys */
2002-11-08 22:07:36 +03:00
2009-03-17 00:07:00 +03:00
result = rpccli_spoolss_enumprinterkey ( cli , mem_ctx ,
& hnd ,
keyname ,
& key_buffer ,
2009-12-09 17:49:46 +03:00
offered ) ;
2002-11-08 22:07:36 +03:00
2009-03-17 00:07:00 +03:00
if ( ! W_ERROR_IS_OK ( result ) ) {
2002-11-08 22:07:36 +03:00
goto done ;
}
2009-03-17 00:07:00 +03:00
for ( i = 0 ; key_buffer & & key_buffer [ i ] ; i + + ) {
printf ( " %s \n " , key_buffer [ i ] ) ;
}
2006-03-31 04:50:09 +04:00
2009-03-17 00:07:00 +03:00
done :
2006-03-31 04:50:09 +04:00
2009-03-17 00:07:00 +03:00
if ( is_valid_policy_hnd ( & hnd ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
2009-03-17 00:07:00 +03:00
}
2002-11-08 22:07:36 +03:00
2003-03-18 09:30:30 +03:00
return result ;
2002-11-08 22:07:36 +03:00
}
2005-07-20 19:35:29 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_rffpcnex ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2003-02-26 02:51:56 +03:00
const char * * argv )
2002-08-17 19:33:49 +04:00
{
2009-02-10 17:11:29 +03:00
const char * printername ;
2009-02-23 12:29:46 +03:00
const char * clientname ;
2012-05-09 12:56:54 +04:00
struct policy_handle hnd = { 0 , } ;
2002-08-17 19:33:49 +04:00
WERROR result ;
2009-02-17 01:32:31 +03:00
NTSTATUS status ;
struct spoolss_NotifyOption option ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2002-08-17 19:33:49 +04:00
if ( argc ! = 2 ) {
printf ( " Usage: %s printername \n " , argv [ 0 ] ) ;
result = WERR_OK ;
goto done ;
}
/* Open printer */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
2002-08-17 19:33:49 +04:00
2009-02-09 20:49:34 +03:00
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& hnd ) ;
2002-08-17 19:33:49 +04:00
if ( ! W_ERROR_IS_OK ( result ) ) {
printf ( " Error opening %s \n " , argv [ 1 ] ) ;
goto done ;
}
/* Create spool options */
option . version = 2 ;
2009-02-17 01:32:31 +03:00
option . count = 2 ;
2002-08-17 19:33:49 +04:00
2009-02-17 01:32:31 +03:00
option . types = talloc_array ( mem_ctx , struct spoolss_NotifyOptionType , 2 ) ;
if ( option . types = = NULL ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2006-06-18 13:45:18 +04:00
goto done ;
}
2002-08-17 19:33:49 +04:00
2009-02-17 01:32:31 +03:00
option . types [ 0 ] . type = PRINTER_NOTIFY_TYPE ;
option . types [ 0 ] . count = 1 ;
2009-03-18 18:10:52 +03:00
option . types [ 0 ] . fields = talloc_array ( mem_ctx , union spoolss_Field , 1 ) ;
2009-02-17 01:32:31 +03:00
if ( option . types [ 0 ] . fields = = NULL ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2009-02-17 01:32:31 +03:00
goto done ;
}
2009-03-18 18:37:33 +03:00
option . types [ 0 ] . fields [ 0 ] . field = PRINTER_NOTIFY_FIELD_SERVER_NAME ;
2002-08-17 19:33:49 +04:00
2009-02-17 01:32:31 +03:00
option . types [ 1 ] . type = JOB_NOTIFY_TYPE ;
option . types [ 1 ] . count = 1 ;
2009-03-18 18:10:52 +03:00
option . types [ 1 ] . fields = talloc_array ( mem_ctx , union spoolss_Field , 1 ) ;
2009-02-17 01:32:31 +03:00
if ( option . types [ 1 ] . fields = = NULL ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2009-02-17 01:32:31 +03:00
goto done ;
}
2009-03-18 18:37:33 +03:00
option . types [ 1 ] . fields [ 0 ] . field = JOB_NOTIFY_FIELD_PRINTER_NAME ;
2002-08-17 19:33:49 +04:00
2011-06-09 09:31:03 +04:00
clientname = talloc_asprintf ( mem_ctx , " \\ \\ %s " , lp_netbios_name ( ) ) ;
2009-02-23 12:29:46 +03:00
if ( ! clientname ) {
2015-12-03 17:24:16 +03:00
result = WERR_NOT_ENOUGH_MEMORY ;
2009-02-23 12:29:46 +03:00
goto done ;
}
2002-08-17 19:33:49 +04:00
/* Send rffpcnex */
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_RemoteFindFirstPrinterChangeNotifyEx ( b , mem_ctx ,
2009-02-17 01:32:31 +03:00
& hnd ,
0 ,
0 ,
2009-02-23 12:29:46 +03:00
clientname ,
2009-02-17 01:32:31 +03:00
123 ,
& option ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2002-08-17 19:33:49 +04:00
if ( ! W_ERROR_IS_OK ( result ) ) {
printf ( " Error rffpcnex %s \n " , argv [ 1 ] ) ;
goto done ;
}
2009-02-09 14:40:12 +03:00
done :
2011-01-19 00:10:30 +03:00
if ( is_valid_policy_hnd ( & hnd ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & hnd , & _result ) ;
}
2002-08-17 19:33:49 +04:00
2003-03-18 09:30:30 +03:00
return result ;
2002-08-17 19:33:49 +04:00
}
2005-09-30 21:13:37 +04:00
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-03-19 00:49:41 +03:00
static bool compare_printer ( struct rpc_pipe_client * cli1 , struct policy_handle * hnd1 ,
struct rpc_pipe_client * cli2 , struct policy_handle * hnd2 )
2005-09-30 21:13:37 +04:00
{
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info1 , info2 ;
2005-09-30 21:13:37 +04:00
WERROR werror ;
TALLOC_CTX * mem_ctx = talloc_init ( " compare_printer " ) ;
2008-04-19 23:56:43 +04:00
printf ( " Retrieving printer propertiesfor %s... " , cli1 - > desthost ) ;
2009-02-14 05:08:06 +03:00
werror = rpccli_spoolss_getprinter ( cli1 , mem_ctx ,
hnd1 ,
2 ,
0 ,
& info1 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2005-09-30 21:13:37 +04:00
talloc_destroy ( mem_ctx ) ;
2009-03-19 14:53:01 +03:00
return false ;
2005-09-30 21:13:37 +04:00
}
printf ( " ok \n " ) ;
2008-04-19 23:56:43 +04:00
printf ( " Retrieving printer properties for %s... " , cli2 - > desthost ) ;
2009-02-14 05:08:06 +03:00
werror = rpccli_spoolss_getprinter ( cli2 , mem_ctx ,
hnd2 ,
2 ,
0 ,
& info2 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2005-09-30 21:13:37 +04:00
talloc_destroy ( mem_ctx ) ;
2009-03-19 14:53:01 +03:00
return false ;
2005-09-30 21:13:37 +04:00
}
printf ( " ok \n " ) ;
talloc_destroy ( mem_ctx ) ;
2009-03-19 14:53:01 +03:00
return true ;
2005-09-30 21:13:37 +04:00
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-03-19 00:49:41 +03:00
static bool compare_printer_secdesc ( struct rpc_pipe_client * cli1 , struct policy_handle * hnd1 ,
struct rpc_pipe_client * cli2 , struct policy_handle * hnd2 )
2005-09-30 21:13:37 +04:00
{
2009-02-14 05:08:06 +03:00
union spoolss_PrinterInfo info1 , info2 ;
2005-09-30 21:13:37 +04:00
WERROR werror ;
TALLOC_CTX * mem_ctx = talloc_init ( " compare_printer_secdesc " ) ;
2010-05-18 12:29:34 +04:00
struct security_descriptor * sd1 , * sd2 ;
2009-03-19 14:53:01 +03:00
bool result = true ;
2005-09-30 21:13:37 +04:00
2008-04-19 23:56:43 +04:00
printf ( " Retrieving printer security for %s... " , cli1 - > desthost ) ;
2009-02-14 05:08:06 +03:00
werror = rpccli_spoolss_getprinter ( cli1 , mem_ctx ,
hnd1 ,
3 ,
0 ,
& info1 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2009-03-19 14:53:01 +03:00
result = false ;
2005-09-30 21:13:37 +04:00
goto done ;
}
printf ( " ok \n " ) ;
2008-04-19 23:56:43 +04:00
printf ( " Retrieving printer security for %s... " , cli2 - > desthost ) ;
2009-02-14 05:08:06 +03:00
werror = rpccli_spoolss_getprinter ( cli2 , mem_ctx ,
hnd2 ,
3 ,
0 ,
& info2 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2009-03-19 14:53:01 +03:00
result = false ;
2005-09-30 21:13:37 +04:00
goto done ;
}
printf ( " ok \n " ) ;
2009-02-09 14:40:12 +03:00
2005-09-30 21:13:37 +04:00
printf ( " ++ " ) ;
2009-02-14 05:08:06 +03:00
sd1 = info1 . info3 . secdesc ;
sd2 = info2 . info3 . secdesc ;
2009-02-09 14:40:12 +03:00
2005-09-30 21:13:37 +04:00
if ( ( sd1 ! = sd2 ) & & ( ! sd1 | | ! sd2 ) ) {
printf ( " NULL secdesc! \n " ) ;
2009-03-19 14:53:01 +03:00
result = false ;
2005-09-30 21:13:37 +04:00
goto done ;
}
2009-02-09 14:40:12 +03:00
2009-04-21 20:15:59 +04:00
if ( ! security_descriptor_equal ( sd1 , sd2 ) ) {
2005-09-30 21:13:37 +04:00
printf ( " Security Descriptors *not* equal! \n " ) ;
2009-03-19 14:53:01 +03:00
result = false ;
2005-09-30 21:13:37 +04:00
goto done ;
}
2009-02-09 14:40:12 +03:00
2005-09-30 21:13:37 +04:00
printf ( " Security descriptors match \n " ) ;
2009-02-09 14:40:12 +03:00
2005-09-30 21:13:37 +04:00
done :
talloc_destroy ( mem_ctx ) ;
return result ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2009-02-09 14:40:12 +03:00
static WERROR cmd_spoolss_printercmp ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
2005-09-30 21:13:37 +04:00
const char * * argv )
{
2009-02-11 11:35:05 +03:00
const char * printername ;
2007-11-21 02:31:37 +03:00
char * printername_path = NULL ;
2005-09-30 21:13:37 +04:00
struct cli_state * cli_server2 = NULL ;
struct rpc_pipe_client * cli2 = NULL ;
2009-03-19 00:49:41 +03:00
struct policy_handle hPrinter1 , hPrinter2 ;
2005-09-30 21:13:37 +04:00
NTSTATUS nt_status ;
WERROR werror ;
2020-12-01 15:48:03 +03:00
struct cli_credentials * creds = samba_cmdline_get_creds ( ) ;
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
if ( argc ! = 3 ) {
printf ( " Usage: %s <printer> <server> \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
2009-02-11 11:35:05 +03:00
printername = argv [ 1 ] ;
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
/* first get the connection to the remote server */
2007-11-21 02:31:37 +03:00
2023-11-23 17:07:53 +03:00
nt_status = cli_full_connection_creds ( mem_ctx ,
& cli_server2 ,
lp_netbios_name ( ) ,
argv [ 2 ] ,
NULL ,
0 ,
" IPC$ " ,
" IPC " ,
creds ,
CLI_FULL_CONNECTION_IPC ) ;
2005-09-30 21:13:37 +04:00
if ( ! NT_STATUS_IS_OK ( nt_status ) )
2015-12-03 17:24:21 +03:00
return WERR_GEN_FAILURE ;
2005-09-30 21:13:37 +04:00
2013-05-24 15:29:28 +04:00
nt_status = cli_rpc_pipe_open_noauth ( cli_server2 , & ndr_table_spoolss ,
2008-07-20 13:04:31 +04:00
& cli2 ) ;
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
2005-09-30 21:13:37 +04:00
printf ( " failed to open spoolss pipe on server %s (%s) \n " ,
2009-02-10 17:11:29 +03:00
argv [ 2 ] , nt_errstr ( nt_status ) ) ;
2015-12-03 17:24:21 +03:00
return WERR_GEN_FAILURE ;
2005-09-30 21:13:37 +04:00
}
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
/* now open up both printers */
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername_path , cli , printername ) ;
2005-09-30 21:13:37 +04:00
printf ( " Opening %s... " , printername_path ) ;
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername_path ,
PRINTER_ALL_ACCESS ,
& hPrinter1 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2005-09-30 21:13:37 +04:00
goto done ;
}
printf ( " ok \n " ) ;
2007-11-21 02:31:37 +03:00
2009-02-10 17:11:29 +03:00
RPCCLIENT_PRINTERNAME ( printername_path , cli2 , printername ) ;
2005-09-30 21:13:37 +04:00
printf ( " Opening %s... " , printername_path ) ;
2009-02-09 20:49:34 +03:00
werror = rpccli_spoolss_openprinter_ex ( cli2 , mem_ctx ,
printername_path ,
PRINTER_ALL_ACCESS ,
& hPrinter2 ) ;
2005-09-30 21:13:37 +04:00
if ( ! W_ERROR_IS_OK ( werror ) ) {
2008-11-01 19:19:26 +03:00
printf ( " failed (%s) \n " , win_errstr ( werror ) ) ;
2005-09-30 21:13:37 +04:00
goto done ;
}
printf ( " ok \n " ) ;
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
compare_printer ( cli , & hPrinter1 , cli2 , & hPrinter2 ) ;
compare_printer_secdesc ( cli , & hPrinter1 , cli2 , & hPrinter2 ) ;
#if 0
compare_printerdata ( cli_server1 , & hPrinter1 , cli_server2 , & hPrinter2 ) ;
# endif
done :
/* cleanup */
2007-11-21 02:31:37 +03:00
printf ( " Closing printers... " ) ;
2011-01-19 00:10:30 +03:00
{
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( cli - > binding_handle , mem_ctx , & hPrinter1 , & _result ) ;
dcerpc_spoolss_ClosePrinter ( cli2 - > binding_handle , mem_ctx , & hPrinter2 , & _result ) ;
}
2005-09-30 21:13:37 +04:00
printf ( " ok \n " ) ;
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
/* close the second remote connection */
2007-11-21 02:31:37 +03:00
2005-09-30 21:13:37 +04:00
cli_shutdown ( cli_server2 ) ;
return WERR_OK ;
}
2009-03-07 00:11:09 +03:00
static void display_proc_info1 ( struct spoolss_PrintProcessorInfo1 * r )
{
printf ( " print_processor_name: %s \n " , r - > print_processor_name ) ;
}
static WERROR cmd_spoolss_enum_procs ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR werror ;
const char * environment = SPOOLSS_ARCHITECTURE_NT_X86 ;
uint32_t num_procs , level = 1 , i ;
union spoolss_PrintProcessorInfo * procs ;
/* Parse the command arguments */
if ( argc < 1 | | argc > 4 ) {
printf ( " Usage: %s [environment] [level] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > = 2 ) {
environment = argv [ 1 ] ;
}
if ( argc = = 3 ) {
level = atoi ( argv [ 2 ] ) ;
}
/* Enumerate Print Processors */
werror = rpccli_spoolss_enumprintprocessors ( cli , mem_ctx ,
cli - > srv_name_slash ,
environment ,
level ,
0 ,
& num_procs ,
& procs ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Display output */
for ( i = 0 ; i < num_procs ; i + + ) {
switch ( level ) {
case 1 :
display_proc_info1 ( & procs [ i ] . info1 ) ;
break ;
}
}
done :
return werror ;
}
2009-03-07 02:55:15 +03:00
static void display_proc_data_types_info1 ( struct spoolss_PrintProcDataTypesInfo1 * r )
{
printf ( " name_array: %s \n " , r - > name_array ) ;
}
static WERROR cmd_spoolss_enum_proc_data_types ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR werror ;
const char * print_processor_name = " winprint " ;
uint32_t num_procs , level = 1 , i ;
union spoolss_PrintProcDataTypesInfo * procs ;
/* Parse the command arguments */
if ( argc < 1 | | argc > 4 ) {
printf ( " Usage: %s [environment] [level] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > = 2 ) {
print_processor_name = argv [ 1 ] ;
}
if ( argc = = 3 ) {
level = atoi ( argv [ 2 ] ) ;
}
/* Enumerate Print Processor Data Types */
werror = rpccli_spoolss_enumprintprocessordatatypes ( cli , mem_ctx ,
cli - > srv_name_slash ,
print_processor_name ,
level ,
0 ,
& num_procs ,
& procs ) ;
if ( ! W_ERROR_IS_OK ( werror ) )
goto done ;
/* Display output */
for ( i = 0 ; i < num_procs ; i + + ) {
switch ( level ) {
case 1 :
display_proc_data_types_info1 ( & procs [ i ] . info1 ) ;
break ;
}
}
done :
return werror ;
}
2009-03-07 02:16:10 +03:00
static void display_monitor1 ( const struct spoolss_MonitorInfo1 * r )
{
printf ( " monitor_name: %s \n " , r - > monitor_name ) ;
}
static void display_monitor2 ( const struct spoolss_MonitorInfo2 * r )
{
printf ( " monitor_name: %s \n " , r - > monitor_name ) ;
printf ( " environment: %s \n " , r - > environment ) ;
printf ( " dll_name: %s \n " , r - > dll_name ) ;
}
static WERROR cmd_spoolss_enum_monitors ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR werror ;
uint32_t count , level = 1 , i ;
union spoolss_MonitorInfo * info ;
/* Parse the command arguments */
if ( argc > 2 ) {
printf ( " Usage: %s [level] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc = = 2 ) {
level = atoi ( argv [ 1 ] ) ;
}
/* Enumerate Print Monitors */
werror = rpccli_spoolss_enummonitors ( cli , mem_ctx ,
cli - > srv_name_slash ,
level ,
0 ,
& count ,
& info ) ;
if ( ! W_ERROR_IS_OK ( werror ) ) {
goto done ;
}
/* Display output */
for ( i = 0 ; i < count ; i + + ) {
switch ( level ) {
case 1 :
display_monitor1 ( & info [ i ] . info1 ) ;
break ;
case 2 :
display_monitor2 ( & info [ i ] . info2 ) ;
break ;
}
}
done :
return werror ;
}
2009-07-17 17:39:40 +04:00
static WERROR cmd_spoolss_create_printer_ic ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR result ;
NTSTATUS status ;
struct policy_handle handle , gdi_handle ;
const char * printername ;
struct spoolss_DevmodeContainer devmode_ctr ;
2011-01-19 00:10:30 +03:00
struct dcerpc_binding_handle * b = cli - > binding_handle ;
2009-07-17 17:39:40 +04:00
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
return result ;
}
ZERO_STRUCT ( devmode_ctr ) ;
2011-01-19 00:10:30 +03:00
status = dcerpc_spoolss_CreatePrinterIC ( b , mem_ctx ,
2009-07-17 17:39:40 +04:00
& handle ,
& gdi_handle ,
& devmode_ctr ,
& result ) ;
2011-01-19 00:10:30 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
2009-07-17 17:39:40 +04:00
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
done :
if ( is_valid_policy_hnd ( & gdi_handle ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_DeletePrinterIC ( b , mem_ctx , & gdi_handle , & _result ) ;
2009-07-17 17:39:40 +04:00
}
if ( is_valid_policy_hnd ( & handle ) ) {
2011-01-19 00:10:30 +03:00
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
2009-07-17 17:39:40 +04:00
}
return result ;
}
2013-01-23 12:31:01 +04:00
static WERROR cmd_spoolss_play_gdi_script_on_printer_ic ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
WERROR result ;
NTSTATUS status ;
struct policy_handle handle , gdi_handle ;
const char * printername ;
struct spoolss_DevmodeContainer devmode_ctr ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
DATA_BLOB in , out ;
uint32_t count = 0 ;
RPCCLIENT_PRINTERNAME ( printername , cli , argv [ 1 ] ) ;
result = rpccli_spoolss_openprinter_ex ( cli , mem_ctx ,
printername ,
SEC_FLAG_MAXIMUM_ALLOWED ,
& handle ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
return result ;
}
ZERO_STRUCT ( devmode_ctr ) ;
status = dcerpc_spoolss_CreatePrinterIC ( b , mem_ctx ,
& handle ,
& gdi_handle ,
& devmode_ctr ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
in = data_blob_string_const ( " " ) ;
out = data_blob_talloc_zero ( mem_ctx , 4 ) ;
status = dcerpc_spoolss_PlayGDIScriptOnPrinterIC ( b , mem_ctx ,
& gdi_handle ,
in . data ,
in . length ,
out . data ,
out . length ,
0 , /* ul */
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
count = IVAL ( out . data , 0 ) ;
out = data_blob_talloc_zero ( mem_ctx ,
count * sizeof ( struct UNIVERSAL_FONT_ID ) + 4 ) ;
status = dcerpc_spoolss_PlayGDIScriptOnPrinterIC ( b , mem_ctx ,
& gdi_handle ,
in . data ,
in . length ,
out . data ,
out . length ,
0 , /* ul */
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
result = ntstatus_to_werror ( status ) ;
goto done ;
}
if ( ! W_ERROR_IS_OK ( result ) ) {
goto done ;
}
{
enum ndr_err_code ndr_err ;
struct UNIVERSAL_FONT_ID_ctr r ;
ndr_err = ndr_pull_struct_blob ( & out , mem_ctx , & r ,
( ndr_pull_flags_fn_t ) ndr_pull_UNIVERSAL_FONT_ID_ctr ) ;
if ( NDR_ERR_CODE_IS_SUCCESS ( ndr_err ) ) {
NDR_PRINT_DEBUG ( UNIVERSAL_FONT_ID_ctr , & r ) ;
}
}
done :
if ( is_valid_policy_hnd ( & gdi_handle ) ) {
WERROR _result ;
dcerpc_spoolss_DeletePrinterIC ( b , mem_ctx , & gdi_handle , & _result ) ;
}
if ( is_valid_policy_hnd ( & handle ) ) {
WERROR _result ;
dcerpc_spoolss_ClosePrinter ( b , mem_ctx , & handle , & _result ) ;
}
return result ;
}
2016-09-19 18:03:44 +03:00
static WERROR cmd_spoolss_get_core_printer_drivers ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
NTSTATUS status ;
HRESULT result ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
const char * architecture = SPOOLSS_ARCHITECTURE_x64 ;
struct spoolss_CorePrinterDriver core_printer_drivers ;
DATA_BLOB blob ;
bool ok ;
int i ;
uint32_t count ;
const char * * array ;
if ( argc = = 1 ) {
count = 1 ;
array = talloc_zero_array ( mem_ctx , const char * , count + 1 ) ;
if ( array = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
array [ 0 ] = talloc_strdup ( array , SPOOLSS_CORE_PRINT_PACKAGE_FILES_XPSDRV ) ;
if ( array [ 0 ] = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
} else {
count = argc - 1 ;
array = talloc_zero_array ( mem_ctx , const char * , count + 1 ) ;
if ( array = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
for ( i = 0 ; i < argc - 1 ; i + + ) {
array [ i ] = talloc_strdup ( array , argv [ i + 1 ] ) ;
if ( array [ i ] = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
}
}
ok = push_reg_multi_sz ( mem_ctx , & blob , array ) ;
if ( ! ok ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
status = dcerpc_spoolss_GetCorePrinterDrivers ( b , mem_ctx ,
cli - > srv_name_slash ,
architecture ,
blob . length / 2 ,
( uint16_t * ) blob . data ,
count ,
& core_printer_drivers ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
if ( ! HRES_IS_OK ( result ) ) {
return W_ERROR ( WIN32_FROM_HRESULT ( result ) ) ;
}
return WERR_OK ;
}
2016-12-01 23:32:18 +03:00
static WERROR cmd_spoolss_enum_permachineconnections ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
NTSTATUS status ;
WERROR result ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
const char * servername = cli - > srv_name_slash ;
DATA_BLOB in = data_blob_null ;
2019-12-23 18:53:37 +03:00
struct spoolss_PrinterInfo4 * info ;
2016-12-01 23:32:18 +03:00
uint32_t needed , count ;
if ( argc > 2 ) {
printf ( " usage: %s [servername] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > 1 ) {
servername = argv [ 1 ] ;
}
status = dcerpc_spoolss_EnumPerMachineConnections ( b , mem_ctx ,
servername ,
& in ,
in . length ,
& count ,
2019-12-23 18:53:37 +03:00
& info ,
& needed ,
2016-12-01 23:32:18 +03:00
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
if ( W_ERROR_EQUAL ( result , WERR_INSUFFICIENT_BUFFER ) ) {
in = data_blob_talloc_zero ( mem_ctx , needed ) ;
status = dcerpc_spoolss_EnumPerMachineConnections ( b , mem_ctx ,
2019-12-23 18:53:37 +03:00
servername ,
& in ,
in . length ,
& count ,
& info ,
& needed ,
& result ) ;
2016-12-01 23:32:18 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
}
return result ;
}
2019-12-23 14:42:53 +03:00
static WERROR cmd_spoolss_add_permachineconnection ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
NTSTATUS status ;
WERROR result ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
const char * servername = cli - > srv_name_slash ;
const char * printername = " Microsoft Print to PDF " ;
const char * printserver = " samba.org " ;
const char * provider = " " ; /* refers to Win32spl.dll then */
const char * composed_printername ;
if ( argc > 5 ) {
printf ( " usage: %s [servername] [printername] [printserver] [provider] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > 1 ) {
servername = argv [ 1 ] ;
}
if ( argc > 2 ) {
printername = argv [ 2 ] ;
}
if ( argc > 3 ) {
printserver = argv [ 3 ] ;
}
if ( argc > 4 ) {
provider = argv [ 4 ] ;
}
composed_printername = talloc_asprintf ( mem_ctx , " %s \\ %s " , servername ,
printername ) ;
if ( composed_printername = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
status = dcerpc_spoolss_AddPerMachineConnection ( b , mem_ctx ,
servername ,
composed_printername ,
printserver ,
provider ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
return result ;
}
2019-09-22 04:34:27 +03:00
static WERROR cmd_spoolss_del_permachineconnection ( struct rpc_pipe_client * cli ,
TALLOC_CTX * mem_ctx , int argc ,
const char * * argv )
{
NTSTATUS status ;
WERROR result ;
struct dcerpc_binding_handle * b = cli - > binding_handle ;
const char * servername = cli - > srv_name_slash ;
const char * printername = " Microsoft Print to PDF " ;
const char * composed_printername ;
if ( argc > 3 ) {
printf ( " usage: %s [servername] [printername] \n " , argv [ 0 ] ) ;
return WERR_OK ;
}
if ( argc > 1 ) {
servername = argv [ 1 ] ;
}
if ( argc > 2 ) {
printername = argv [ 2 ] ;
}
composed_printername = talloc_asprintf ( mem_ctx , " %s \\ %s " , servername ,
printername ) ;
if ( composed_printername = = NULL ) {
return WERR_NOT_ENOUGH_MEMORY ;
}
status = dcerpc_spoolss_DeletePerMachineConnection ( b , mem_ctx ,
servername ,
composed_printername ,
& result ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return ntstatus_to_werror ( status ) ;
}
return result ;
}
2001-01-12 01:49:30 +03:00
/* List of commands exported by this module */
struct cmd_set spoolss_commands [ ] = {
2000-08-10 00:14:29 +04:00
2019-01-08 19:50:20 +03:00
{
. name = " SPOOLSS " ,
} ,
{
. name = " adddriver " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_addprinterdriver ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Add a print driver " ,
. usage = " " ,
. use_netlogon_creds = false ,
} ,
{
. name = " addprinter " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_addprinterex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Add a printer " ,
. usage = " " ,
} ,
{
. name = " deldriver " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_deletedriver ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Delete a printer driver " ,
. usage = " " ,
} ,
{
. name = " deldriverex " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_deletedriverex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Delete a printer driver with files " ,
. usage = " " ,
} ,
{
. name = " enumdata " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_data ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate printer data " ,
. usage = " " ,
} ,
{
. name = " enumdataex " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_data_ex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate printer data for a key " ,
. usage = " " ,
} ,
{
. name = " enumkey " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_printerkey ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate printer keys " ,
. usage = " " ,
} ,
{
. name = " enumjobs " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_jobs ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate print jobs " ,
. usage = " " ,
} ,
{
. name = " getjob " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_get_job ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print job " ,
. usage = " " ,
} ,
{
. name = " setjob " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_set_job ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set print job " ,
. usage = " " ,
} ,
{
. name = " enumports " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_ports ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate printer ports " ,
. usage = " " ,
} ,
{
. name = " enumdrivers " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_drivers ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate installed printer drivers " ,
. usage = " " ,
} ,
{
. name = " enumprinters " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_printers ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate printers " ,
. usage = " " ,
} ,
{
. name = " getdata " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getprinterdata ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print driver data " ,
. usage = " " ,
} ,
{
. name = " getdataex " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getprinterdataex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get printer driver data with keyname " ,
. usage = " " ,
} ,
{
. name = " getdriver " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getdriver ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print driver information " ,
. usage = " " ,
} ,
{
. name = " getdriverdir " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getdriverdir ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print driver upload directory " ,
. usage = " " ,
} ,
{
. name = " getdriverpackagepath " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getdriverpackagepath ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print driver package download directory " ,
. usage = " " ,
} ,
{
. name = " getprinter " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getprinter ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get printer info " ,
. usage = " " ,
} ,
{
. name = " openprinter " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_open_printer ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Open printer handle " ,
. usage = " " ,
} ,
{
. name = " openprinter_ex " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_open_printer_ex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Open printer handle " ,
. usage = " " ,
} ,
{
. name = " setdriver " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_setdriver ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set printer driver " ,
. usage = " " ,
} ,
{
. name = " getprintprocdir " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getprintprocdir ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get print processor directory " ,
. usage = " " ,
} ,
{
. name = " addform " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_addform ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Add form " ,
. usage = " " ,
} ,
{
. name = " setform " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_setform ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set form " ,
. usage = " " ,
} ,
{
. name = " getform " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_getform ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get form " ,
. usage = " " ,
} ,
{
. name = " deleteform " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_deleteform ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Delete form " ,
. usage = " " ,
} ,
{
. name = " enumforms " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_forms ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate forms " ,
. usage = " " ,
} ,
{
. name = " setprinter " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_setprinter ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set printer comment " ,
. usage = " " ,
} ,
{
. name = " setprintername " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_setprintername ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set printername " ,
. usage = " " ,
} ,
{
. name = " setprinterdata " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_setprinterdata ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Set REG_SZ printer data " ,
. usage = " " ,
} ,
{
. name = " rffpcnex " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_rffpcnex ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Rffpcnex test " ,
. usage = " " ,
} ,
{
. name = " printercmp " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_printercmp ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Printer comparison test " ,
. usage = " " ,
} ,
{
. name = " enumprocs " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_procs ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate Print Processors " ,
. usage = " " ,
} ,
{
. name = " enumprocdatatypes " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_proc_data_types ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate Print Processor Data Types " ,
. usage = " " ,
} ,
{
. name = " enummonitors " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_monitors ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate Print Monitors " ,
. usage = " " ,
} ,
{
. name = " createprinteric " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_create_printer_ic ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Create Printer IC " ,
. usage = " " ,
} ,
{
. name = " playgdiscriptonprinteric " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_play_gdi_script_on_printer_ic ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Create Printer IC " ,
. usage = " " ,
} ,
2016-09-19 18:03:44 +03:00
{
. name = " getcoreprinterdrivers " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_get_core_printer_drivers ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Get CorePrinterDriver " ,
. usage = " " ,
} ,
2016-12-01 23:32:18 +03:00
{
. name = " enumpermachineconnections " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_enum_permachineconnections ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Enumerate Per Machine Connections " ,
. usage = " " ,
} ,
2019-12-23 14:42:53 +03:00
{
. name = " addpermachineconnection " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_add_permachineconnection ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Add Per Machine Connection " ,
. usage = " " ,
} ,
2019-09-22 04:34:27 +03:00
{
. name = " delpermachineconnection " ,
. returntype = RPC_RTYPE_WERROR ,
. ntfn = NULL ,
. wfn = cmd_spoolss_del_permachineconnection ,
. table = & ndr_table_spoolss ,
. rpc_pipe = NULL ,
. description = " Delete Per Machine Connection " ,
. usage = " " ,
} ,
2019-01-08 19:50:20 +03:00
{
. name = NULL ,
} ,
2001-01-12 01:49:30 +03:00
} ;