r12892: Add a 'Migrate from Windows' page to our installation section in SWAT.
[jra/samba/.git] / source4 / libnet / libnet_user.c
index 6df3fd555d3c97d93c80e1c14e9a305a60583bfc..ba9fd0cc83d42b2a7680bd1a2364cc99d962d737 100644 (file)
 
 #include "includes.h"
 #include "libnet/libnet.h"
-#include "libnet/composite.h"
-#include "librpc/gen_ndr/ndr_samr.h"
 
 
 NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_CreateUser *r)
 {
        NTSTATUS status;
-       union libnet_rpc_connect cn;
-       union libnet_find_pdc fp;
-       struct dcerpc_pipe *pipe;
+       struct libnet_RpcConnect cn;
        struct libnet_rpc_domain_open dom_io;
        struct libnet_rpc_useradd user_io;
        
-       /* find domain pdc */
-       fp.generic.level             = LIBNET_FIND_PDC_GENERIC;
-       fp.generic.in.domain_name    = r->in.domain_name;
+       /* connect rpc service of remote DC */
+       cn.level               = LIBNET_RPC_CONNECT_PDC;
+       cn.in.name             = talloc_strdup(mem_ctx, r->in.domain_name);
+       cn.in.dcerpc_iface     = &dcerpc_table_samr;
 
-       status = libnet_find_pdc(ctx, mem_ctx, &fp);
-       if (!NT_STATUS_IS_OK(status)) return status;
-
-       /* connect rpc service of remote server */
-       cn.standard.level                      = LIBNET_RPC_CONNECT_STANDARD;
-       cn.standard.in.server_name             = fp.generic.out.pdc_name;
-       cn.standard.in.dcerpc_iface_name       = DCERPC_SAMR_NAME;
-       cn.standard.in.dcerpc_iface_uuid       = DCERPC_SAMR_UUID;
-       cn.standard.in.dcerpc_iface_version    = DCERPC_SAMR_VERSION;
-
-       status = libnet_rpc_connect(ctx, mem_ctx, &cn);
+       status = libnet_RpcConnect(ctx, mem_ctx, &cn);
        if (!NT_STATUS_IS_OK(status)) {
                r->out.error_string = talloc_asprintf(mem_ctx,
                                                      "Connection to SAMR pipe domain '%s' PDC failed: %s\n",
@@ -56,13 +43,13 @@ NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
                return status;
        }
 
-       ctx->samr = cn.pdc.out.dcerpc_pipe;
+       ctx->pipe = cn.out.dcerpc_pipe;
 
        /* open connected domain */
        dom_io.in.domain_name   = r->in.domain_name;
        dom_io.in.access_mask   = SEC_FLAG_MAXIMUM_ALLOWED;
        
-       status = libnet_rpc_domain_open(ctx->samr, mem_ctx, &dom_io);
+       status = libnet_rpc_domain_open(ctx->pipe, mem_ctx, &dom_io);
        if (!NT_STATUS_IS_OK(status)) {
                r->out.error_string = talloc_asprintf(mem_ctx,
                                                      "Creating user account failed: %s\n",
@@ -76,7 +63,7 @@ NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
        user_io.in.username       = r->in.user_name;
        user_io.in.domain_handle  = dom_io.out.domain_handle;
 
-       status = libnet_rpc_useradd(ctx->samr, mem_ctx, &user_io);
+       status = libnet_rpc_useradd(ctx->pipe, mem_ctx, &user_io);
        if (!NT_STATUS_IS_OK(status)) {
                r->out.error_string = talloc_asprintf(mem_ctx,
                                                      "Creating user account failed: %s\n",
@@ -88,3 +75,54 @@ NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru
 
        return status;
 }
+
+NTSTATUS libnet_DeleteUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, struct libnet_DeleteUser *r)
+{
+       NTSTATUS status;
+       struct libnet_RpcConnect cn;
+       struct libnet_rpc_domain_open dom_io;
+       struct libnet_rpc_userdel user_io;
+       
+       /* connect rpc service of remote DC */
+       cn.level               = LIBNET_RPC_CONNECT_PDC;
+       cn.in.name             = talloc_strdup(mem_ctx, r->in.domain_name);
+       cn.in.dcerpc_iface     = &dcerpc_table_samr;
+
+       status = libnet_RpcConnect(ctx, mem_ctx, &cn);
+       if (!NT_STATUS_IS_OK(status)) {
+               r->out.error_string = talloc_asprintf(mem_ctx,
+                                                     "Connection to SAMR pipe domain '%s' PDC failed: %s\n",
+                                                     r->in.domain_name, nt_errstr(status));
+               return status;
+       }
+
+       ctx->pipe = cn.out.dcerpc_pipe;
+
+       /* open connected domain */
+       dom_io.in.domain_name   = r->in.domain_name;
+       dom_io.in.access_mask   = SEC_FLAG_MAXIMUM_ALLOWED;
+       
+       status = libnet_rpc_domain_open(ctx->pipe, mem_ctx, &dom_io);
+       if (!NT_STATUS_IS_OK(status)) {
+               r->out.error_string = talloc_asprintf(mem_ctx,
+                                                     "Opening domain to delete user account failed: %s\n",
+                                                     nt_errstr(status));
+               return status;
+       }
+
+       ctx->domain_handle = dom_io.out.domain_handle;
+
+       /* create user */
+       user_io.in.username       = r->in.user_name;
+       user_io.in.domain_handle  = dom_io.out.domain_handle;
+
+       status = libnet_rpc_userdel(ctx->pipe, mem_ctx, &user_io);
+       if (!NT_STATUS_IS_OK(status)) {
+               r->out.error_string = talloc_asprintf(mem_ctx,
+                                                     "Deleting user account failed: %s\n",
+                                                     nt_errstr(status));
+               return status;
+       }
+
+       return status;
+}