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:
@ -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 */
|
||||||
|
@ -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,6 +372,17 @@ 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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (use_lookupnames4) {
|
||||||
|
result = rpccli_lsa_LookupNames4(cli, mem_ctx,
|
||||||
|
num_names,
|
||||||
|
lsa_names,
|
||||||
|
&domains,
|
||||||
|
&sid_array3,
|
||||||
|
level,
|
||||||
|
&count,
|
||||||
|
0,
|
||||||
|
0);
|
||||||
|
} else {
|
||||||
result = rpccli_lsa_LookupNames(cli, mem_ctx,
|
result = rpccli_lsa_LookupNames(cli, mem_ctx,
|
||||||
pol,
|
pol,
|
||||||
num_names,
|
num_names,
|
||||||
@ -377,6 +391,7 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
|
|||||||
&sid_array,
|
&sid_array,
|
||||||
level,
|
level,
|
||||||
&count);
|
&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,13 +458,15 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (use_lookupnames4) {
|
||||||
|
sid_copy(sid, sid_array3.sids[i].sid);
|
||||||
|
} else {
|
||||||
sid_copy(sid, domains->domains[dom_idx].sid);
|
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);
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user