diff options
author | Günther Deschner <gd@samba.org> | 2009-05-08 21:56:17 +0200 |
---|---|---|
committer | Günther Deschner <gd@samba.org> | 2009-05-11 10:55:40 +0200 |
commit | b1a4649438e5f27722c8dae629037df2543871c7 (patch) | |
tree | 8e01d2add9173a67de3de62b4570cf0d1273b46c | |
parent | 915518c0db30689f3508736238a9e8bb8ab03088 (diff) | |
download | samba-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.c | 3 | ||||
-rw-r--r-- | source3/utils/net_dom.c | 114 |
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} }; |