summaryrefslogtreecommitdiff
path: root/source3/utils/net_rpc.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/utils/net_rpc.c')
-rw-r--r--source3/utils/net_rpc.c68
1 files changed, 63 insertions, 5 deletions
diff --git a/source3/utils/net_rpc.c b/source3/utils/net_rpc.c
index b1a9ad4aa9..97a1a1d342 100644
--- a/source3/utils/net_rpc.c
+++ b/source3/utils/net_rpc.c
@@ -81,11 +81,11 @@ static DOM_SID *net_get_remote_domain_sid(struct cli_state *cli)
}
-static int run_rpc_command(const char *pipe_name,
+static int run_rpc_command(const char *pipe_name, int conn_flags,
rpc_command_fn fn,
int argc, const char **argv)
{
- struct cli_state *cli = net_make_ipc_connection(0);
+ struct cli_state *cli = net_make_ipc_connection(conn_flags);
TALLOC_CTX *mem_ctx;
NTSTATUS nt_status;
DOM_SID *domain_sid = net_get_remote_domain_sid(cli);
@@ -103,6 +103,8 @@ static int run_rpc_command(const char *pipe_name,
nt_status = fn(domain_sid, cli, mem_ctx, argc, argv);
+ DEBUG(5, ("rpc command function returned %s\n", get_nt_error_msg(nt_status)));
+
if (cli->nt_pipe_fnum)
cli_nt_session_close(cli);
@@ -160,9 +162,62 @@ static NTSTATUS rpc_user_add_internals(const DOM_SID *domain_sid, struct cli_sta
return result;
}
+static NTSTATUS rpc_changetrustpw_internals(const DOM_SID *domain_sid, struct cli_state *cli, TALLOC_CTX *mem_ctx,
+ int argc, const char **argv) {
+
+ return trust_pw_find_change_and_store_it(cli, mem_ctx, opt_target_workgroup);
+}
+
+static int rpc_changetrustpw(int argc, const char **argv)
+{
+ return run_rpc_command(PIPE_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_changetrustpw_internals,
+ argc, argv);
+}
+
+static NTSTATUS rpc_join_oldstyle_internals(const DOM_SID *domain_sid, struct cli_state *cli, TALLOC_CTX *mem_ctx,
+ int argc, const char **argv) {
+
+ extern pstring global_myname;
+ fstring trust_passwd;
+ unsigned char orig_trust_passwd_hash[16];
+
+ fstrcpy(trust_passwd, global_myname);
+ strlower(trust_passwd);
+ E_md4hash( (uchar *)trust_passwd, orig_trust_passwd_hash);
+
+ return trust_pw_change_and_store_it(cli, mem_ctx, orig_trust_passwd_hash);
+}
+
+static int rpc_join_oldstyle(int argc, const char **argv)
+{
+ return run_rpc_command(PIPE_NETLOGON, NET_FLAGS_ANONYMOUS | NET_FLAGS_PDC, rpc_join_oldstyle_internals,
+ argc, argv);
+}
+
+static int rpc_join_usage(int argc, const char **argv)
+{
+ d_printf(" net rpc join \t to join a domain with admin username & password\n");
+ d_printf(" net rpc join oldstyle \t to join a domain created in server manager\n");
+ return -1;
+}
+
+static int rpc_join(int argc, const char **argv)
+{
+ struct functable func[] = {
+ {"oldstyle", rpc_join_oldstyle},
+ {NULL, NULL}
+ };
+
+ if (argc == 0) {
+ return net_rpc_join(argc, argv);
+ }
+
+ return net_run_function(argc, argv, func, rpc_join_usage);
+}
+
static int rpc_user_add(int argc, const char **argv)
{
- return run_rpc_command(PIPE_SAMR, rpc_user_add_internals,
+ return run_rpc_command(PIPE_SAMR, 0, rpc_user_add_internals,
argc, argv);
}
@@ -188,15 +243,18 @@ static int rpc_user(int argc, const char **argv)
int net_rpc_usage(int argc, const char **argv)
{
- d_printf(" net rpc join \tto join a domin \n");
+ d_printf(" net rpc join \tto join a domain \n");
+ d_printf(" net rpc user \tto add, delete and list users\n");
+ d_printf(" net rpc changetrustpw \tto change the trust account password\n");
return -1;
}
int net_rpc(int argc, const char **argv)
{
struct functable func[] = {
- {"join", net_rpc_join},
+ {"join", rpc_join},
{"user", rpc_user},
+ {"changetrustpw", rpc_changetrustpw},
{NULL, NULL}
};
return net_run_function(argc, argv, func, net_rpc_usage);