📄 cmd_spoolss.c
字号:
if (argc < 5) { printf ("Usage: %s <printer> <string|binary|dword|multistring>" " <value> <data>\n", argv[0]); return WERR_INVALID_PARAM; } slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); slprintf(printername, sizeof(servername)-1, "%s\\%s", servername, argv[1]); fstrcpy(user, cli->user_name); value.type = REG_NONE; if (strequal(argv[2], "string")) { value.type = REG_SZ; } if (strequal(argv[2], "binary")) { value.type = REG_BINARY; } if (strequal(argv[2], "dword")) { value.type = REG_DWORD; } if (strequal(argv[2], "multistring")) { value.type = REG_MULTI_SZ; } if (value.type == REG_NONE) { printf("Unknown data type: %s\n", argv[2]); return WERR_INVALID_PARAM; } /* get a printer handle */ result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, user, &pol); if (!W_ERROR_IS_OK(result)) goto done; opened_hnd = True; ctr.printers_0 = &info; result = rpccli_spoolss_getprinter(cli, mem_ctx, &pol, 0, &ctr); if (!W_ERROR_IS_OK(result)) goto done; printf("%s\n", timestring(True)); printf("\tchange_id (before set)\t:[0x%x]\n", info.change_id); /* Set the printer data */ fstrcpy(value.valuename, argv[3]); switch (value.type) { case REG_SZ: { UNISTR2 data; init_unistr2(&data, argv[4], UNI_STR_TERMINATE); value.size = data.uni_str_len * 2; value.data_p = TALLOC_MEMDUP(mem_ctx, data.buffer, value.size); break; } case REG_DWORD: { uint32 data = strtoul(argv[4], NULL, 10); value.size = sizeof(data); value.data_p = TALLOC_MEMDUP(mem_ctx, &data, sizeof(data)); break; } case REG_BINARY: { DATA_BLOB data = strhex_to_data_blob(mem_ctx, argv[4]); value.data_p = data.data; value.size = data.length; break; } case REG_MULTI_SZ: { int i; size_t len = 0; char *p; for (i=4; i<argc; i++) { if (strcmp(argv[i], "NULL") == 0) { argv[i] = ""; } len += strlen(argv[i])+1; } value.size = len*2; value.data_p = TALLOC_ARRAY(mem_ctx, unsigned char, value.size); if (value.data_p == NULL) { result = WERR_NOMEM; goto done; } p = (char *)value.data_p; len = value.size; for (i=4; i<argc; i++) { size_t l = (strlen(argv[i])+1)*2; rpcstr_push(p, argv[i], len, STR_TERMINATE); p += l; len -= l; } SMB_ASSERT(len == 0); break; } default: printf("Unknown data type: %s\n", argv[2]); result = WERR_INVALID_PARAM; goto done; } result = rpccli_spoolss_setprinterdata(cli, mem_ctx, &pol, &value); if (!W_ERROR_IS_OK(result)) { printf ("Unable to set [%s=%s]!\n", argv[3], argv[4]); goto done; } printf("\tSetPrinterData succeeded [%s: %s]\n", argv[3], argv[4]); result = rpccli_spoolss_getprinter(cli, mem_ctx, &pol, 0, &ctr); if (!W_ERROR_IS_OK(result)) goto done; printf("%s\n", timestring(True)); printf("\tchange_id (after set)\t:[0x%x]\n", info.change_id);done: /* cleanup */ if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static void display_job_info_1(JOB_INFO_1 *job){ fstring username = "", document = "", text_status = ""; rpcstr_pull(username, job->username.buffer, sizeof(username), -1, STR_TERMINATE); rpcstr_pull(document, job->document.buffer, sizeof(document), -1, STR_TERMINATE); rpcstr_pull(text_status, job->text_status.buffer, sizeof(text_status), -1, STR_TERMINATE); printf("%d: jobid[%d]: %s %s %s %d/%d pages\n", job->position, job->jobid, username, document, text_status, job->pagesprinted, job->totalpages);}/********************************************************************************************************************************************************/static void display_job_info_2(JOB_INFO_2 *job){ fstring username = "", document = "", text_status = ""; rpcstr_pull(username, job->username.buffer, sizeof(username), -1, STR_TERMINATE); rpcstr_pull(document, job->document.buffer, sizeof(document), -1, STR_TERMINATE); rpcstr_pull(text_status, job->text_status.buffer, sizeof(text_status), -1, STR_TERMINATE); printf("%d: jobid[%d]: %s %s %s %d/%d pages, %d bytes\n", job->position, job->jobid, username, document, text_status, job->pagesprinted, job->totalpages, job->size);}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_enum_jobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; uint32 needed, offered, level = 1, num_jobs, i; BOOL got_hnd = False; pstring printername; fstring servername, user; POLICY_HND hnd; JOB_INFO_CTR ctr; if (argc < 2 || argc > 3) { printf("Usage: %s printername [level]\n", argv[0]); return WERR_OK; } if (argc == 3) level = atoi(argv[2]); /* Open printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); fstrcpy(user, cli->user_name); slprintf(printername, sizeof(servername)-1, "\\\\%s\\", cli->cli->desthost); strupper_m(printername); pstrcat(printername, argv[1]); result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, user, &hnd); if (!W_ERROR_IS_OK(result)) goto done; got_hnd = True; /* Enumerate ports */ offered = needed = 0; result = rpccli_spoolss_enumjobs(cli, mem_ctx, &hnd, level, 0, 1000, &num_jobs, &ctr); if (!W_ERROR_IS_OK(result)) goto done; for (i = 0; i < num_jobs; i++) { switch(level) { case 1: display_job_info_1(&ctr.job.job_info_1[i]); break; case 2: display_job_info_2(&ctr.job.job_info_2[i]); break; default: d_printf("unknown info level %d\n", level); break; } } done: if (got_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &hnd); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_enum_data( struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; uint32 i=0, val_needed, data_needed; BOOL got_hnd = False; pstring printername; fstring servername, user; POLICY_HND hnd; if (argc != 2) { printf("Usage: %s printername\n", argv[0]); return WERR_OK; } /* Open printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); fstrcpy(user, cli->user_name); slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost); strupper_m(printername); pstrcat(printername, argv[1]); result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, user, &hnd); if (!W_ERROR_IS_OK(result)) goto done; got_hnd = True; /* Enumerate data */ result = rpccli_spoolss_enumprinterdata(cli, mem_ctx, &hnd, i, 0, 0, &val_needed, &data_needed, NULL); while (W_ERROR_IS_OK(result)) { REGISTRY_VALUE value; result = rpccli_spoolss_enumprinterdata( cli, mem_ctx, &hnd, i++, val_needed, data_needed, 0, 0, &value); if (W_ERROR_IS_OK(result)) display_reg_value(value); } if (W_ERROR_V(result) == ERRnomoreitems) result = W_ERROR(ERRsuccess);done: if (got_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &hnd); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_enum_data_ex( struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; uint32 i; BOOL got_hnd = False; pstring printername; fstring servername, user; const char *keyname = NULL; POLICY_HND hnd; REGVAL_CTR *ctr = NULL; if (argc != 3) { printf("Usage: %s printername <keyname>\n", argv[0]); return WERR_OK; } keyname = argv[2]; /* Open printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); fstrcpy(user, cli->user_name); slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost); strupper_m(printername); pstrcat(printername, argv[1]); result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, user, &hnd); if (!W_ERROR_IS_OK(result)) goto done; got_hnd = True; /* Enumerate subkeys */ if ( !(ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) ) return WERR_NOMEM; result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &hnd, keyname, ctr); if (!W_ERROR_IS_OK(result)) goto done; for (i=0; i < ctr->num_values; i++) { display_reg_value(*(ctr->values[i])); } TALLOC_FREE( ctr );done: if (got_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &hnd); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_enum_printerkey( struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ WERROR result; BOOL got_hnd = False; pstring printername; fstring servername, user; const char *keyname = NULL; POLICY_HND hnd; uint16 *keylist = NULL, *curkey; if (argc < 2 || argc > 3) { printf("Usage: %s printername [keyname]\n", argv[0]); return WERR_OK; } if (argc == 3) keyname = argv[2]; else keyname = ""; /* Open printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); fstrcpy(user, cli->user_name); slprintf(printername, sizeof(printername)-1, "\\\\%s\\", cli->cli->desthost); strupper_m(printername); pstrcat(printername, argv[1]); result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, user, &hnd); if (!W_ERROR_IS_OK(result)) goto done; got_hnd = True; /* Enumerate subkeys */ result = rpccli_spoolss_enumprinterkey(cli, mem_ctx, &hnd, keyname, &keylist, NULL); if (!W_ERROR_IS_OK(result)) goto done; curkey = keylist; while (*curkey != 0) { pstring subkey; rpcstr_pull(subkey, curkey, sizeof(subkey), -1, STR_TERMINATE); printf("%s\n", subkey); curkey += strlen(subkey) + 1; } safe_free(keylist);done: if (got_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &hnd); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_rffpcnex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ fstring servername, printername; POLICY_HND hnd; BOOL got_hnd = False; WERROR result; SPOOL_NOTIFY_OPTION option; if (argc != 2) { printf("Usage: %s printername\n", argv[0]); result = WERR_OK; goto done; } /* Open printer */ slprintf(servername, sizeof(servername) - 1, "\\\\%s", cli->cli->desthost); strupper_m(servername); slprintf(printername, sizeof(printername) - 1, "\\\\%s\\%s", cli->cli->desthost, argv[1]); strupper_m(printername); result = rpccli_spoolss_open_printer_ex( cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, cli->user_name, &hnd); if (!W_ERROR_IS_OK(result)) { printf("Error opening %s\n", argv[1]); goto done; } got_hnd = True; /* Create spool options */ ZERO_STRUCT(option); option.version = 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -