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; }
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; }