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"
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
{
d_printf ( " usage: net dom join "
2008-05-19 17:46:57 +04:00
" <domain=DOMAIN> <ou=OU> <account=ACCOUNT> "
2008-05-15 12:14:41 +04:00
" <password=PASSWORD> <reboot> \n Join a remote machine \n " ) ;
2007-11-30 22:20:54 +03:00
d_printf ( " usage: net dom unjoin "
2008-05-19 17:46:57 +04:00
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n "
2008-05-15 12:14:41 +04:00
" Unjoin a remote machine \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 ;
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-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 " ) ) {
reboot = true ;
}
}
2007-12-03 13:07:27 +03:00
if ( 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 ) {
2007-11-30 22:20:54 +03: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 ;
}
if ( reboot ) {
2008-05-10 01:22:12 +04:00
c - > opt_comment = " Shutting down due to a domain membership "
" change " ;
c - > opt_reboot = true ;
c - > opt_timeout = 30 ;
2007-12-03 13:07:27 +03:00
2008-05-10 01:22:12 +04:00
ret = run_rpc_command ( c , cli , PI_INITSHUTDOWN , 0 ,
2007-12-03 13:07:27 +03:00
rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
2008-05-10 01:22:12 +04:00
ret = run_rpc_command ( c , cli , PI_WINREG , 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 ;
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-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 ) {
2007-11-30 22:20:18 +03:00
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 ) {
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 ) {
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 ;
}
if ( reboot ) {
2008-05-10 01:22:12 +04:00
c - > opt_comment = " Shutting down due to a domain membership "
" change " ;
c - > opt_reboot = true ;
c - > opt_timeout = 30 ;
2007-12-03 13:07:27 +03:00
2008-05-10 01:22:12 +04:00
ret = run_rpc_command ( c , cli , PI_INITSHUTDOWN , 0 ,
2007-12-03 13:07:27 +03:00
rpc_init_shutdown_internals ,
argc , argv ) ;
if ( ret = = 0 ) {
goto done ;
}
2008-05-10 01:22:12 +04:00
ret = run_rpc_command ( c , cli , PI_WINREG , 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
}
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 ,
" Join a remote machine " ,
" net dom join <domain=DOMAIN> <ou=OU> "
" <account=ACCOUNT> <password=PASSWORD> <reboot> \n "
" Join a remote machine "
} ,
{
" unjoin " ,
net_dom_unjoin ,
NET_TRANSPORT_LOCAL ,
" Unjoin a remote machine " ,
" net dom unjoin <account=ACCOUNT> <password=PASSWORD> "
" <reboot> \n "
" Unjoin a remote machine "
} ,
{ NULL , NULL , 0 , NULL , NULL }
2007-11-30 22:20:18 +03:00
} ;
2008-05-16 13:52:48 +04:00
status = libnetapi_init ( & c - > netapi_ctx ) ;
if ( status ! = 0 ) {
return - 1 ;
}
libnetapi_set_username ( c - > netapi_ctx , c - > opt_user_name ) ;
libnetapi_set_password ( c - > netapi_ctx , c - > opt_password ) ;
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
}