1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

Add enumdataex command

This commit is contained in:
Jim McDonough 0001-01-01 00:00:00 +00:00
parent baf87ed796
commit 932a501273

View File

@ -1827,6 +1827,19 @@ static void display_reg_value(REGISTRY_VALUE value)
printf("%s: REG_BINARY: unknown length value not displayed\n",
value.valuename);
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 ((*curstr != 0) &&
((uint8 *) curstr < start + value.size)) {
rpcstr_pull(text, curstr, sizeof(text), -1,
STR_TERMINATE);
printf(" %s\n", text);
curstr += strlen(text) + 1;
}
}
break;
default:
printf("%s: unknown type %d\n", value.valuename, value.type);
}
@ -1892,6 +1905,72 @@ done:
return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
}
/* enumerate data for a given key */
static NTSTATUS cmd_spoolss_enum_data_ex( struct cli_state *cli,
TALLOC_CTX *mem_ctx, int argc,
char **argv)
{
WERROR result;
uint32 needed, i;
BOOL got_hnd = False;
pstring printername;
fstring servername, user;
char *keyname = NULL;
POLICY_HND hnd;
REGVAL_CTR ctr;
if (argc != 3) {
printf("Usage: %s printername <keyname>\n", argv[0]);
return NT_STATUS_OK;
}
keyname = argv[2];
/* Open printer handle */
slprintf(servername, sizeof(fstring)-1, "\\\\%s", cli->desthost);
strupper(servername);
fstrcpy(user, cli->user_name);
fstrcpy(printername, argv[1]);
slprintf(printername, sizeof(pstring)-1, "\\\\%s\\", cli->desthost);
strupper(printername);
pstrcat(printername, argv[1]);
result = cli_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 = cli_spoolss_enumprinterdataex(
cli, mem_ctx, 0, &needed, &hnd, keyname, NULL);
if (W_ERROR_V(result) == ERRmoredata)
result = cli_spoolss_enumprinterdataex(
cli, mem_ctx, needed, NULL, &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]));
}
regval_ctr_destroy(&ctr);
done:
if (got_hnd)
cli_spoolss_close_printer(cli, mem_ctx, &hnd);
return W_ERROR_IS_OK(result) ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL;
}
/* enumerate subkeys */
static NTSTATUS cmd_spoolss_enum_printerkey( struct cli_state *cli,
@ -2055,6 +2134,7 @@ struct cmd_set spoolss_commands[] = {
{ "addprinter", cmd_spoolss_addprinterex, PI_SPOOLSS, "Add a printer", "" },
{ "deldriver", cmd_spoolss_deletedriver, PI_SPOOLSS, "Delete a printer driver", "" },
{ "enumdata", cmd_spoolss_enum_data, PI_SPOOLSS, "Enumerate printer data", "" },
{ "enumdataex", cmd_spoolss_enum_data_ex, PI_SPOOLSS, "Enumerate printer data for a key", "" },
{ "enumkey", cmd_spoolss_enum_printerkey, PI_SPOOLSS, "Enumerate printer keys", "" },
{ "enumjobs", cmd_spoolss_enum_jobs, PI_SPOOLSS, "Enumerate print jobs", "" },
{ "enumports", cmd_spoolss_enum_ports, PI_SPOOLSS, "Enumerate printer ports", "" },