summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2009-05-08 21:56:17 +0200
committerGünther Deschner <gd@samba.org>2009-05-11 10:55:40 +0200
commitb1a4649438e5f27722c8dae629037df2543871c7 (patch)
tree8e01d2add9173a67de3de62b4570cf0d1273b46c
parent915518c0db30689f3508736238a9e8bb8ab03088 (diff)
downloadsamba-b1a4649438e5f27722c8dae629037df2543871c7.tar.gz
samba-b1a4649438e5f27722c8dae629037df2543871c7.tar.bz2
samba-b1a4649438e5f27722c8dae629037df2543871c7.zip
s3-net: add "net dom renamecomputer" to rename machines in a domain.
dmarkey, please test :) Guenther
-rw-r--r--source3/rpc_server/srv_wkssvc_nt.c3
-rw-r--r--source3/utils/net_dom.c114
2 files changed, 114 insertions, 3 deletions
diff --git a/source3/rpc_server/srv_wkssvc_nt.c b/source3/rpc_server/srv_wkssvc_nt.c
index 8d2e73b5a5..b06818efb3 100644
--- a/source3/rpc_server/srv_wkssvc_nt.c
+++ b/source3/rpc_server/srv_wkssvc_nt.c
@@ -428,8 +428,7 @@ WERROR _wkssvc_NetrUnjoinDomain2(pipes_struct *p,
WERROR _wkssvc_NetrRenameMachineInDomain2(pipes_struct *p, struct wkssvc_NetrRenameMachineInDomain2 *r)
{
- /* FIXME: Add implementation code here */
- p->rng_fault_state = True;
+ /* for now just return not supported */
return WERR_NOT_SUPPORTED;
}
diff --git a/source3/utils/net_dom.c b/source3/utils/net_dom.c
index 3bf6a27289..401079777f 100644
--- a/source3/utils/net_dom.c
+++ b/source3/utils/net_dom.c
@@ -1,7 +1,7 @@
/*
Samba Unix/Linux SMB client library
net dom commands for remote join/unjoin
- Copyright (C) 2007 Günther Deschner
+ Copyright (C) 2007,2009 Günther Deschner
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -28,6 +28,10 @@ int net_dom_usage(struct net_context *c, int argc, const char **argv)
d_printf("usage: net dom unjoin "
"<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
" Unjoin a remote machine\n");
+ d_printf("usage: net dom renamecomputer "
+ "<newname=NEWNAME> "
+ "<account=ACCOUNT> <password=PASSWORD> <reboot>\n"
+ " Rename joined computer\n");
return -1;
}
@@ -225,6 +229,103 @@ static int net_dom_join(struct net_context *c, int argc, const char **argv)
return ret;
}
+static int net_dom_renamecomputer(struct net_context *c, int argc, const char **argv)
+{
+ const char *server_name = NULL;
+ const char *account = NULL;
+ const char *password = NULL;
+ const char *newname = NULL;
+ uint32_t rename_options = NETSETUP_ACCT_CREATE;
+ struct cli_state *cli = NULL;
+ bool do_reboot = false;
+ NTSTATUS ntstatus;
+ NET_API_STATUS status;
+ int ret = -1;
+ int i;
+
+ if (argc < 1 || c->display_usage) {
+ return net_dom_usage(c, argc, argv);
+ }
+
+ if (c->opt_host) {
+ server_name = c->opt_host;
+ }
+
+ for (i=0; i<argc; i++) {
+ if (strnequal(argv[i], "account", strlen("account"))) {
+ account = get_string_param(argv[i]);
+ if (!account) {
+ return -1;
+ }
+ }
+ if (strnequal(argv[i], "password", strlen("password"))) {
+ password = get_string_param(argv[i]);
+ if (!password) {
+ return -1;
+ }
+ }
+ if (strnequal(argv[i], "newname", strlen("newname"))) {
+ newname = get_string_param(argv[i]);
+ if (!newname) {
+ return -1;
+ }
+ }
+ if (strequal(argv[i], "reboot")) {
+ do_reboot = true;
+ }
+ }
+
+ if (do_reboot) {
+ ntstatus = net_make_ipc_connection_ex(c, c->opt_workgroup,
+ server_name, NULL, 0,
+ &cli);
+ if (!NT_STATUS_IS_OK(ntstatus)) {
+ return -1;
+ }
+ }
+
+ status = NetRenameMachineInDomain(server_name, newname,
+ account, password, rename_options);
+ if (status != 0) {
+ printf("Failed to rename machine: ");
+ if (status == W_ERROR_V(WERR_SETUP_NOT_JOINED)) {
+ printf("Computer is not joined to a Domain\n");
+ goto done;
+ }
+ printf("%s\n",
+ libnetapi_get_error_string(c->netapi_ctx, status));
+ goto done;
+ }
+
+ if (do_reboot) {
+ c->opt_comment = "Shutting down due to a computer rename";
+ c->opt_reboot = true;
+ c->opt_timeout = 30;
+
+ ret = run_rpc_command(c, cli,
+ &ndr_table_initshutdown.syntax_id,
+ 0, rpc_init_shutdown_internals,
+ argc, argv);
+ if (ret == 0) {
+ goto done;
+ }
+
+ ret = run_rpc_command(c, cli, &ndr_table_winreg.syntax_id, 0,
+ rpc_reg_shutdown_internals,
+ argc, argv);
+ goto done;
+ }
+
+ ret = 0;
+
+ done:
+ if (cli) {
+ cli_shutdown(cli);
+ }
+
+ return ret;
+}
+
int net_dom(struct net_context *c, int argc, const char **argv)
{
NET_API_STATUS status;
@@ -248,6 +349,17 @@ int net_dom(struct net_context *c, int argc, const char **argv)
"<reboot>\n"
" Unjoin a remote machine"
},
+ {
+ "renamecomputer",
+ net_dom_renamecomputer,
+ NET_TRANSPORT_LOCAL,
+ "Rename a computer that is joined to a domain",
+ "net dom renamecomputer <newname=NEWNAME> "
+ "<account=ACCOUNT> <password=PASSWORD> "
+ "<reboot>\n"
+ " Rename joined computer"
+ },
+
{NULL, NULL, 0, NULL, NULL}
};