⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmd_spoolss.c

📁 samba-3.0.22.tar.gz 编译smb服务器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -