summaryrefslogtreecommitdiff
path: root/source4/libnet
diff options
context:
space:
mode:
Diffstat (limited to 'source4/libnet')
-rw-r--r--source4/libnet/libnet_user.c51
-rw-r--r--source4/libnet/libnet_user.h18
2 files changed, 69 insertions, 0 deletions
diff --git a/source4/libnet/libnet_user.c b/source4/libnet/libnet_user.c
index 50cb14d290..ba9fd0cc83 100644
--- a/source4/libnet/libnet_user.c
+++ b/source4/libnet/libnet_user.c
@@ -75,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;
+}
diff --git a/source4/libnet/libnet_user.h b/source4/libnet/libnet_user.h
index 358f0d0b0f..2182ccb4e4 100644
--- a/source4/libnet/libnet_user.h
+++ b/source4/libnet/libnet_user.h
@@ -36,3 +36,21 @@ struct libnet_CreateUser {
const char *error_string;
} out;
};
+
+enum libnet_DeleteUser_level {
+ LIBNET_DELETE_USER_GENERIC,
+ LIBNET_DELETE_USER_SAMR,
+};
+
+
+struct libnet_DeleteUser {
+ enum libnet_DeleteUser_level level;
+
+ struct {
+ const char *user_name;
+ const char *domain_name;
+ } in;
+ struct {
+ const char *error_string;
+ } out;
+};