📄 cmd_spoolss.c
字号:
} 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); /* get a printer handle */ result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", PRINTER_ALL_ACCESS, servername, user, &pol); if (!W_ERROR_IS_OK(result)) goto done; opened_hnd = True; /* Get printer info */ result = rpccli_spoolss_getprinter(cli, mem_ctx, &pol, info_level, &ctr); if (!W_ERROR_IS_OK(result)) goto done; /* Modify the comment. */ init_unistr(&ctr.printers_2->comment, comment); ctr.printers_2->devmode = NULL; ctr.printers_2->secdesc = NULL; result = rpccli_spoolss_setprinter(cli, mem_ctx, &pol, info_level, &ctr, 0); if (W_ERROR_IS_OK(result)) printf("Success in setting comment.\n"); done: if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_setprintername(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND pol; WERROR result; uint32 info_level = 2; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; fstring printername, servername, user, new_printername; if (argc == 1 || argc > 3) { printf("Usage: %s printername new_printername\n", argv[0]); return WERR_OK; } /* Open a printer handle */ if (argc == 3) { fstrcpy(new_printername, argv[2]); } slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); slprintf(printername, sizeof(printername)-1, "%s\\%s", servername, argv[1]); fstrcpy(user, cli->user_name); /* get a printer handle */ result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", PRINTER_ALL_ACCESS, servername, user, &pol); if (!W_ERROR_IS_OK(result)) goto done; opened_hnd = True; /* Get printer info */ result = rpccli_spoolss_getprinter(cli, mem_ctx, &pol, info_level, &ctr); if (!W_ERROR_IS_OK(result)) goto done; /* Modify the printername. */ init_unistr(&ctr.printers_2->printername, new_printername); ctr.printers_2->devmode = NULL; ctr.printers_2->secdesc = NULL; result = rpccli_spoolss_setprinter(cli, mem_ctx, &pol, info_level, &ctr, 0); if (W_ERROR_IS_OK(result)) printf("Success in setting printername.\n"); done: if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND pol; WERROR result; uint32 info_level = 1; BOOL opened_hnd = False; PRINTER_INFO_CTR ctr; fstring printername, servername, user; if (argc == 1 || argc > 3) { printf("Usage: %s <printername> [level]\n", argv[0]); return WERR_OK; } /* Open a printer handle */ if (argc == 3) { info_level = atoi(argv[2]); } slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); slprintf(printername, sizeof(printername)-1, "%s\\%s", servername, argv[1]); fstrcpy(user, cli->user_name); /* 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; /* Get printer info */ result = rpccli_spoolss_getprinter(cli, mem_ctx, &pol, info_level, &ctr); if (!W_ERROR_IS_OK(result)) goto done; /* Display printer info */ switch (info_level) { case 0: display_print_info_0(ctr.printers_0); break; case 1: display_print_info_1(ctr.printers_1); break; case 2: display_print_info_2(ctr.printers_2); break; case 3: display_print_info_3(ctr.printers_3); break; case 7: display_print_info_7(ctr.printers_7); break; default: printf("unknown info level %d\n", info_level); break; } done: if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static void display_reg_value(REGISTRY_VALUE value){ pstring text; switch(value.type) { case REG_DWORD: printf("%s: REG_DWORD: 0x%08x\n", value.valuename, *((uint32 *) value.data_p)); break; case REG_SZ: rpcstr_pull(text, value.data_p, sizeof(text), value.size, STR_TERMINATE); printf("%s: REG_SZ: %s\n", value.valuename, text); break; case REG_BINARY: { char *hex = hex_encode(NULL, value.data_p, value.size); size_t i, len; printf("%s: REG_BINARY:", value.valuename); 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'); break; } case REG_MULTI_SZ: { uint16 *curstr = (uint16 *) value.data_p; uint8 *start = value.data_p; printf("%s: REG_MULTI_SZ:\n", value.valuename); while (((uint8 *) curstr < start + value.size)) { rpcstr_pull(text, curstr, sizeof(text), -1, STR_TERMINATE); printf(" %s\n", *text != 0 ? text : "NULL"); curstr += strlen(text) + 1; } } break; default: printf("%s: unknown type %d\n", value.valuename, value.type); } }/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND pol; WERROR result; BOOL opened_hnd = False; fstring printername, servername, user; const char *valuename; REGISTRY_VALUE value; if (argc != 3) { printf("Usage: %s <printername> <valuename>\n", argv[0]); printf("<printername> of . queries print server\n"); return WERR_OK; } valuename = argv[2]; /* Open a printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); if (strncmp(argv[1], ".", sizeof(".")) == 0) fstrcpy(printername, servername); else slprintf(printername, sizeof(servername)-1, "%s\\%s", servername, argv[1]); fstrcpy(user, cli->user_name); /* 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; /* Get printer info */ result = rpccli_spoolss_getprinterdata(cli, mem_ctx, &pol, valuename, &value); if (!W_ERROR_IS_OK(result)) goto done; /* Display printer data */ fstrcpy(value.valuename, valuename); display_reg_value(value); done: if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND pol; WERROR result; BOOL opened_hnd = False; fstring printername, servername, user; const char *valuename, *keyname; REGISTRY_VALUE value; if (argc != 4) { printf("Usage: %s <printername> <keyname> <valuename>\n", argv[0]); printf("<printername> of . queries print server\n"); return WERR_OK; } valuename = argv[3]; keyname = argv[2]; /* Open a printer handle */ slprintf(servername, sizeof(servername)-1, "\\\\%s", cli->cli->desthost); strupper_m(servername); if (strncmp(argv[1], ".", sizeof(".")) == 0) fstrcpy(printername, servername); else slprintf(printername, sizeof(printername)-1, "%s\\%s", servername, argv[1]); fstrcpy(user, cli->user_name); /* 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; /* Get printer info */ result = rpccli_spoolss_getprinterdataex(cli, mem_ctx, &pol, keyname, valuename, &value); if (!W_ERROR_IS_OK(result)) goto done; /* Display printer data */ fstrcpy(value.valuename, valuename); display_reg_value(value); done: if (opened_hnd) rpccli_spoolss_close_printer(cli, mem_ctx, &pol); return result;}/********************************************************************************************************************************************************/static void display_print_driver_1(DRIVER_INFO_1 *i1){ fstring name; if (i1 == NULL) return; rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); printf ("Printer Driver Info 1:\n"); printf ("\tDriver Name: [%s]\n\n", name); return;}/********************************************************************************************************************************************************/static void display_print_driver_2(DRIVER_INFO_2 *i1){ fstring name; fstring architecture; fstring driverpath; fstring datafile; fstring configfile; if (i1 == NULL) return; rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), -1, STR_TERMINATE); rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, STR_TERMINATE); rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, STR_TERMINATE); rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, STR_TERMINATE); printf ("Printer Driver Info 2:\n"); printf ("\tVersion: [%x]\n", i1->version); printf ("\tDriver Name: [%s]\n", name); printf ("\tArchitecture: [%s]\n", architecture); printf ("\tDriver Path: [%s]\n", driverpath); printf ("\tDatafile: [%s]\n", datafile); printf ("\tConfigfile: [%s]\n\n", configfile); return;}/********************************************************************************************************************************************************/static void display_print_driver_3(DRIVER_INFO_3 *i1){ fstring name = ""; fstring architecture = ""; fstring driverpath = ""; fstring datafile = ""; fstring configfile = ""; fstring helpfile = ""; fstring dependentfiles = ""; fstring monitorname = ""; fstring defaultdatatype = ""; int length=0; BOOL valid = True; if (i1 == NULL) return; rpcstr_pull(name, i1->name.buffer, sizeof(name), -1, STR_TERMINATE); rpcstr_pull(architecture, i1->architecture.buffer, sizeof(architecture), -1, STR_TERMINATE); rpcstr_pull(driverpath, i1->driverpath.buffer, sizeof(driverpath), -1, STR_TERMINATE); rpcstr_pull(datafile, i1->datafile.buffer, sizeof(datafile), -1, STR_TERMINATE); rpcstr_pull(configfile, i1->configfile.buffer, sizeof(configfile), -1, STR_TERMINATE); rpcstr_pull(helpfile, i1->helpfile.buffer, sizeof(helpfile), -1, STR_TERMINATE); rpcstr_pull(monitorname, i1->monitorname.buffer, sizeof(monitorname), -1, STR_TERMINATE); rpcstr_pull(defaultdatatype, i1->defaultdatatype.buffer, sizeof(defaultdatatype), -1, STR_TERMINATE); printf ("Printer Driver Info 3:\n"); printf ("\tVersion: [%x]\n", i1->version); printf ("\tDriver Name: [%s]\n",name); printf ("\tArchitecture: [%s]\n", architecture); printf ("\tDriver Path: [%s]\n", driverpath); printf ("\tDatafile: [%s]\n", datafile); printf ("\tConfigfile: [%s]\n", configfile); printf ("\tHelpfile: [%s]\n\n", helpfile); while (valid) { rpcstr_pull(dependentfiles, i1->dependentfiles+length, sizeof(dependentfiles), -1, STR_TERMINATE); length+=strlen(dependentfiles)+1; if (strlen(dependentfiles) > 0) { printf ("\tDependentfiles: [%s]\n", dependentfiles); } else { valid = False; } } printf ("\n"); printf ("\tMonitorname: [%s]\n", monitorname); printf ("\tDefaultdatatype: [%s]\n\n", defaultdatatype); return; }/********************************************************************************************************************************************************/static WERROR cmd_spoolss_getdriver(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, int argc, const char **argv){ POLICY_HND pol; WERROR werror; uint32 info_level = 3; BOOL opened_hnd = False;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -