From 9bdc1a77f5d80827d1e352d30ff7b322a933dc0e Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 31 Oct 2005 03:03:32 +0000 Subject: r11407: Push 'recreate account' logic into libnet/libnet_join.c. We don't return the pesky USER_EXISTS 'error' code any more, and it is much easier to handle this inline. Andrew Bartlett (This used to be commit a7eb796cf544db3fe16986d8e233d2defe7a7d1b) --- source4/libnet/libnet_join.c | 35 +++++++++++++++++++++++++++++++++-- source4/libnet/libnet_join.h | 1 + 2 files changed, 34 insertions(+), 2 deletions(-) (limited to 'source4/libnet') diff --git a/source4/libnet/libnet_join.c b/source4/libnet/libnet_join.c index daa840f76e..a438c5962d 100644 --- a/source4/libnet/libnet_join.c +++ b/source4/libnet/libnet_join.c @@ -144,9 +144,9 @@ static NTSTATUS libnet_JoinSite(struct libnet_context *ctx, if (rtn != 0) { libnet_r->out.error_string = talloc_asprintf(libnet_r, - "Failed to add server entry %s: %s.", + "Failed to add server entry %s: %s: %d", server_dn_str, - ldb_errstring(remote_ldb)); + ldb_errstring(remote_ldb), rtn); talloc_free(tmp_ctx); return NT_STATUS_INTERNAL_DB_CORRUPTION; } @@ -881,6 +881,36 @@ NTSTATUS libnet_JoinDomain(struct libnet_context *ctx, TALLOC_CTX *mem_ctx, stru talloc_free(tmp_ctx); return status; } + + if (r->in.recreate_account) { + struct samr_DeleteUser d; + d.in.user_handle = u_handle; + d.out.user_handle = u_handle; + status = dcerpc_samr_DeleteUser(samr_pipe, mem_ctx, &d); + if (!NT_STATUS_IS_OK(status)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "samr_DeleteUser (for recreate) of [%s] failed: %s", + r->in.account_name, + nt_errstr(status)); + talloc_free(tmp_ctx); + return status; + } + + /* We want to recreate, so delete and another samr_CreateUser2 */ + + /* &cu filled in above */ + cu_status = dcerpc_samr_CreateUser2(samr_pipe, tmp_ctx, &cu); + status = cu_status; + if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status, NT_STATUS_USER_EXISTS)) { + r->out.error_string = talloc_asprintf(mem_ctx, + "samr_CreateUser2 (recreate) for [%s] failed: %s\n", + r->in.domain_name, nt_errstr(status)); + talloc_free(tmp_ctx); + return status; + } + DEBUG(0, ("Recreated account in domain %s\n", domain_name)); + + } } /* Find out what password policy this user has */ pwp.in.user_handle = u_handle; @@ -1093,6 +1123,7 @@ static NTSTATUS libnet_Join_primary_domain(struct libnet_context *ctx, r2->in.netbios_name = netbios_name; r2->in.level = LIBNET_JOINDOMAIN_AUTOMATIC; r2->in.acct_type = acct_type; + r2->in.recreate_account = False; status = libnet_JoinDomain(ctx, r2, r2); if (!NT_STATUS_IS_OK(status)) { r->out.error_string = talloc_steal(mem_ctx, r2->out.error_string); diff --git a/source4/libnet/libnet_join.h b/source4/libnet/libnet_join.h index a08147b6d6..d1ddc623f0 100644 --- a/source4/libnet/libnet_join.h +++ b/source4/libnet/libnet_join.h @@ -40,6 +40,7 @@ struct libnet_JoinDomain { const char *binding; enum libnet_JoinDomain_level level; uint32_t acct_type; + BOOL recreate_account; } in; struct { -- cgit