1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-03 04:22:09 +03:00

s3-rpc_client: add rpccli_lsa_lookup_names4 wrapper.

Guenther
This commit is contained in:
Günther Deschner
2009-09-11 19:35:14 +02:00
parent fde8c46855
commit ff968712ba
2 changed files with 84 additions and 23 deletions

View File

@ -5211,6 +5211,15 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
int level, int level,
DOM_SID **sids, DOM_SID **sids,
enum lsa_SidType **types); enum lsa_SidType **types);
NTSTATUS rpccli_lsa_lookup_names4(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types);
bool fetch_domain_sid( char *domain, char *remote_machine, DOM_SID *psid); bool fetch_domain_sid( char *domain, char *remote_machine, DOM_SID *psid);
/* The following definitions come from rpc_client/cli_netlogon.c */ /* The following definitions come from rpc_client/cli_netlogon.c */

View File

@ -342,23 +342,26 @@ fail:
/** Lookup a list of names */ /** Lookup a list of names */
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli, static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx, TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names, struct policy_handle *pol, int num_names,
const char **names, const char **names,
const char ***dom_names, const char ***dom_names,
int level, int level,
DOM_SID **sids, DOM_SID **sids,
enum lsa_SidType **types) enum lsa_SidType **types,
bool use_lookupnames4)
{ {
NTSTATUS result; NTSTATUS result;
int i; int i;
struct lsa_String *lsa_names = NULL; struct lsa_String *lsa_names = NULL;
struct lsa_RefDomainList *domains = NULL; struct lsa_RefDomainList *domains = NULL;
struct lsa_TransSidArray sid_array; struct lsa_TransSidArray sid_array;
struct lsa_TransSidArray3 sid_array3;
uint32_t count = 0; uint32_t count = 0;
ZERO_STRUCT(sid_array); ZERO_STRUCT(sid_array);
ZERO_STRUCT(sid_array3);
lsa_names = TALLOC_ARRAY(mem_ctx, struct lsa_String, num_names); lsa_names = TALLOC_ARRAY(mem_ctx, struct lsa_String, num_names);
if (!lsa_names) { if (!lsa_names) {
@ -369,14 +372,26 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
init_lsa_String(&lsa_names[i], names[i]); init_lsa_String(&lsa_names[i], names[i]);
} }
result = rpccli_lsa_LookupNames(cli, mem_ctx, if (use_lookupnames4) {
pol, result = rpccli_lsa_LookupNames4(cli, mem_ctx,
num_names, num_names,
lsa_names, lsa_names,
&domains, &domains,
&sid_array, &sid_array3,
level, level,
&count); &count,
0,
0);
} else {
result = rpccli_lsa_LookupNames(cli, mem_ctx,
pol,
num_names,
lsa_names,
&domains,
&sid_array,
level,
&count);
}
if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) != if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) !=
NT_STATUS_V(STATUS_SOME_UNMAPPED)) { NT_STATUS_V(STATUS_SOME_UNMAPPED)) {
@ -423,10 +438,17 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
} }
for (i = 0; i < num_names; i++) { for (i = 0; i < num_names; i++) {
uint32_t dom_idx = sid_array.sids[i].sid_index; uint32_t dom_idx;
uint32_t dom_rid = sid_array.sids[i].rid;
DOM_SID *sid = &(*sids)[i]; DOM_SID *sid = &(*sids)[i];
if (use_lookupnames4) {
dom_idx = sid_array3.sids[i].sid_index;
(*types)[i] = sid_array3.sids[i].sid_type;
} else {
dom_idx = sid_array.sids[i].sid_index;
(*types)[i] = sid_array.sids[i].sid_type;
}
/* Translate optimised sid through domain index array */ /* Translate optimised sid through domain index array */
if (dom_idx == 0xffffffff) { if (dom_idx == 0xffffffff) {
@ -436,14 +458,16 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
continue; continue;
} }
sid_copy(sid, domains->domains[dom_idx].sid); if (use_lookupnames4) {
sid_copy(sid, sid_array3.sids[i].sid);
} else {
sid_copy(sid, domains->domains[dom_idx].sid);
if (dom_rid != 0xffffffff) { if (sid_array.sids[i].rid != 0xffffffff) {
sid_append_rid(sid, dom_rid); sid_append_rid(sid, sid_array.sids[i].rid);
}
} }
(*types)[i] = sid_array.sids[i].sid_type;
if (dom_names == NULL) { if (dom_names == NULL) {
continue; continue;
} }
@ -455,3 +479,31 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
return result; return result;
} }
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types)
{
return rpccli_lsa_lookup_names_generic(cli, mem_ctx, pol, num_names,
names, dom_names, level, sids,
types, false);
}
NTSTATUS rpccli_lsa_lookup_names4(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
const char **names,
const char ***dom_names,
int level,
DOM_SID **sids,
enum lsa_SidType **types)
{
return rpccli_lsa_lookup_names_generic(cli, mem_ctx, pol, num_names,
names, dom_names, level, sids,
types, true);
}