Пример #1
0
WERROR get_remote_printer_publishing_data(struct rpc_pipe_client *cli, 
					  TALLOC_CTX *mem_ctx,
					  ADS_MODLIST *mods,
					  const char *printer)
{
	struct dcerpc_binding_handle *b = cli->binding_handle;
	WERROR result;
	char *printername;
	struct spoolss_PrinterEnumValues *info;
	uint32_t count;
	uint32 i;
	struct policy_handle pol;
	WERROR werr;

	if ((asprintf(&printername, "%s\\%s", cli->srv_name_slash, printer) == -1)) {
		DEBUG(3, ("Insufficient memory\n"));
		return WERR_NOMEM;
	}

	result = rpccli_spoolss_openprinter_ex(cli, mem_ctx,
					       printername,
					       SEC_FLAG_MAXIMUM_ALLOWED,
					       &pol);
	if (!W_ERROR_IS_OK(result)) {
		DEBUG(3, ("Unable to open printer %s, error is %s.\n",
			  printername, win_errstr(result)));
		SAFE_FREE(printername);
		return result;
	}

	result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol,
						  SPOOL_DSDRIVER_KEY,
						  0,
						  &count,
						  &info);

	if (!W_ERROR_IS_OK(result)) {
		DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
			  printername, win_errstr(result)));
	} else {
		/* Have the data we need now, so start building */
		for (i=0; i < count; i++) {
			struct registry_value v;
			v.type = info[i].type;
			v.data = *info[i].data;

			map_regval_to_ads(mem_ctx, mods, info[i].value_name, &v);
		}
	}

	result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol,
						  SPOOL_DSSPOOLER_KEY,
						  0,
						  &count,
						  &info);
	if (!W_ERROR_IS_OK(result)) {
		DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
			  printername, win_errstr(result)));
	} else {
		for (i=0; i < count; i++) {
			struct registry_value v;
			v.type = info[i].type;
			v.data = *info[i].data;

			map_regval_to_ads(mem_ctx, mods, info[i].value_name, &v);
		}
	}

	ads_mod_str(mem_ctx, mods, SPOOL_REG_PRINTERNAME, printer);

	dcerpc_spoolss_ClosePrinter(b, mem_ctx, &pol, &werr);
	SAFE_FREE(printername);

	return result;
}
Пример #2
0
WERROR get_remote_printer_publishing_data(struct rpc_pipe_client *cli,
        TALLOC_CTX *mem_ctx,
        ADS_MODLIST *mods,
        const char *printer)
{
    WERROR result;
    char *printername, *servername;
    REGVAL_CTR *dsdriver_ctr, *dsspooler_ctr;
    uint32 i;
    POLICY_HND pol;

    asprintf(&servername, "\\\\%s", cli->cli->desthost);
    asprintf(&printername, "%s\\%s", servername, printer);
    if (!servername || !printername) {
        DEBUG(3, ("Insufficient memory\n"));
        return WERR_NOMEM;
    }

    result = rpccli_spoolss_open_printer_ex(cli, mem_ctx, printername,
                                            "", MAXIMUM_ALLOWED_ACCESS,
                                            servername, cli->cli->user_name, &pol);
    if (!W_ERROR_IS_OK(result)) {
        DEBUG(3, ("Unable to open printer %s, error is %s.\n",
                  printername, dos_errstr(result)));
        SAFE_FREE(printername);
        return result;
    }

    if ( !(dsdriver_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) ) {
        SAFE_FREE(printername);
        return WERR_NOMEM;
    }

    result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSDRIVER_KEY, dsdriver_ctr);

    if (!W_ERROR_IS_OK(result)) {
        DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
                  printername, dos_errstr(result)));
    } else {
        uint32 num_values = regval_ctr_numvals( dsdriver_ctr );

        /* Have the data we need now, so start building */
        for (i=0; i < num_values; i++) {
            map_regval_to_ads(mem_ctx, mods, dsdriver_ctr->values[i]);
        }
    }

    if ( !(dsspooler_ctr = TALLOC_ZERO_P( mem_ctx, REGVAL_CTR )) ) {
        SAFE_FREE(printername);
        return WERR_NOMEM;
    }

    result = rpccli_spoolss_enumprinterdataex(cli, mem_ctx, &pol, SPOOL_DSSPOOLER_KEY, dsspooler_ctr);

    if (!W_ERROR_IS_OK(result)) {
        DEBUG(3, ("Unable to do enumdataex on %s, error is %s.\n",
                  printername, dos_errstr(result)));
    } else {
        uint32 num_values = regval_ctr_numvals( dsspooler_ctr );

        for (i=0; i<num_values; i++) {
            map_regval_to_ads(mem_ctx, mods, dsspooler_ctr->values[i]);
        }
    }

    ads_mod_str(mem_ctx, mods, SPOOL_REG_PRINTERNAME, printer);

    TALLOC_FREE( dsdriver_ctr );
    TALLOC_FREE( dsspooler_ctr );

    rpccli_spoolss_close_printer(cli, mem_ctx, &pol);
    SAFE_FREE(printername);

    return result;
}