#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",
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",
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",
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;
+}