netapi: add libnetapi_samr_open_domain().
authorGünther Deschner <gd@samba.org>
Mon, 2 Jun 2008 15:29:55 +0000 (17:29 +0200)
committerGünther Deschner <gd@samba.org>
Mon, 2 Jun 2008 23:27:45 +0000 (01:27 +0200)
Guenther
(This used to be commit a99906f661faa104da4b40707597ceb4542548f8)

source3/Makefile.in
source3/lib/netapi/netapi_private.h
source3/lib/netapi/samr.c [new file with mode: 0644]

index 435d9900b4b456bf9b25192ae6536a4bbfd27976..c289b01467299c7c21ce2da1f7395a54d3659e3a 100644 (file)
@@ -865,7 +865,8 @@ LIBNETAPI_OBJ1 = lib/netapi/netapi.o \
                 lib/netapi/serverinfo.o \
                 lib/netapi/getdc.o \
                 lib/netapi/user.o \
-                lib/netapi/group.o
+                lib/netapi/group.o \
+                lib/netapi/samr.o
 
 LIBNETAPI_OBJ  = $(LIBNETAPI_OBJ1) $(LIBNET_OBJ) \
                 $(LIBSMBCONF_OBJ) \
index a575f42f4e02e6c415832f3acce227118c218b44..c788222ad3330d930dba7e9efd2a6d3c53268d38 100644 (file)
@@ -33,4 +33,11 @@ WERROR libnetapi_open_pipe(struct libnetapi_ctx *ctx,
                           struct cli_state *cli,
                           int pipe_idx,
                           struct rpc_pipe_client **pipe_cli);
+NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx,
+                                   struct rpc_pipe_client *pipe_cli,
+                                   uint32_t connect_mask,
+                                   uint32_t domain_mask,
+                                   struct policy_handle *connect_handle,
+                                   struct policy_handle *domain_handle,
+                                   struct dom_sid2 **domain_sid);
 #endif
diff --git a/source3/lib/netapi/samr.c b/source3/lib/netapi/samr.c
new file mode 100644 (file)
index 0000000..8e1c409
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  NetApi Samr Support
+ *  Copyright (C) Guenther Deschner 2008
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+
+#include "librpc/gen_ndr/libnetapi.h"
+#include "lib/netapi/netapi.h"
+#include "lib/netapi/netapi_private.h"
+#include "lib/netapi/libnetapi.h"
+
+/****************************************************************
+****************************************************************/
+
+NTSTATUS libnetapi_samr_open_domain(TALLOC_CTX *mem_ctx,
+                                   struct rpc_pipe_client *pipe_cli,
+                                   uint32_t connect_mask,
+                                   uint32_t domain_mask,
+                                   struct policy_handle *connect_handle,
+                                   struct policy_handle *domain_handle,
+                                   struct dom_sid2 **domain_sid)
+{
+       NTSTATUS status;
+       uint32_t resume_handle = 0;
+       uint32_t num_entries = 0;
+       struct samr_SamArray *sam = NULL;
+       const char *domain_name = NULL;
+       struct lsa_String lsa_domain_name;
+       bool domain_found = true;
+       int i;
+
+       if (!is_valid_policy_hnd(connect_handle)) {
+               status = rpccli_try_samr_connects(pipe_cli, mem_ctx,
+                                                 connect_mask,
+                                                 connect_handle);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto done;
+               }
+       }
+
+       status = rpccli_samr_EnumDomains(pipe_cli, mem_ctx,
+                                        connect_handle,
+                                        &resume_handle,
+                                        &sam,
+                                        0xffffffff,
+                                        &num_entries);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       for (i=0; i<num_entries; i++) {
+
+               domain_name = sam->entries[i].name.string;
+
+               if (strequal(domain_name, builtin_domain_name())) {
+                       continue;
+               }
+
+               domain_found = true;
+               break;
+       }
+
+       if (!domain_found) {
+               status = NT_STATUS_NO_SUCH_DOMAIN;
+               goto done;
+       }
+
+       init_lsa_String(&lsa_domain_name, domain_name);
+
+       status = rpccli_samr_LookupDomain(pipe_cli, mem_ctx,
+                                         connect_handle,
+                                         &lsa_domain_name,
+                                         domain_sid);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+       status = rpccli_samr_OpenDomain(pipe_cli, mem_ctx,
+                                       connect_handle,
+                                       domain_mask,
+                                       *domain_sid,
+                                       domain_handle);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto done;
+       }
+
+ done:
+       return status;
+}