2007-11-30 22:20:18 +03:00
/*
Samba Unix / Linux SMB client library
net dom commands for remote join / unjoin
Copyright ( C ) 2007 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
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"
2007-12-18 04:54:18 +03:00
# include "lib/netapi/netapi.h"
2007-11-30 22:20:18 +03:00
static int net_dom_usage ( int argc , const char * * argv )
{
d_printf ( " usage: net dom join "
" <domain=DOMAIN> <ou=OU> <account=ACCOUNT> <password=PASSWORD> <reboot> \n " ) ;
2007-11-30 22:20:54 +03:00
d_printf ( " usage: net dom unjoin "
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n " ) ;
2007-11-30 22:20:18 +03:00
return - 1 ;
}
int net_help_dom ( int argc , const char * * argv )
{
d_printf ( " net dom join " \
" \n Join a remote machine \n " ) ;
2007-11-30 22:20:54 +03:00
d_printf ( " net dom unjoin " \
" \n Unjoin a remote machine \n " ) ;
2007-11-30 22:20:18 +03:00
return - 1 ;
}
2007-11-30 22:20:54 +03:00
static int net_dom_unjoin ( int argc , const char * * argv )
{
const char * server_name = NULL ;
const char * account = NULL ;
const char * password = NULL ;
uint32_t unjoin_flags = WKSSVC_JOIN_FLAGS_ACCOUNT_DELETE |
WKSSVC_JOIN_FLAGS_JOIN_TYPE ;
2007-12-03 13:07:27 +03:00
struct cli_state * cli = NULL ;
2007-11-30 22:20:54 +03:00
bool reboot = false ;
2007-12-03 13:07:27 +03:00
NTSTATUS status ;
2007-12-18 04:54:18 +03:00
NET_API_STATUS werr ;
2007-12-03 13:07:27 +03:00
int ret = - 1 ;
2007-11-30 22:20:54 +03:00
int i ;
if ( argc < 1 ) {
return net_dom_usage ( argc , argv ) ;
}
2007-12-11 23:22:04 +03:00
if ( opt_host ) {
server_name = opt_host ;
}
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 " ) ) {
reboot = true ;
}
}
2007-12-03 13:07:27 +03:00
if ( reboot ) {
status = net_make_ipc_connection_ex ( opt_workgroup , server_name ,
NULL , 0 , & cli ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return - 1 ;
}
}
2007-11-30 22:20:54 +03:00
werr = NetUnjoinDomain ( server_name , account , password , unjoin_flags ) ;
2007-12-18 04:54:18 +03:00
if ( werr ! = 0 ) {
2007-11-30 22:20:54 +03:00
printf ( " Failed to unjoin domain: %s \n " ,
2007-12-18 04:54:18 +03:00
get_friendly_nt_error_msg ( werror_to_ntstatus ( W_ERROR ( werr ) ) ) ) ;
2007-12-03 13:07:27 +03:00
goto done ;
}
if ( reboot ) {
opt_comment = " Shutting down due to a domain membership change " ;
opt_reboot = true ;
opt_timeout = 30 ;
ret = run_rpc_command ( cli , PI_INITSHUTDOWN , 0 ,
rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
ret = run_rpc_command ( cli , PI_WINREG , 0 ,
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
}
2007-11-30 22:20:18 +03:00
static int net_dom_join ( int argc , const char * * argv )
{
const char * server_name = NULL ;
const char * domain_name = NULL ;
const char * account_ou = NULL ;
const char * Account = NULL ;
const char * password = NULL ;
uint32_t join_flags = WKSSVC_JOIN_FLAGS_ACCOUNT_CREATE |
WKSSVC_JOIN_FLAGS_JOIN_TYPE ;
2007-12-03 13:07:27 +03:00
struct cli_state * cli = NULL ;
2007-11-30 22:20:18 +03:00
bool reboot = false ;
2007-12-03 13:07:27 +03:00
NTSTATUS status ;
2007-12-18 04:54:18 +03:00
NET_API_STATUS werr ;
2007-12-03 13:07:27 +03:00
int ret = - 1 ;
2007-11-30 22:20:18 +03:00
int i ;
if ( argc < 1 ) {
return net_dom_usage ( argc , argv ) ;
}
2007-12-11 23:22:04 +03:00
if ( opt_host ) {
server_name = opt_host ;
}
2007-11-30 22:20:18 +03:00
if ( opt_force ) {
join_flags | = WKSSVC_JOIN_FLAGS_DOMAIN_JOIN_IF_JOINED ;
}
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 " ) ) {
reboot = true ;
}
}
2007-12-03 13:07:27 +03:00
if ( reboot ) {
status = net_make_ipc_connection_ex ( opt_workgroup , server_name ,
NULL , 0 , & cli ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return - 1 ;
}
}
2007-11-30 22:20:18 +03:00
/* check if domain is a domain or a workgroup */
werr = NetJoinDomain ( server_name , domain_name , account_ou ,
Account , password , join_flags ) ;
2007-12-18 04:54:18 +03:00
if ( werr ! = 0 ) {
2007-12-11 23:22:04 +03:00
printf ( " Failed to join domain: %s (WERROR: %s) \n " ,
2007-12-18 04:54:18 +03:00
get_friendly_nt_error_msg ( werror_to_ntstatus ( W_ERROR ( werr ) ) ) ,
dos_errstr ( W_ERROR ( werr ) ) ) ;
2007-12-03 13:07:27 +03:00
goto done ;
}
if ( reboot ) {
opt_comment = " Shutting down due to a domain membership change " ;
opt_reboot = true ;
opt_timeout = 30 ;
ret = run_rpc_command ( cli , PI_INITSHUTDOWN , 0 ,
rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
ret = run_rpc_command ( cli , PI_WINREG , 0 ,
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
}
int net_dom ( int argc , const char * * argv )
{
struct functable func [ ] = {
{ " JOIN " , net_dom_join } ,
2007-11-30 22:20:54 +03:00
{ " UNJOIN " , net_dom_unjoin } ,
2007-12-03 13:07:27 +03:00
{ " HELP " , net_help_dom } ,
2007-11-30 22:20:18 +03:00
{ NULL , NULL }
} ;
return net_run_function ( argc , argv , func , net_dom_usage ) ;
}