2007-11-30 22:20:18 +03:00
/*
Samba Unix / Linux SMB client library
net dom commands for remote join / unjoin
2009-05-08 23:56:17 +04:00
Copyright ( C ) 2007 , 2009 Günther Deschner
2007-11-30 22:20:18 +03:00
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
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
# include "utils/net.h"
2011-01-28 12:31:39 +03:00
# include "../librpc/gen_ndr/ndr_initshutdown.h"
2010-05-05 03:39:16 +04:00
# include "../librpc/gen_ndr/ndr_winreg.h"
2010-08-03 02:03:03 +04:00
# include "lib/netapi/netapi.h"
2010-11-21 12:40:50 +03:00
# include "lib/netapi/netapi_net.h"
2011-05-06 13:47:43 +04:00
# include "libsmb/libsmb.h"
2007-11-30 22:20:18 +03:00
2008-05-15 12:14:41 +04:00
int net_dom_usage ( struct net_context * c , int argc , const char * * argv )
2007-11-30 22:20:18 +03:00
{
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n %s " ,
_ ( " Usage: " ) ,
_ ( " net dom join "
2009-07-30 11:10:03 +04:00
" <domain=DOMAIN> <ou=OU> <account=ACCOUNT> "
" <password=PASSWORD> <reboot> \n Join a remote machine \n " ) ) ;
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n %s " ,
_ ( " Usage: " ) ,
_ ( " net dom unjoin "
2009-07-30 11:10:03 +04:00
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n "
" Unjoin a remote machine \n " ) ) ;
2010-01-19 13:43:54 +03:00
d_printf ( " %s \n %s " ,
_ ( " Usage: " ) ,
_ ( " net dom renamecomputer "
2009-07-30 11:10:03 +04:00
" <newname=NEWNAME> "
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n "
" Rename joined computer \n " ) ) ;
2007-11-30 22:20:18 +03:00
return - 1 ;
}
2008-05-10 01:22:12 +04:00
static int net_dom_unjoin ( struct net_context * c , int argc , const char * * argv )
2007-11-30 22:20:54 +03:00
{
const char * server_name = NULL ;
const char * account = NULL ;
const char * password = NULL ;
2008-08-29 14:52:23 +04:00
uint32_t unjoin_flags = NETSETUP_ACCT_DELETE |
2009-05-01 01:37:26 +04:00
NETSETUP_JOIN_DOMAIN |
NETSETUP_IGNORE_UNSUPPORTED_FLAGS ;
2007-12-03 13:07:27 +03:00
struct cli_state * cli = NULL ;
2008-07-03 23:21:33 +04:00
bool do_reboot = false ;
2007-12-22 02:34:30 +03:00
NTSTATUS ntstatus ;
NET_API_STATUS status ;
2007-12-03 13:07:27 +03:00
int ret = - 1 ;
2007-11-30 22:20:54 +03:00
int i ;
2008-05-19 17:46:57 +04:00
if ( argc < 1 | | c - > display_usage ) {
2008-05-10 01:22:12 +04:00
return net_dom_usage ( c , argc , argv ) ;
2007-11-30 22:20:54 +03:00
}
2008-05-10 01:22:12 +04:00
if ( c - > opt_host ) {
server_name = c - > opt_host ;
2007-12-11 23:22:04 +03:00
}
2007-11-30 22:20:54 +03:00
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 ( strequal ( argv [ i ] , " reboot " ) ) {
2008-07-03 23:21:33 +04:00
do_reboot = true ;
2007-11-30 22:20:54 +03:00
}
}
2008-07-03 23:21:33 +04:00
if ( do_reboot ) {
2008-05-10 01:22:12 +04:00
ntstatus = net_make_ipc_connection_ex ( c , c - > opt_workgroup ,
server_name , NULL , 0 ,
& cli ) ;
2007-12-22 02:34:30 +03:00
if ( ! NT_STATUS_IS_OK ( ntstatus ) ) {
2007-12-03 13:07:27 +03:00
return - 1 ;
}
}
2007-12-22 02:34:30 +03:00
status = NetUnjoinDomain ( server_name , account , password , unjoin_flags ) ;
if ( status ! = 0 ) {
2009-07-30 11:10:03 +04:00
printf ( _ ( " Failed to unjoin domain: %s \n " ) ,
2008-05-16 13:52:48 +04:00
libnetapi_get_error_string ( c - > netapi_ctx , status ) ) ;
2007-12-03 13:07:27 +03:00
goto done ;
}
2008-07-03 23:21:33 +04:00
if ( do_reboot ) {
2009-07-30 11:10:03 +04:00
c - > opt_comment = _ ( " Shutting down due to a domain membership "
" change " ) ;
2008-05-10 01:22:12 +04:00
c - > opt_reboot = true ;
c - > opt_timeout = 30 ;
2007-12-03 13:07:27 +03:00
2008-07-20 20:36:31 +04:00
ret = run_rpc_command ( c , cli ,
2009-11-08 21:37:26 +03:00
& ndr_table_initshutdown . syntax_id ,
2008-07-20 20:36:31 +04:00
0 , rpc_init_shutdown_internals ,
2007-12-03 13:07:27 +03:00
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
2009-11-08 21:37:26 +03:00
ret = run_rpc_command ( c , cli , & ndr_table_winreg . syntax_id , 0 ,
2007-12-03 13:07:27 +03:00
rpc_reg_shutdown_internals ,
argc , argv ) ;
goto done ;
2007-11-30 22:20:54 +03:00
}
2007-12-03 13:07:27 +03:00
ret = 0 ;
done :
if ( cli ) {
cli_shutdown ( cli ) ;
}
2007-11-30 22:20:54 +03:00
2007-12-03 13:07:27 +03:00
return ret ;
2007-11-30 22:20:54 +03:00
}
2008-05-10 01:22:12 +04:00
static int net_dom_join ( struct net_context * c , int argc , const char * * argv )
2007-11-30 22:20:18 +03:00
{
const char * server_name = NULL ;
const char * domain_name = NULL ;
const char * account_ou = NULL ;
const char * Account = NULL ;
const char * password = NULL ;
2008-08-29 14:52:23 +04:00
uint32_t join_flags = NETSETUP_ACCT_CREATE |
NETSETUP_JOIN_DOMAIN ;
2007-12-03 13:07:27 +03:00
struct cli_state * cli = NULL ;
2008-07-03 23:21:33 +04:00
bool do_reboot = false ;
2007-12-22 02:34:30 +03:00
NTSTATUS ntstatus ;
NET_API_STATUS status ;
2007-12-03 13:07:27 +03:00
int ret = - 1 ;
2007-11-30 22:20:18 +03:00
int i ;
2008-05-19 17:46:57 +04:00
if ( argc < 1 | | c - > display_usage ) {
2008-05-10 01:22:12 +04:00
return net_dom_usage ( c , argc , argv ) ;
2007-11-30 22:20:18 +03:00
}
2008-05-10 01:22:12 +04:00
if ( c - > opt_host ) {
server_name = c - > opt_host ;
2007-12-11 23:22:04 +03:00
}
2007-11-30 22:20:18 +03:00
2008-05-10 01:22:12 +04:00
if ( c - > opt_force ) {
2008-09-05 18:28:56 +04:00
join_flags | = NETSETUP_DOMAIN_JOIN_IF_JOINED ;
2007-11-30 22:20:18 +03:00
}
for ( i = 0 ; i < argc ; i + + ) {
if ( strnequal ( argv [ i ] , " ou " , strlen ( " ou " ) ) ) {
account_ou = get_string_param ( argv [ i ] ) ;
if ( ! account_ou ) {
return - 1 ;
}
}
if ( strnequal ( argv [ i ] , " domain " , strlen ( " domain " ) ) ) {
domain_name = get_string_param ( argv [ i ] ) ;
if ( ! domain_name ) {
return - 1 ;
}
}
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 ( strequal ( argv [ i ] , " reboot " ) ) {
2008-07-03 23:21:33 +04:00
do_reboot = true ;
2007-11-30 22:20:18 +03:00
}
}
2008-07-03 23:21:33 +04:00
if ( do_reboot ) {
2008-05-10 01:22:12 +04:00
ntstatus = net_make_ipc_connection_ex ( c , c - > opt_workgroup ,
server_name , NULL , 0 ,
& cli ) ;
2007-12-22 02:34:30 +03:00
if ( ! NT_STATUS_IS_OK ( ntstatus ) ) {
2007-12-03 13:07:27 +03:00
return - 1 ;
}
}
2007-11-30 22:20:18 +03:00
/* check if domain is a domain or a workgroup */
2007-12-22 02:34:30 +03:00
status = NetJoinDomain ( server_name , domain_name , account_ou ,
Account , password , join_flags ) ;
if ( status ! = 0 ) {
2009-07-30 11:10:03 +04:00
printf ( _ ( " Failed to join domain: %s \n " ) ,
2008-05-16 13:52:48 +04:00
libnetapi_get_error_string ( c - > netapi_ctx , status ) ) ;
2007-12-03 13:07:27 +03:00
goto done ;
}
2008-07-03 23:21:33 +04:00
if ( do_reboot ) {
2009-07-30 11:10:03 +04:00
c - > opt_comment = _ ( " Shutting down due to a domain membership "
" change " ) ;
2008-05-10 01:22:12 +04:00
c - > opt_reboot = true ;
c - > opt_timeout = 30 ;
2007-12-03 13:07:27 +03:00
2009-11-08 21:37:26 +03:00
ret = run_rpc_command ( c , cli , & ndr_table_initshutdown . syntax_id , 0 ,
2007-12-03 13:07:27 +03:00
rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
2009-11-08 21:37:26 +03:00
ret = run_rpc_command ( c , cli , & ndr_table_winreg . syntax_id , 0 ,
2007-12-03 13:07:27 +03:00
rpc_reg_shutdown_internals ,
argc , argv ) ;
goto done ;
2007-11-30 22:20:18 +03:00
}
2007-12-03 13:07:27 +03:00
ret = 0 ;
done :
if ( cli ) {
cli_shutdown ( cli ) ;
}
2007-11-30 22:20:18 +03:00
2007-12-03 13:07:27 +03:00
return ret ;
2007-11-30 22:20:18 +03:00
}
2009-05-08 23:56:17 +04:00
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 ) {
2009-07-30 11:10:03 +04:00
printf ( _ ( " Failed to rename machine: " ) ) ;
2009-05-08 23:56:17 +04:00
if ( status = = W_ERROR_V ( WERR_SETUP_NOT_JOINED ) ) {
2009-07-30 11:10:03 +04:00
printf ( _ ( " Computer is not joined to a Domain \n " ) ) ;
2009-05-08 23:56:17 +04:00
goto done ;
}
printf ( " %s \n " ,
libnetapi_get_error_string ( c - > netapi_ctx , status ) ) ;
goto done ;
}
if ( do_reboot ) {
2009-07-30 11:10:03 +04:00
c - > opt_comment = _ ( " Shutting down due to a computer rename " ) ;
2009-05-08 23:56:17 +04:00
c - > opt_reboot = true ;
c - > opt_timeout = 30 ;
ret = run_rpc_command ( c , cli ,
2009-11-08 21:37:26 +03:00
& ndr_table_initshutdown . syntax_id ,
2009-05-08 23:56:17 +04:00
0 , rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
2009-11-08 21:37:26 +03:00
ret = run_rpc_command ( c , cli , & ndr_table_winreg . syntax_id , 0 ,
2009-05-08 23:56:17 +04:00
rpc_reg_shutdown_internals ,
argc , argv ) ;
goto done ;
}
ret = 0 ;
done :
if ( cli ) {
cli_shutdown ( cli ) ;
}
return ret ;
}
2008-05-10 01:22:12 +04:00
int net_dom ( struct net_context * c , int argc , const char * * argv )
2007-11-30 22:20:18 +03:00
{
2008-05-16 13:52:48 +04:00
NET_API_STATUS status ;
2008-06-07 04:25:08 +04:00
struct functable func [ ] = {
2008-05-19 17:46:57 +04:00
{
" join " ,
net_dom_join ,
NET_TRANSPORT_LOCAL ,
2009-07-30 11:10:03 +04:00
N_ ( " Join a remote machine " ) ,
N_ ( " net dom join <domain=DOMAIN> <ou=OU> "
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n "
" Join a remote machine " )
2008-05-19 17:46:57 +04:00
} ,
{
" unjoin " ,
net_dom_unjoin ,
NET_TRANSPORT_LOCAL ,
2009-07-30 11:10:03 +04:00
N_ ( " Unjoin a remote machine " ) ,
N_ ( " net dom unjoin <account=ACCOUNT> "
" <password=PASSWORD> <reboot> \n "
" Unjoin a remote machine " )
2008-05-19 17:46:57 +04:00
} ,
2009-05-08 23:56:17 +04:00
{
" renamecomputer " ,
net_dom_renamecomputer ,
NET_TRANSPORT_LOCAL ,
2009-07-30 11:10:03 +04:00
N_ ( " Rename a computer that is joined to a domain " ) ,
N_ ( " net dom renamecomputer <newname=NEWNAME> "
" <account=ACCOUNT> <password=PASSWORD> "
" <reboot> \n "
" Rename joined computer " )
2009-05-08 23:56:17 +04:00
} ,
2008-05-19 17:46:57 +04:00
{ NULL , NULL , 0 , NULL , NULL }
2007-11-30 22:20:18 +03:00
} ;
2010-11-21 12:40:50 +03:00
status = libnetapi_net_init ( & c - > netapi_ctx ) ;
2008-05-16 13:52:48 +04:00
if ( status ! = 0 ) {
return - 1 ;
}
2009-07-05 11:21:07 +04:00
libnetapi_set_username ( c - > netapi_ctx , c - > opt_user_name ) ;
libnetapi_set_password ( c - > netapi_ctx , c - > opt_password ) ;
if ( c - > opt_kerberos ) {
2008-07-31 17:14:14 +04:00
libnetapi_set_use_kerberos ( c - > netapi_ctx ) ;
}
2008-05-16 13:52:48 +04:00
2008-06-07 04:25:08 +04:00
return net_run_function ( c , argc , argv , " net dom " , func ) ;
2007-11-30 22:20:18 +03:00
}