summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/rpc_client/cli_lsarpc.c147
-rw-r--r--source3/rpc_client/cli_lsarpc.h21
2 files changed, 137 insertions, 31 deletions
diff --git a/source3/rpc_client/cli_lsarpc.c b/source3/rpc_client/cli_lsarpc.c
index ac6bfb8106..6b5d7f82d4 100644
--- a/source3/rpc_client/cli_lsarpc.c
+++ b/source3/rpc_client/cli_lsarpc.c
@@ -564,38 +564,41 @@ NTSTATUS rpccli_lsa_lookup_sids3(struct rpc_pipe_client *cli,
/** Lookup a list of names */
-static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
+static NTSTATUS dcerpc_lsa_lookup_names_generic(struct dcerpc_binding_handle *h,
TALLOC_CTX *mem_ctx,
- struct policy_handle *pol, int num_names,
+ struct policy_handle *pol,
+ uint32_t num_names,
const char **names,
const char ***dom_names,
- int level,
+ enum lsa_LookupNamesLevel level,
struct dom_sid **sids,
enum lsa_SidType **types,
- bool use_lookupnames4)
+ bool use_lookupnames4,
+ NTSTATUS *presult)
{
- NTSTATUS result;
- int i;
+ NTSTATUS status;
struct lsa_String *lsa_names = NULL;
struct lsa_RefDomainList *domains = NULL;
struct lsa_TransSidArray sid_array;
struct lsa_TransSidArray3 sid_array3;
uint32_t count = 0;
+ uint32_t i;
ZERO_STRUCT(sid_array);
ZERO_STRUCT(sid_array3);
lsa_names = TALLOC_ARRAY(mem_ctx, struct lsa_String, num_names);
- if (!lsa_names) {
+ if (lsa_names == NULL) {
return NT_STATUS_NO_MEMORY;
}
- for (i=0; i<num_names; i++) {
+ for (i = 0; i < num_names; i++) {
init_lsa_String(&lsa_names[i], names[i]);
}
if (use_lookupnames4) {
- result = rpccli_lsa_LookupNames4(cli, mem_ctx,
+ status = dcerpc_lsa_LookupNames4(h,
+ mem_ctx,
num_names,
lsa_names,
&domains,
@@ -603,43 +606,46 @@ static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
level,
&count,
0,
- 0);
+ 0,
+ presult);
} else {
- result = rpccli_lsa_LookupNames(cli, mem_ctx,
- pol,
+ status = dcerpc_lsa_LookupNames(h,
+ mem_ctx,
+ pol,
num_names,
lsa_names,
&domains,
&sid_array,
level,
- &count);
+ &count,
+ presult);
+ }
+ if (!NT_STATUS_IS_OK(status)) {
+ goto done;
}
- if (!NT_STATUS_IS_OK(result) && NT_STATUS_V(result) !=
- NT_STATUS_V(STATUS_SOME_UNMAPPED)) {
-
+ if (!NT_STATUS_IS_OK(*presult) &&
+ !NT_STATUS_EQUAL(*presult, STATUS_SOME_UNMAPPED)) {
/* An actual error occured */
-
goto done;
}
/* Return output parameters */
-
if (count == 0) {
- result = NT_STATUS_NONE_MAPPED;
+ *presult = NT_STATUS_NONE_MAPPED;
goto done;
}
if (num_names) {
if (!((*sids = TALLOC_ARRAY(mem_ctx, struct dom_sid, num_names)))) {
DEBUG(0, ("cli_lsa_lookup_sids(): out of memory\n"));
- result = NT_STATUS_NO_MEMORY;
+ *presult = NT_STATUS_NO_MEMORY;
goto done;
}
if (!((*types = TALLOC_ARRAY(mem_ctx, enum lsa_SidType, num_names)))) {
DEBUG(0, ("cli_lsa_lookup_sids(): out of memory\n"));
- result = NT_STATUS_NO_MEMORY;
+ *presult = NT_STATUS_NO_MEMORY;
goto done;
}
@@ -647,7 +653,7 @@ static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
*dom_names = TALLOC_ARRAY(mem_ctx, const char *, num_names);
if (*dom_names == NULL) {
DEBUG(0, ("cli_lsa_lookup_sids(): out of memory\n"));
- result = NT_STATUS_NO_MEMORY;
+ *presult = NT_STATUS_NO_MEMORY;
goto done;
}
}
@@ -698,34 +704,113 @@ static NTSTATUS rpccli_lsa_lookup_names_generic(struct rpc_pipe_client *cli,
}
done:
+ return status;
+}
- return result;
+NTSTATUS dcerpc_lsa_lookup_names(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ struct policy_handle *pol,
+ uint32_t num_names,
+ const char **names,
+ const char ***dom_names,
+ enum lsa_LookupNamesLevel level,
+ struct dom_sid **sids,
+ enum lsa_SidType **types,
+ NTSTATUS *result)
+{
+ return dcerpc_lsa_lookup_names_generic(h,
+ mem_ctx,
+ pol,
+ num_names,
+ names,
+ dom_names,
+ level,
+ sids,
+ types,
+ false,
+ result);
}
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
- struct policy_handle *pol, int num_names,
+ struct policy_handle *pol,
+ int num_names,
const char **names,
const char ***dom_names,
int level,
struct 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 status;
+ NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+ status = dcerpc_lsa_lookup_names(cli->binding_handle,
+ mem_ctx,
+ pol,
+ num_names,
+ names,
+ dom_names,
+ level,
+ sids,
+ types,
+ &result);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ return result;
+}
+
+NTSTATUS dcerpc_lsa_lookup_names4(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ struct policy_handle *pol,
+ uint32_t num_names,
+ const char **names,
+ const char ***dom_names,
+ enum lsa_LookupNamesLevel level,
+ struct dom_sid **sids,
+ enum lsa_SidType **types,
+ NTSTATUS *result)
+{
+ return dcerpc_lsa_lookup_names_generic(h,
+ mem_ctx,
+ pol,
+ num_names,
+ names,
+ dom_names,
+ level,
+ sids,
+ types,
+ true,
+ result);
}
NTSTATUS rpccli_lsa_lookup_names4(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
- struct policy_handle *pol, int num_names,
+ struct policy_handle *pol,
+ int num_names,
const char **names,
const char ***dom_names,
int level,
struct 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);
+ NTSTATUS status;
+ NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+
+ status = dcerpc_lsa_lookup_names4(cli->binding_handle,
+ mem_ctx,
+ pol,
+ num_names,
+ names,
+ dom_names,
+ level,
+ sids,
+ types,
+ &result);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ return result;
}
diff --git a/source3/rpc_client/cli_lsarpc.h b/source3/rpc_client/cli_lsarpc.h
index fb7760a2bf..26fcb75fa1 100644
--- a/source3/rpc_client/cli_lsarpc.h
+++ b/source3/rpc_client/cli_lsarpc.h
@@ -138,6 +138,16 @@ NTSTATUS rpccli_lsa_lookup_sids3(struct rpc_pipe_client *cli,
char ***pnames,
enum lsa_SidType **ptypes);
+NTSTATUS dcerpc_lsa_lookup_names(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ struct policy_handle *pol,
+ uint32_t num_names,
+ const char **names,
+ const char ***dom_names,
+ enum lsa_LookupNamesLevel level,
+ struct dom_sid **sids,
+ enum lsa_SidType **types,
+ NTSTATUS *result);
NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,
@@ -146,6 +156,17 @@ NTSTATUS rpccli_lsa_lookup_names(struct rpc_pipe_client *cli,
int level,
struct dom_sid **sids,
enum lsa_SidType **types);
+
+NTSTATUS dcerpc_lsa_lookup_names4(struct dcerpc_binding_handle *h,
+ TALLOC_CTX *mem_ctx,
+ struct policy_handle *pol,
+ uint32_t num_names,
+ const char **names,
+ const char ***dom_names,
+ enum lsa_LookupNamesLevel level,
+ struct dom_sid **sids,
+ enum lsa_SidType **types,
+ NTSTATUS *result);
NTSTATUS rpccli_lsa_lookup_names4(struct rpc_pipe_client *cli,
TALLOC_CTX *mem_ctx,
struct policy_handle *pol, int num_names,