diff options
-rw-r--r-- | source3/libnet/libnet_samsync.c | 66 | ||||
-rw-r--r-- | source3/libnet/libnet_samsync.h | 4 | ||||
-rw-r--r-- | source3/libnet/libnet_samsync_ldif.c | 7 | ||||
-rw-r--r-- | source3/utils/net_rpc_samsync.c | 48 |
4 files changed, 82 insertions, 43 deletions
diff --git a/source3/libnet/libnet_samsync.c b/source3/libnet/libnet_samsync.c index b5632aed69..c86c5c12e1 100644 --- a/source3/libnet/libnet_samsync.c +++ b/source3/libnet/libnet_samsync.c @@ -223,6 +223,25 @@ NTSTATUS samsync_init_context(TALLOC_CTX *mem_ctx, } /** + * samsync_database_str + */ + +static const char *samsync_database_str(enum netr_SamDatabaseID database_id) +{ + + switch (database_id) { + case SAM_DATABASE_DOMAIN: + return "DOMAIN"; + case SAM_DATABASE_BUILTIN: + return "BUILTIN"; + case SAM_DATABASE_PRIVS: + return "PRIVS"; + default: + return "unknown"; + } +} + +/** * samsync_debug_str */ @@ -231,7 +250,6 @@ static const char *samsync_debug_str(TALLOC_CTX *mem_ctx, enum netr_SamDatabaseID database_id) { const char *action = NULL; - const char *str = NULL; switch (mode) { case NET_SAMSYNC_MODE_DUMP: @@ -248,26 +266,8 @@ static const char *samsync_debug_str(TALLOC_CTX *mem_ctx, break; } - switch (database_id) { - case SAM_DATABASE_DOMAIN: - str = talloc_asprintf(mem_ctx, "%s DOMAIN database", - action); - break; - case SAM_DATABASE_BUILTIN: - str = talloc_asprintf(mem_ctx, "%s BUILTIN database", - action); - break; - case SAM_DATABASE_PRIVS: - str = talloc_asprintf(mem_ctx, "%s PRIVS database", - action); - break; - default: - str = talloc_asprintf(mem_ctx, "%s unknown database type %u", - action, database_id); - break; - } - - return str; + return talloc_asprintf(mem_ctx, "%s %s database", + action, samsync_database_str(database_id)); } /** @@ -303,6 +303,7 @@ NTSTATUS samsync_process_database(struct rpc_pipe_client *pipe_hnd, do { struct netr_DELTA_ENUM_ARRAY *delta_enum_array = NULL; + NTSTATUS callback_status; netlogon_creds_client_step(pipe_hnd->dc, &credential); @@ -340,7 +341,11 @@ NTSTATUS samsync_process_database(struct rpc_pipe_client *pipe_hnd, delta_enum_array); /* Process results */ - callback_fn(mem_ctx, database_id, delta_enum_array, result, ctx); + callback_status = callback_fn(mem_ctx, database_id, delta_enum_array, result, ctx); + if (!NT_STATUS_IS_OK(callback_status)) { + result = callback_status; + goto out; + } TALLOC_FREE(delta_enum_array); @@ -349,6 +354,23 @@ NTSTATUS samsync_process_database(struct rpc_pipe_client *pipe_hnd, } while (NT_STATUS_EQUAL(result, STATUS_MORE_ENTRIES)); + out: + if (NT_STATUS_IS_ERR(result) && !ctx->error_message) { + + ctx->error_message = talloc_asprintf(ctx, + "Failed to fetch %s database: %s", + samsync_database_str(database_id), + nt_errstr(result)); + + if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) { + + ctx->error_message = + talloc_asprintf_append(ctx->error_message, + "\nPerhaps %s is a Windows native mode domain?", + ctx->domain_name); + } + } + talloc_destroy(mem_ctx); return result; diff --git a/source3/libnet/libnet_samsync.h b/source3/libnet/libnet_samsync.h index 1e3995614f..bd64c24d93 100644 --- a/source3/libnet/libnet_samsync.h +++ b/source3/libnet/libnet_samsync.h @@ -30,6 +30,10 @@ struct samsync_context { const char *domain_sid_str; const char *domain_name; const char *output_filename; + + char *result_message; + char *error_message; + void *private_data; }; diff --git a/source3/libnet/libnet_samsync_ldif.c b/source3/libnet/libnet_samsync_ldif.c index 86de2ab253..60acb7db40 100644 --- a/source3/libnet/libnet_samsync_ldif.c +++ b/source3/libnet/libnet_samsync_ldif.c @@ -1186,7 +1186,7 @@ NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx, for (i = 0; i < r->num_deltas; i++) { status = fetch_sam_entry_ldif(mem_ctx, database_id, &r->delta_enum[i], ctx, - &g_index, &a_index); + &a_index, &g_index); if (!NT_STATUS_IS_OK(status)) { goto failed; } @@ -1195,6 +1195,11 @@ NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx, /* This was the last query */ if (NT_STATUS_IS_OK(result)) { ldif_write_output(database_id, ldif_ctx); + if (ldif_ctx->ldif_file != stdout) { + ctx->result_message = talloc_asprintf(mem_ctx, + "Vampired %d accounts and %d groups to %s", + a_index, g_index, ctx->output_filename); + } ldif_free_context(ldif_ctx); ctx->private_data = NULL; } diff --git a/source3/utils/net_rpc_samsync.c b/source3/utils/net_rpc_samsync.c index 797598c48e..5161bb3ef5 100644 --- a/source3/utils/net_rpc_samsync.c +++ b/source3/utils/net_rpc_samsync.c @@ -1199,29 +1199,33 @@ NTSTATUS rpc_vampire_internals(struct net_context *c, /* fetch domain */ result = samsync_process_database(pipe_hnd, SAM_DATABASE_DOMAIN, fetch_sam_entries, ctx); - if (!NT_STATUS_IS_OK(result)) { - d_fprintf(stderr, "Failed to fetch domain database: %s\n", - nt_errstr(result)); - if (NT_STATUS_EQUAL(result, NT_STATUS_NOT_SUPPORTED)) - d_fprintf(stderr, "Perhaps %s is a Windows 2000 " - "native mode domain?\n", domain_name); + + if (!NT_STATUS_IS_OK(result) && ctx->error_message) { + d_fprintf(stderr, "%s\n", ctx->error_message); goto fail; } + if (ctx->result_message) { + d_fprintf(stdout, "%s\n", ctx->result_message); + } + /* fetch builtin */ ctx->domain_sid = sid_dup_talloc(mem_ctx, &global_sid_Builtin); ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid); result = samsync_process_database(pipe_hnd, SAM_DATABASE_BUILTIN, fetch_sam_entries, ctx); - if (!NT_STATUS_IS_OK(result)) { - d_fprintf(stderr, "Failed to fetch builtin database: %s\n", - nt_errstr(result)); + + if (!NT_STATUS_IS_OK(result) && ctx->error_message) { + d_fprintf(stderr, "%s\n", ctx->error_message); goto fail; } - TALLOC_FREE(ctx); + if (ctx->result_message) { + d_fprintf(stdout, "%s\n", ctx->result_message); + } fail: + TALLOC_FREE(ctx); return result; } @@ -1253,29 +1257,33 @@ NTSTATUS rpc_vampire_ldif_internals(struct net_context *c, /* fetch domain */ status = samsync_process_database(pipe_hnd, SAM_DATABASE_DOMAIN, fetch_sam_entries_ldif, ctx); - if (!NT_STATUS_IS_OK(status)) { - d_fprintf(stderr, "Failed to fetch domain database: %s\n", - nt_errstr(status)); - if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_SUPPORTED)) - d_fprintf(stderr, "Perhaps %s is a Windows 2000 " - "native mode domain?\n", domain_name); + + if (!NT_STATUS_IS_OK(status) && ctx->error_message) { + d_fprintf(stderr, "%s\n", ctx->error_message); goto fail; } + if (ctx->result_message) { + d_fprintf(stdout, "%s\n", ctx->result_message); + } + /* fetch builtin */ ctx->domain_sid = sid_dup_talloc(mem_ctx, &global_sid_Builtin); ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid); status = samsync_process_database(pipe_hnd, SAM_DATABASE_BUILTIN, fetch_sam_entries_ldif, ctx); - if (!NT_STATUS_IS_OK(status)) { - d_fprintf(stderr, "Failed to fetch builtin database: %s\n", - nt_errstr(status)); + + if (!NT_STATUS_IS_OK(status) && ctx->error_message) { + d_fprintf(stderr, "%s\n", ctx->error_message); goto fail; } - TALLOC_FREE(ctx); + if (ctx->result_message) { + d_fprintf(stdout, "%s\n", ctx->result_message); + } fail: + TALLOC_FREE(ctx); return status; } |