2 Unix SMB/Netbios implementation.
4 NT Domain Authentication SMB / MSRPC client
5 Copyright (C) Andrew Tridgell 1994-2000
6 Copyright (C) Luke Kenneth Casson Leighton 1996-2000
7 Copyright (C) Jean-Francois Micouleau 1999-2000
8 Copyright (C) Gerald Carter 2000
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include "rpc_parse.h"
28 #include "rpc_client.h"
29 #include "rpcclient.h"
31 extern int DEBUGLEVEL;
37 extern struct user_creds *usr_creds;
39 /****************************************************************************
41 ****************************************************************************/
42 uint32 cmd_spoolss_enum_printers(struct client_info *info, int argc, char *argv[])
50 fstrcpy(srv_name, "\\\\");
51 fstrcat(srv_name, info->dest_host);
54 flags=PRINTER_ENUM_LOCAL;
56 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
57 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
59 report(out_hnd, "FAILED\n");
61 flags=PRINTER_ENUM_NAME;
63 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
64 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
66 report(out_hnd, "FAILED\n");
68 flags=PRINTER_ENUM_SHARED|PRINTER_ENUM_NAME;
70 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
71 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
73 report(out_hnd, "FAILED\n");
75 flags=PRINTER_ENUM_CONNECTIONS;
77 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
78 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
80 report(out_hnd, "FAILED\n");
82 flags=PRINTER_ENUM_NETWORK;
84 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
85 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
87 report(out_hnd, "FAILED\n");
89 flags=PRINTER_ENUM_REMOTE;
91 if (msrpc_spoolss_enum_printers(srv_name, flags, level, ctr))
92 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
94 report(out_hnd, "FAILED\n");
96 return NT_STATUS_NOPROBLEMO;
99 /****************************************************************************
101 ****************************************************************************/
102 uint32 cmd_spoolss_enum_ports(struct client_info *info, int argc, char *argv[])
109 fstrcpy(srv_name, "\\\\");
110 fstrcat(srv_name, info->dest_host);
113 if (msrpc_spoolss_enum_ports(srv_name, level, &ctr))
114 DEBUG(5,("cmd_spoolss_enum_printer: query succeeded\n"));
116 report(out_hnd, "FAILED\n");
118 return NT_STATUS_NOPROBLEMO;
121 /****************************************************************************
123 ****************************************************************************/
124 uint32 cmd_spoolss_enum_printerdata(struct client_info *info, int argc, char *argv[])
131 report(out_hnd, "spoolenumdata <printer name>\n");
132 return NT_STATUS_INVALID_PARAMETER;
135 printer_name = argv[1];
137 fstrcpy(station, "\\\\");
138 fstrcat(station, info->myhostname);
141 fstrcpy(srv_name, "\\\\");
142 fstrcat(srv_name, info->dest_host);
145 if (!strnequal("\\\\", printer_name, 2))
147 fstrcat(srv_name, "\\");
148 fstrcat(srv_name, printer_name);
149 printer_name = srv_name;
152 DEBUG(4,("spoolopen - printer: %s station: %s user: %s\n", printer_name, station, usr_creds->ntc.user_name));
154 if (msrpc_spoolss_enum_printerdata( printer_name, station,
155 usr_creds->ntc.user_name))
157 DEBUG(5,("cmd_spoolss_enum_printerdata: query succeeded\n"));
158 return NT_STATUS_NOPROBLEMO;
160 report(out_hnd, "FAILED\n");
161 return NT_STATUS_UNSUCCESSFUL;
164 /****************************************************************************
166 ****************************************************************************/
167 uint32 cmd_spoolss_getprinter(struct client_info *info, int argc, char *argv[])
169 PRINTER_INFO_CTR ctr;
176 report(out_hnd, "spoolgetprinter <printer name>\n");
177 return NT_STATUS_INVALID_PARAMETER;
180 printer_name = argv[1];
182 fstrcpy(station, "\\\\");
183 fstrcat(station, info->myhostname);
186 fstrcpy(srv_name, "\\\\");
187 fstrcat(srv_name, info->dest_host);
190 if (!strnequal("\\\\", printer_name, 2))
192 fstrcat(srv_name, "\\");
193 fstrcat(srv_name, printer_name);
194 printer_name = srv_name;
200 level = atoi(argv[2]);
202 if (msrpc_spoolss_getprinter(printer_name, level, station, "Administrator", ctr))
203 DEBUG(5,("cmd_spoolss_getprinter: query succeeded\n"));
205 report(out_hnd, "FAILED\n");
207 return NT_STATUS_NOPROBLEMO;
211 static void display_spool_job_info_ctr( const char* printer_name,
214 uint32 num, void *const *const ctr)
216 display_job_info_ctr(out_hnd, ACTION_HEADER , level, num, ctr);
217 display_job_info_ctr(out_hnd, ACTION_ENUMERATE, level, num, ctr);
218 display_job_info_ctr(out_hnd, ACTION_FOOTER , level, num, ctr);
221 /****************************************************************************
223 ****************************************************************************/
224 uint32 cmd_spoolss_enum_jobs(struct client_info *info, int argc, char *argv[])
234 report(out_hnd, "spooljobs <printer name>\n");
235 return NT_STATUS_INVALID_PARAMETER;
238 printer_name = argv[1];
240 fstrcpy(station, "\\\\");
241 fstrcat(station, info->myhostname);
244 fstrcpy(srv_name, "\\\\");
245 fstrcat(srv_name, info->dest_host);
248 if (!strnequal("\\\\", printer_name, 2))
250 fstrcat(srv_name, "\\");
251 fstrcat(srv_name, printer_name);
252 printer_name = srv_name;
255 DEBUG(4,("spoolopen - printer: %s station: %s user: %s\n", printer_name,
256 station, usr_creds->ntc.user_name));
258 if (msrpc_spoolss_enum_jobs( printer_name, station,
259 usr_creds->ntc.user_name,
260 level, &ctr, display_spool_job_info_ctr))
262 DEBUG(5,("cmd_spoolss_enum_jobs: query succeeded\n"));
263 return NT_STATUS_NOPROBLEMO;
265 report(out_hnd, "FAILED\n");
266 return NT_STATUS_UNSUCCESSFUL;
269 /****************************************************************************
271 ****************************************************************************/
272 uint32 cmd_spoolss_open_printer_ex(struct client_info *info, int argc, char *argv[])
283 report(out_hnd, "spoolopen <printer name>\n");
284 return NT_STATUS_INVALID_PARAMETER;
287 printer_name = argv[1];
289 fstrcpy(station, "\\\\");
290 fstrcat(station, info->myhostname);
293 fstrcpy(srv_name, "\\\\");
294 fstrcat(srv_name, info->dest_host);
297 if (!strnequal("\\\\", printer_name, 2))
299 fstrcat(srv_name, "\\");
300 fstrcat(srv_name, printer_name);
301 printer_name = srv_name;
304 DEBUG(4,("spoolopen - printer: %s server: %s user: %s\n",
305 printer_name, station, usr_creds->ntc.user_name));
307 res = res ? spoolss_open_printer_ex( printer_name, "", PRINTER_ALL_ACCESS,
308 station, "Administrator", &hnd) : False;
310 res = res ? spoolss_closeprinter(&hnd) : False;
314 DEBUG(5,("cmd_spoolss_open_printer_ex: query succeeded\n"));
315 report(out_hnd, "OK\n");
316 return NT_STATUS_NOPROBLEMO;
318 DEBUG(5,("cmd_spoolss_open_printer_ex: query failed\n"));
319 return NT_STATUS_UNSUCCESSFUL;
322 /****************************************************************************
324 ****************************************************************************/
325 uint32 cmd_spoolss_getprinterdata(struct client_info *info, int argc, char *argv[])
337 report(out_hnd, "spoolgetdata <printer name> <value name>\n");
338 return NT_STATUS_INVALID_PARAMETER;
341 printer_name = argv[1];
342 value_name = argv[2];
344 fstrcpy(station, "\\\\");
345 fstrcat(station, info->myhostname);
348 fstrcpy(srv_name, "\\\\");
349 fstrcat(srv_name, info->dest_host);
352 if (!strnequal("\\\\", printer_name, 2))
354 fstrcat(srv_name, "\\");
355 fstrcat(srv_name, printer_name);
356 printer_name = srv_name;
359 DEBUG(4,("spoolgetdata - printer: %s station: %s value: %s\n",
360 printer_name, station, value_name));
362 status = msrpc_spoolss_getprinterdata( printer_name, station,
363 /* "Administrateur", */
364 usr_creds->ntc.user_name,
368 if (status == NT_STATUS_NOPROBLEMO)
370 DEBUG(5,("cmd_spoolss_getprinterdata: query succeeded\n"));
374 report(out_hnd, "FAILED\n");
380 /****************************************************************************
382 ****************************************************************************/
383 uint32 cmd_spoolss_getprinterdriver(struct client_info *info, int argc, char *argv[])
385 PRINTER_DRIVER_CTR ctr;
393 report(out_hnd, "spoolgetprinterdriver <printer name>\n");
394 return NT_STATUS_INVALID_PARAMETER;
397 printer_name = argv[1];
399 fstrcpy(station, "\\\\");
400 fstrcat(station, info->myhostname);
403 fstrcpy(srv_name, "\\\\");
404 fstrcat(srv_name, info->dest_host);
407 if (!strnequal("\\\\", printer_name, 2))
409 fstrcat(srv_name, "\\");
410 fstrcat(srv_name, printer_name);
411 printer_name = srv_name;
414 fstrcpy(environment, "Windows NT x86");
417 if (msrpc_spoolss_getprinterdriver(printer_name, environment, level, station, "Administrator", ctr))
418 DEBUG(5,("cmd_spoolss_getprinterdriver: query succeeded\n"));
420 report(out_hnd, "FAILED\n");
422 return NT_STATUS_NOPROBLEMO;
425 /****************************************************************************
427 ****************************************************************************/
428 uint32 cmd_spoolss_enumprinterdrivers(struct client_info *info, int argc, char *argv[])
430 PRINTER_DRIVER_CTR ctr;
435 fstrcpy(srv_name, "\\\\");
436 fstrcat(srv_name, info->dest_host);
439 fstrcpy(environment, "Windows NT x86");
442 if (msrpc_spoolss_enumprinterdrivers(srv_name, environment, level, ctr))
443 DEBUG(5,("cmd_spoolss_enumprinterdrivers: query succeeded\n"));
445 report(out_hnd, "FAILED\n");
447 return NT_STATUS_NOPROBLEMO;
450 /****************************************************************************
452 ****************************************************************************/
453 uint32 cmd_spoolss_getprinterdriverdir(struct client_info *info, int argc, char *argv[])
455 DRIVER_DIRECTORY_CTR ctr;
463 fstrcpy(srv_name, "\\\\");
464 fstrcat(srv_name, info->dest_host);
468 report(out_hnd, "spoolgetprinterdriverdir <arch>\n");
469 return NT_STATUS_NOPROBLEMO;
472 fstrcpy(env, argv[1]);
474 for (i=2; i<=argc; i++) {
476 fstrcat(env, argv[i]);
479 if (msrpc_spoolss_getprinterdriverdir(srv_name, env, level, ctr))
480 DEBUG(5,("cmd_spoolss_getprinterdriverdir: query succeeded\n"));
482 report(out_hnd, "FAILED\n");
484 return NT_STATUS_NOPROBLEMO;
487 /********************************************************************************
488 send an AddPrinterEx() request
489 ********************************************************************************/
490 uint32 cmd_spoolss_addprinterex(struct client_info *info, int argc, char *argv[])
493 PRINTER_INFO_CTR ctr;
500 PRINTER_INFO_2 print_info_2;
501 PORT_INFO_1 *port_info_1 = NULL;
507 fstring srv_port_name;
508 BOOL valid_port = False;
510 fstrcpy(srv_name, "\\\\");
511 fstrcat(srv_name, info->dest_host);
514 /* check (and copy) the command line arguments */
516 report(out_hnd, "spooladdprinterex <name> <driver>\n");
517 return NT_STATUS_NOPROBLEMO;
520 fstrcpy(printer_name, argv[1]);
521 fstrcpy(driver_name, argv[2]);
522 fstrcpy(port_name, argv[3]);
525 /* Verify that the specified port is ok; spoolss_enum_ports() should
526 be a level 1 since all we need is the name */
527 init_buffer (&buffer, 0);
529 /* send a NULL buffer first */
530 status=spoolss_enum_ports(srv_name, 1, &buffer, 0,
533 /* send the right amount of space this time */
534 if (status==ERROR_INSUFFICIENT_BUFFER) {
535 init_buffer(&buffer, needed);
536 status=spoolss_enum_ports(srv_name, 1, &buffer,
537 needed, &needed, &returned);
539 /* if the call succeeded, then decode the buffer into
540 an PRINTER_INFO_1 structre */
541 if (status == NT_STATUS_NO_PROBLEMO)
543 decode_port_info_1 (&buffer, returned, &port_info_1);
547 report (out_hnd, "cmd_spoolss_addprinterex: FAILED to enumerate ports\n"));
548 return NT_STATUS_NOPROBLEMO;
554 * now we have an array of port names and we can interate
555 * through it to verify port_name before actually attempting
556 * to add the printer on the server.
558 for (i=0; i<returned; i++)
560 /* compare port_info_1[i].port_name to the port_name specified */
561 unistr_to_ascii(srv_port_name, port_info_1[i].port_name, sizeof(srv_port_name)-1);
562 if (strequal(srv_port_name, port_name))
570 report (out_hnd, "cmd_spoolss_addprinterex: Invalid port specified!\n");
571 return NT_STATUS_NOPROBLEMO;
576 * Need to build the PRINTER_INFO_2 struct here
580 /* if successful, spoolss_addprinterex() should return True and hnd
581 should be a valid handle to an open printer */
582 if (spoolss_addprinterex(&hnd, 2, &print_info_2))
584 if (!spoolss_closeprinter( &hnd ))
586 report (out_hnd, "cmd_spoolss_addprinterex: spoolss_closeprinter FAILED!\n");
591 report (out_hnd, "cmd_spoolss_addprinterex: spoolss_addprinterex FAILED!\n");
596 return NT_STATUS_NOPROBLEMO;