From a812e2d7db1294950e05977d5000f3d9889aefb6 Mon Sep 17 00:00:00 2001 From: Günther Deschner Date: Mon, 18 Sep 2006 19:18:29 +0000 Subject: r18619: Add rpcclient helper for samr_querydispinfo2|3 for testing. Guenther (This used to be commit 1a307954e5ddc1441524eb6d22258be387cca9d4) --- source3/include/rpc_samr.h | 4 +- source3/rpc_client/cli_samr.c | 104 ++++++++++++++++++++++++++++++++++++++++++ source3/rpcclient/cmd_samr.c | 59 ++++++++++++++++++++---- 3 files changed, 157 insertions(+), 10 deletions(-) (limited to 'source3') diff --git a/source3/include/rpc_samr.h b/source3/include/rpc_samr.h index 97f151b4af..5c24134134 100644 --- a/source3/include/rpc_samr.h +++ b/source3/include/rpc_samr.h @@ -128,11 +128,11 @@ SamrTestPrivateFunctionsUser #define SAMR_REMOVE_SID_FOREIGN_DOMAIN 0x2d #define SAMR_QUERY_DOMAIN_INFO2 0x2e /* looks like an alias for SAMR_QUERY_DOMAIN_INFO */ #define SAMR_UNKNOWN_2f 0x2f -#define SAMR_QUERY_DISPINFO3 0x30 /* Alias for SAMR_QUERY_DISPINFO +#define SAMR_QUERY_DISPINFO2 0x30 /* Alias for SAMR_QUERY_DISPINFO with info level 3 */ #define SAMR_UNKNOWN_31 0x31 #define SAMR_CREATE_USER 0x32 -#define SAMR_QUERY_DISPINFO4 0x33 /* Alias for SAMR_QUERY_DISPINFO +#define SAMR_QUERY_DISPINFO3 0x33 /* Alias for SAMR_QUERY_DISPINFO with info level 4 */ #define SAMR_ADDMULTI_ALIASMEM 0x34 diff --git a/source3/rpc_client/cli_samr.c b/source3/rpc_client/cli_samr.c index a1e226dee6..7f3bd8f90a 100644 --- a/source3/rpc_client/cli_samr.c +++ b/source3/rpc_client/cli_samr.c @@ -1473,6 +1473,110 @@ NTSTATUS rpccli_samr_query_dispinfo(struct rpc_pipe_client *cli, return result; } + +/* Query display info2 */ + +NTSTATUS rpccli_samr_query_dispinfo2(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + POLICY_HND *domain_pol, uint32 *start_idx, + uint16 switch_value, uint32 *num_entries, + uint32 max_entries, uint32 max_size, + SAM_DISPINFO_CTR *ctr) +{ + prs_struct qbuf, rbuf; + SAMR_Q_QUERY_DISPINFO q; + SAMR_R_QUERY_DISPINFO r; + NTSTATUS result = NT_STATUS_UNSUCCESSFUL; + + DEBUG(10,("cli_samr_query_dispinfo2 for start_idx = %u\n", *start_idx)); + + ZERO_STRUCT(q); + ZERO_STRUCT(r); + + *num_entries = 0; + + /* Marshall data and send request */ + + init_samr_q_query_dispinfo(&q, domain_pol, switch_value, + *start_idx, max_entries, max_size); + + r.ctr = ctr; + + CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_QUERY_DISPINFO2, + q, r, + qbuf, rbuf, + samr_io_q_query_dispinfo, + samr_io_r_query_dispinfo, + NT_STATUS_UNSUCCESSFUL); + + /* Return output parameters */ + + result = r.status; + + if (!NT_STATUS_IS_OK(result) && + NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) { + goto done; + } + + *num_entries = r.num_entries; + *start_idx += r.num_entries; /* No next_idx in this structure! */ + + done: + return result; +} + +/* Query display info */ + +NTSTATUS rpccli_samr_query_dispinfo3(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + POLICY_HND *domain_pol, uint32 *start_idx, + uint16 switch_value, uint32 *num_entries, + uint32 max_entries, uint32 max_size, + SAM_DISPINFO_CTR *ctr) +{ + prs_struct qbuf, rbuf; + SAMR_Q_QUERY_DISPINFO q; + SAMR_R_QUERY_DISPINFO r; + NTSTATUS result = NT_STATUS_UNSUCCESSFUL; + + DEBUG(10,("cli_samr_query_dispinfo3 for start_idx = %u\n", *start_idx)); + + ZERO_STRUCT(q); + ZERO_STRUCT(r); + + *num_entries = 0; + + /* Marshall data and send request */ + + init_samr_q_query_dispinfo(&q, domain_pol, switch_value, + *start_idx, max_entries, max_size); + + r.ctr = ctr; + + CLI_DO_RPC(cli, mem_ctx, PI_SAMR, SAMR_QUERY_DISPINFO3, + q, r, + qbuf, rbuf, + samr_io_q_query_dispinfo, + samr_io_r_query_dispinfo, + NT_STATUS_UNSUCCESSFUL); + + /* Return output parameters */ + + result = r.status; + + if (!NT_STATUS_IS_OK(result) && + NT_STATUS_V(result) != NT_STATUS_V(STATUS_MORE_ENTRIES)) { + goto done; + } + + *num_entries = r.num_entries; + *start_idx += r.num_entries; /* No next_idx in this structure! */ + + done: + return result; +} + + /* Lookup rids. Note that NT4 seems to crash if more than ~1000 rids are looked up in one packet. */ diff --git a/source3/rpcclient/cmd_samr.c b/source3/rpcclient/cmd_samr.c index 8b3e3cac92..6649676887 100644 --- a/source3/rpcclient/cmd_samr.c +++ b/source3/rpcclient/cmd_samr.c @@ -1185,9 +1185,10 @@ static NTSTATUS cmd_samr_delete_alias(struct rpc_pipe_client *cli, /* Query display info */ -static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, - TALLOC_CTX *mem_ctx, - int argc, const char **argv) +static NTSTATUS cmd_samr_query_dispinfo_int(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv, + int opcode) { POLICY_HND connect_pol, domain_pol; NTSTATUS result = NT_STATUS_UNSUCCESSFUL; @@ -1278,11 +1279,31 @@ static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, if (!got_params) get_query_dispinfo_params( loop_count, &max_entries, &max_size); - - result = rpccli_samr_query_dispinfo(cli, mem_ctx, &domain_pol, - &start_idx, info_level, - &num_entries, max_entries, - max_size, &ctr); + + switch (opcode) { + case SAMR_QUERY_DISPINFO: + result = rpccli_samr_query_dispinfo(cli, mem_ctx, &domain_pol, + &start_idx, info_level, + &num_entries, max_entries, + max_size, &ctr); + break; + case SAMR_QUERY_DISPINFO2: + result = rpccli_samr_query_dispinfo2(cli, mem_ctx, &domain_pol, + &start_idx, info_level, + &num_entries, max_entries, + max_size, &ctr); + break; + case SAMR_QUERY_DISPINFO3: + result = rpccli_samr_query_dispinfo3(cli, mem_ctx, &domain_pol, + &start_idx, info_level, + &num_entries, max_entries, + max_size, &ctr); + break; + default: + printf("unknown opcode: %d\n", opcode); + return NT_STATUS_INVALID_PARAMETER; + break; + } loop_count++; @@ -1319,6 +1340,26 @@ static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, return result; } +static NTSTATUS cmd_samr_query_dispinfo(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) +{ + return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO); +} + +static NTSTATUS cmd_samr_query_dispinfo2(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) +{ + return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO2); +} + +static NTSTATUS cmd_samr_query_dispinfo3(struct rpc_pipe_client *cli, + TALLOC_CTX *mem_ctx, + int argc, const char **argv) +{ + return cmd_samr_query_dispinfo_int(cli, mem_ctx, argc, argv, SAMR_QUERY_DISPINFO3); +} /* Query domain info */ static NTSTATUS cmd_samr_query_dominfo(struct rpc_pipe_client *cli, @@ -2122,6 +2163,8 @@ struct cmd_set samr_commands[] = { { "queryaliasmem", RPC_RTYPE_NTSTATUS, cmd_samr_query_aliasmem, NULL, PI_SAMR, NULL, "Query alias membership", "" }, { "deletealias", RPC_RTYPE_NTSTATUS, cmd_samr_delete_alias, NULL, PI_SAMR, NULL, "Delete an alias", "" }, { "querydispinfo", RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo, NULL, PI_SAMR, NULL, "Query display info", "" }, + { "querydispinfo2", RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo2, NULL, PI_SAMR, NULL, "Query display info 2", "" }, + { "querydispinfo3", RPC_RTYPE_NTSTATUS, cmd_samr_query_dispinfo3, NULL, PI_SAMR, NULL, "Query display info 3", "" }, { "querydominfo", RPC_RTYPE_NTSTATUS, cmd_samr_query_dominfo, NULL, PI_SAMR, NULL, "Query domain info", "" }, { "enumdomusers", RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_users, NULL, PI_SAMR, NULL, "Enumerate domain users", "" }, { "enumdomgroups", RPC_RTYPE_NTSTATUS, cmd_samr_enum_dom_groups, NULL, PI_SAMR, NULL, "Enumerate domain groups", "" }, -- cgit