summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/net_proto.h9
-rw-r--r--source3/utils/net_rpc.c34
-rw-r--r--source3/utils/net_rpc_samsync.c96
3 files changed, 108 insertions, 31 deletions
diff --git a/source3/utils/net_proto.h b/source3/utils/net_proto.h
index fe3b8648db..a370d3d6b2 100644
--- a/source3/utils/net_proto.h
+++ b/source3/utils/net_proto.h
@@ -359,6 +359,15 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
TALLOC_CTX *mem_ctx,
int argc,
const char **argv);
+int rpc_vampire_ldif(struct net_context *c, int argc, const char **argv);
+NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
+ const DOM_SID *domain_sid,
+ const char *domain_name,
+ struct cli_state *cli,
+ struct rpc_pipe_client *pipe_hnd,
+ TALLOC_CTX *mem_ctx,
+ int argc,
+ const char **argv);
/* The following definitions come from utils/net_rpc_service.c */
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
index 25a4ef1a75..6a7c638e2a 100644
--- a/source3/utils/net_rpc.c
+++ b/source3/utils/net_rpc.c
@@ -6807,16 +6807,34 @@ static int rpc_samdump(struct net_context *c, int argc, const char **argv) {
}
/* syncronise sam database via samsync rpc calls */
-static int rpc_vampire(struct net_context *c, int argc, const char **argv) {
- if (c->display_usage) {
- d_printf("Usage:\n"
- "net rpc vampire\n"
- " Vampire remote SAM database\n");
- return 0;
+static int rpc_vampire(struct net_context *c, int argc, const char **argv)
+{
+ struct functable func[] = {
+ {
+ "ldif",
+ rpc_vampire_ldif,
+ NET_TRANSPORT_RPC,
+ "Dump remote SAM database to ldif",
+ "net rpc vampire ldif\n"
+ " Dump remote SAM database to LDIF file or stdout"
+ },
+ {NULL, NULL, 0, NULL, NULL}
+ };
+
+ if (argc == 0) {
+ if (c->display_usage) {
+ d_printf("Usage:\n"
+ "net rpc vampire\n"
+ " Vampire remote SAM database\n");
+ return 0;
+ }
+
+ return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
+ rpc_vampire_internals,
+ argc, argv);
}
- return run_rpc_command(c, NULL, PI_NETLOGON, NET_FLAGS_ANONYMOUS,
- rpc_vampire_internals, argc, argv);
+ return net_run_function(c, argc, argv, "net rpc vampire", func);
}
/**
diff --git a/source3/utils/net_rpc_samsync.c b/source3/utils/net_rpc_samsync.c
index 0d289ed605..bc07341674 100644
--- a/source3/utils/net_rpc_samsync.c
+++ b/source3/utils/net_rpc_samsync.c
@@ -2473,15 +2473,12 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
int argc,
const char **argv)
{
- NTSTATUS result;
- fstring my_dom_sid_str;
- fstring rem_dom_sid_str;
+ NTSTATUS result;
struct samsync_context *ctx = NULL;
- samsync_fn_t *fn;
result = samsync_init_context(mem_ctx,
domain_sid,
- 0,
+ NET_SAMSYNC_MODE_FETCH_PASSDB,
&ctx);
if (!NT_STATUS_IS_OK(result)) {
return result;
@@ -2495,27 +2492,17 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
"workgroup=%s\n\n in your smb.conf?\n",
domain_name,
get_global_sam_name(),
- sid_to_fstring(my_dom_sid_str,
- get_global_sam_sid()),
- domain_name, sid_to_fstring(rem_dom_sid_str,
- domain_sid),
+ sid_string_dbg(get_global_sam_sid()),
+ domain_name,
+ sid_string_dbg(domain_sid),
domain_name);
return NT_STATUS_UNSUCCESSFUL;
}
- if (argc >= 1 && (strcmp(argv[0], "ldif") == 0)) {
- ctx->mode = NET_SAMSYNC_MODE_FETCH_LDIF;
- ctx->ldif_filename = argv[1];
- fn = (samsync_fn_t *)fetch_sam_entries_ldif;
- } else {
- ctx->mode = NET_SAMSYNC_MODE_FETCH_PASSDB;
- fn = (samsync_fn_t *)fetch_sam_entries;
- }
-
/* fetch domain */
ctx->domain_sid = domain_sid;
result = process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
- (samsync_fn_t)fn, ctx);
+ fetch_sam_entries, ctx);
if (!NT_STATUS_IS_OK(result)) {
d_fprintf(stderr, "Failed to fetch domain database: %s\n",
nt_errstr(result));
@@ -2528,18 +2515,81 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
/* fetch builtin */
ctx->domain_sid = &global_sid_Builtin;
result = process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
- (samsync_fn_t)fn, ctx);
+ fetch_sam_entries, ctx);
if (!NT_STATUS_IS_OK(result)) {
d_fprintf(stderr, "Failed to fetch builtin database: %s\n",
nt_errstr(result));
goto fail;
}
- /* Currently we crash on PRIVS somewhere in unmarshalling */
- /* Dump_database(cli, SAM_DATABASE_PRIVS, &ret_creds); */
-
TALLOC_FREE(ctx);
fail:
return result;
}
+
+NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
+ const DOM_SID *domain_sid,
+ const char *domain_name,
+ struct cli_state *cli,
+ struct rpc_pipe_client *pipe_hnd,
+ TALLOC_CTX *mem_ctx,
+ int argc,
+ const char **argv)
+{
+ NTSTATUS status;
+ struct samsync_context *ctx = NULL;
+
+ status = samsync_init_context(mem_ctx,
+ domain_sid,
+ NET_SAMSYNC_MODE_FETCH_LDIF,
+ &ctx);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ if (argc >= 1) {
+ ctx->ldif_filename = argv[1];
+ }
+
+ /* fetch domain */
+ ctx->domain_sid = domain_sid;
+ status = 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);
+ goto fail;
+ }
+
+ /* fetch builtin */
+ ctx->domain_sid = &global_sid_Builtin;
+ status = 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));
+ goto fail;
+ }
+
+ TALLOC_FREE(ctx);
+
+ fail:
+ return status;
+}
+
+int rpc_vampire_ldif(struct net_context *c, int argc, const char **argv)
+{
+ if (c->display_usage) {
+ d_printf("Usage\n"
+ "net rpc vampire ldif\n"
+ " Dump remote SAM database to LDIF file or stdout\n");
+ return 0;
+ }
+
+ return run_rpc_command(c, NULL, PI_NETLOGON, 0, rpc_vampire_ldif_internals,
+ argc, argv);
+}