📄 cmd_spoolss.c
字号:
if (!W_ERROR_IS_OK(result)) { printf("SetPrinter call failed!\n"); goto done;; } printf("Succesfully set %s to driver %s.\n", argv[1], argv[2]);done: /* Cleanup */ if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_deletedriverex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result, ret = WERR_UNKNOWN_PRINTER_DRIVER; int i; int vers = -1; const char *arch = NULL; /* parse the command arguements */ if (argc < 2 || argc > 4) { printf ("Usage: %s <driver> [arch] [version]\n", argv[0]); return WERR_OK; } if (argc >= 3) arch = argv[2]; if (argc == 4) vers = atoi (argv[3]); /* delete the driver for all architectures */ for (i=0; archi_table[i].long_archi; i++) { if (arch && !strequal( archi_table[i].long_archi, arch)) continue; if (vers >= 0 && archi_table[i].version != vers) continue; /* make the call to remove the driver */ result = rpccli_spoolss_deleteprinterdriverex( cli, mem_ctx, archi_table[i].long_archi, argv[1], archi_table[i].version); if ( !W_ERROR_IS_OK(result) ) { if ( !W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ) { printf ("Failed to remove driver %s for arch [%s] (version: %d): %s\n", argv[1], archi_table[i].long_archi, archi_table[i].version, dos_errstr(result)); } } else { printf ("Driver %s and files removed for arch [%s] (version: %d).\n", argv[1], archi_table[i].long_archi, archi_table[i].version); ret = WERR_OK; } } return ret;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_deletedriver(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result = WERR_OK; fstring servername; int i; /* parse the command arguements */ if (argc != 2) { printf ("Usage: %s <driver>\n", argv[0]); return WERR_OK; } slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); /* delete the driver for all architectures */ for (i=0; archi_table[i].long_archi; i++) { /* make the call to remove the driver */ result = rpccli_spoolss_deleteprinterdriver( cli, mem_ctx, archi_table[i].long_archi, argv[1]); if ( !W_ERROR_IS_OK(result) ) { if ( !W_ERROR_EQUAL(result, WERR_UNKNOWN_PRINTER_DRIVER) ) { printf ("Failed to remove driver %s for arch [%s] - error 0x%x!\n", argv[1], archi_table[i].long_archi, W_ERROR_V(result)); } } else { printf ("Driver %s removed for arch [%s].\n", argv[1], archi_table[i].long_archi); } } return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getprintprocdir(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; char *servername = NULL, *environment = NULL; fstring procdir; /* parse the command arguements */ if (argc > 2) { printf ("Usage: %s [environment]\n", argv[0]); return WERR_OK; } if (asprintf(&servername, "\\\\%s", cli->cli->desthost) < 0) return WERR_NOMEM; strupper_m(servername); if (asprintf(&environment, "%s", (argc == 2) ? argv[1] : PRINTER_DRIVER_ARCHITECTURE) < 0) { SAFE_FREE(servername); return WERR_NOMEM; } result = rpccli_spoolss_getprintprocessordirectory( cli, mem_ctx, servername, environment, procdir); if (W_ERROR_IS_OK(result)) printf("%s\n", procdir); SAFE_FREE(servername); SAFE_FREE(environment); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND handle; WERROR werror; char *servername = NULL, *printername = NULL; FORM form; BOOL got_handle = False; /* Parse the command arguements */ if (argc != 3) { printf ("Usage: %s <printer> <formname>\n", argv[0]); return WERR_OK; } /* Get a printer handle */ asprintf(&servername, "\\\\%s", cli->cli->desthost); strupper_m(servername); asprintf(&printername, "%s\\%s", servername, argv[1]); werror = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", PRINTER_ALL_ACCESS, servername, cli->user_name, &handle); if (!W_ERROR_IS_OK(werror)) goto done; got_handle = True; /* Dummy up some values for the form data */ form.flags = FORM_USER; form.size_x = form.size_y = 100; form.left = 0; form.top = 10; form.right = 20; form.bottom = 30; init_unistr2(&form.name, argv[2], UNI_STR_TERMINATE); /* Add the form */ werror = rpccli_spoolss_addform(cli, mem_ctx, &handle, 1, &form); done: if (got_handle) rpccli_spoolss_close_printer(cli, mem_ctx, &handle); SAFE_FREE(servername); SAFE_FREE(printername); return werror;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND handle; WERROR werror; char *servername = NULL, *printername = NULL; FORM form; BOOL got_handle = False; /* Parse the command arguements */ if (argc != 3) { printf ("Usage: %s <printer> <formname>\n", argv[0]); return WERR_OK; } /* Get a printer handle */ asprintf(&servername, "\\\\%s", cli->cli->desthost); strupper_m(servername); asprintf(&printername, "%s\\%s", servername, argv[1]); werror = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, cli->user_name, &handle); if (!W_ERROR_IS_OK(werror)) goto done; got_handle = True; /* Dummy up some values for the form data */ form.flags = FORM_PRINTER; form.size_x = form.size_y = 100; form.left = 0; form.top = 1000; form.right = 2000; form.bottom = 3000; init_unistr2(&form.name, argv[2], UNI_STR_TERMINATE); /* Set the form */ werror = rpccli_spoolss_setform(cli, mem_ctx, &handle, 1, argv[2], &form); done: if (got_handle) rpccli_spoolss_close_printer(cli, mem_ctx, &handle); SAFE_FREE(servername); SAFE_FREE(printername); return werror;}/********************************************************************************************************************************************************/static const char *get_form_flag(int form_flag){ switch (form_flag) { case FORM_USER: return "FORM_USER"; case FORM_BUILTIN: return "FORM_BUILTIN"; case FORM_PRINTER: return "FORM_PRINTER"; default: return "unknown"; }}/********************************************************************************************************************************************************/static void display_form(FORM_1 *form){ fstring form_name = ""; if (form->name.buffer) rpcstr_pull(form_name, form->name.buffer, sizeof(form_name), -1, STR_TERMINATE); printf("%s\n" \ "\tflag: %s (%d)\n" \ "\twidth: %d, length: %d\n" \ "\tleft: %d, right: %d, top: %d, bottom: %d\n\n", form_name, get_form_flag(form->flag), form->flag, form->width, form->length, form->left, form->right, form->top, form->bottom);}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND handle; WERROR werror; char *servername = NULL, *printername = NULL; FORM_1 form; BOOL got_handle = False; /* Parse the command arguements */ if (argc != 3) { printf ("Usage: %s <printer> <formname>\n", argv[0]); return WERR_OK; } /* Get a printer handle */ asprintf(&servername, "\\\\%s", cli->cli->desthost); strupper_m(servername); asprintf(&printername, "%s\\%s", servername, argv[1]); werror = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, cli->user_name, &handle); if (!W_ERROR_IS_OK(werror)) goto done; got_handle = True; /* Get the form */ werror = rpccli_spoolss_getform(cli, mem_ctx, &handle, argv[2], 1, &form); if (!W_ERROR_IS_OK(werror)) goto done; display_form(&form); done: if (got_handle) rpccli_spoolss_close_printer(cli, mem_ctx, &handle); SAFE_FREE(servername); SAFE_FREE(printername); return werror;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_deleteform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND handle; WERROR werror; char *servername = NULL, *printername = NULL; BOOL got_handle = False; /* Parse the command arguements */ if (argc != 3) { printf ("Usage: %s <printer> <formname>\n", argv[0]); return WERR_OK; } /* Get a printer handle */ asprintf(&servername, "\\\\%s", cli->cli->desthost); strupper_m(servername); asprintf(&printername, "%s\\%s", servername, argv[1]); werror = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, cli->user_name, &handle); if (!W_ERROR_IS_OK(werror)) goto done; got_handle = True; /* Delete the form */ werror = rpccli_spoolss_deleteform(cli, mem_ctx, &handle, argv[2]); done: if (got_handle) rpccli_spoolss_close_printer(cli, mem_ctx, &handle); SAFE_FREE(servername); SAFE_FREE(printername); return werror;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_enum_forms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND handle; WERROR werror; char *servername = NULL, *printername = NULL; BOOL got_handle = False; uint32 needed, offered, num_forms, level = 1, i; FORM_1 *forms; /* Parse the command arguements */ if (argc != 2) { printf ("Usage: %s <printer>\n", argv[0]); return WERR_OK; } /* Get a printer handle */ asprintf(&servername, "\\\\%s", cli->cli->desthost); strupper_m(servername); asprintf(&printername, "%s\\%s", servername, argv[1]); werror = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, cli->user_name, &handle); if (!W_ERROR_IS_OK(werror)) goto done; got_handle = True; /* Enumerate forms */ offered = needed = 0; werror = rpccli_spoolss_enumforms(cli, mem_ctx, &handle, level, &num_forms, &forms); if (!W_ERROR_IS_OK(werror)) goto done; /* Display output */ for (i = 0; i < num_forms; i++) { display_form(&forms[i]); } done: if (got_handle) rpccli_spoolss_close_printer(cli, mem_ctx, &handle); SAFE_FREE(servername); SAFE_FREE(printername); return werror;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_setprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; fstring servername, printername, user; POLICY_HND pol; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; PRINTER_INFO_0 info; REGISTRY_VALUE value; /* parse the command arguements */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -