r5365: Initial code for adding user accounts via libnet call.
[samba.git] / source4 / libnet / libnet_user.c
1 /* 
2    Unix SMB/CIFS implementation.
3    
4    Copyright (C) Rafal Szczesniak <mimir@samba.org> 2005
5    
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10    
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15    
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21
22 #include "includes.h"
23 #include "libnet/libnet.h"
24 #include "librpc/gen_ndr/ndr_samr.h"
25
26
27 static NTSTATUS libnet_CreateUser_generic(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_CreateUser *r)
28 {
29         NTSTATUS status;
30         union libnet_CreateUser r2;
31         
32         r2.samr.level             = LIBNET_CREATE_USER_SAMR;
33         r2.samr.in.user_name      = r->generic.in.user_name;
34         r2.samr.in.domain_name    = r->generic.in.domain_name;
35         
36         status = libnet_CreateUser(ctx, mem_ctx, &r2);
37         
38         r->generic.out.error_string   = r2.samr.out.error_string;
39
40         return status;
41 }
42
43
44 static NTSTATUS libnet_CreateUser_samr(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_CreateUser *r)
45 {
46         NTSTATUS status;
47         union libnet_rpc_connect cn;
48         union libnet_find_pdc fp;
49         
50         /* find domain pdc */
51         fp.generic.level             = LIBNET_FIND_PDC_GENERIC;
52         fp.generic.in.domain_name    = r->samr.in.domain_name;
53
54         status = libnet_find_pdc(ctx, mem_ctx, &fp);
55         if (!NT_STATUS_IS_OK(status)) return status;
56
57         /* connect rpc service of remote server */
58         cn.standard.level                      = LIBNET_RPC_CONNECT_STANDARD;
59         cn.standard.in.server_name             = fp.generic.out.pdc_name;
60         cn.standard.in.dcerpc_iface_name       = DCERPC_SAMR_NAME;
61         cn.standard.in.dcerpc_iface_uuid       = DCERPC_SAMR_UUID;
62         cn.standard.in.dcerpc_iface_version    = DCERPC_SAMR_VERSION;
63
64         status = libnet_rpc_connect(ctx, mem_ctx, &cn);
65         if (!NT_STATUS_IS_OK(status)) {
66                 r->samr.out.error_string = talloc_asprintf(mem_ctx,
67                                                            "Connection to SAMR pipe domain '%s' PDC failed: %s\n",
68                                                            r->samr.in.domain_name, nt_errstr(status));
69                 return status;
70         }
71
72         /* create user via samr call (to be continued) */
73         return status;
74 }
75
76
77 NTSTATUS libnet_CreateUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, union libnet_CreateUser *r)
78 {
79         switch (r->generic.level) {
80         case LIBNET_CREATE_USER_GENERIC:
81                 return libnet_CreateUser_generic(ctx, mem_ctx, r);
82         case LIBNET_CREATE_USER_SAMR:
83                 return libnet_CreateUser_samr(ctx, mem_ctx, r);
84         }
85
86         return NT_STATUS_INVALID_LEVEL;
87 }