2001-12-04 08:03:03 +03:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
Copyright ( C ) 2001 Andrew Bartlett ( abartlet @ samba . org )
Copyright ( C ) Tim Potter 2001
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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2001-12-04 08:03:03 +03:00
( 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
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>. */
2001-12-04 08:03:03 +03:00
# include "includes.h"
2004-10-07 08:01:18 +04:00
# include "utils/net.h"
2001-12-04 08:03:03 +03:00
/* Macro for checking RPC error codes to make things more readable */
# define CHECK_RPC_ERR(rpc, msg) \
if ( ! NT_STATUS_IS_OK ( result = rpc ) ) { \
2002-03-17 07:36:35 +03:00
DEBUG ( 0 , ( msg " : %s \n " , nt_errstr ( result ) ) ) ; \
2001-12-04 08:03:03 +03:00
goto done ; \
}
# define CHECK_RPC_ERR_DEBUG(rpc, debug_args) \
if ( ! NT_STATUS_IS_OK ( result = rpc ) ) { \
DEBUG ( 0 , debug_args ) ; \
goto done ; \
}
2008-02-01 16:21:54 +03:00
static void init_lsa_String ( struct lsa_String * name , const char * s )
{
name - > string = s ;
}
2002-08-17 18:45:04 +04:00
/**
* confirm that a domain join is still valid
*
* @ return A shell status integer ( 0 for success )
*
* */
2007-09-17 19:34:22 +04:00
NTSTATUS net_rpc_join_ok ( const char * domain , const char * server ,
2007-10-25 01:16:54 +04:00
struct sockaddr_storage * pss )
2002-08-17 18:45:04 +04:00
{
2007-08-29 23:55:13 +04:00
enum security_types sec ;
unsigned int conn_flags = NET_FLAGS_PDC ;
2008-01-17 12:11:11 +03:00
uint32 neg_flags = NETLOGON_NEG_SELECT_AUTH2_FLAGS | NETLOGON_NEG_SCHANNEL ;
2005-09-30 21:13:37 +04:00
struct cli_state * cli = NULL ;
struct rpc_pipe_client * pipe_hnd = NULL ;
2006-02-23 00:18:23 +03:00
struct rpc_pipe_client * netlogon_pipe = NULL ;
NTSTATUS ntret = NT_STATUS_UNSUCCESSFUL ;
2002-08-17 18:45:04 +04:00
2007-08-29 23:55:13 +04:00
sec = ( enum security_types ) lp_security ( ) ;
if ( sec = = SEC_ADS ) {
/* Connect to IPC$ using machine account's credentials. We don't use anonymous
connection here , as it may be denied by server ' s local policy . */
net_use_machine_account ( ) ;
} else {
/* some servers (e.g. WinNT) don't accept machine-authenticated
smb connections */
conn_flags | = NET_FLAGS_ANONYMOUS ;
}
2002-08-17 18:45:04 +04:00
/* Connect to remote machine */
2007-10-25 01:16:54 +04:00
ntret = net_make_ipc_connection_ex ( domain , server , pss , conn_flags , & cli ) ;
2007-09-17 19:11:20 +04:00
if ( ! NT_STATUS_IS_OK ( ntret ) ) {
2007-09-17 19:34:22 +04:00
return ntret ;
2002-08-17 18:45:04 +04:00
}
2006-02-23 00:18:23 +03:00
/* Setup the creds as though we're going to do schannel... */
netlogon_pipe = get_schannel_session_key ( cli , domain , & neg_flags , & ntret ) ;
2002-08-17 18:45:04 +04:00
2006-02-23 00:18:23 +03:00
/* We return NT_STATUS_INVALID_NETWORK_RESPONSE if the server is refusing
to negotiate schannel , but the creds were set up ok . That ' ll have to do . */
if ( ! netlogon_pipe ) {
if ( NT_STATUS_EQUAL ( ntret , NT_STATUS_INVALID_NETWORK_RESPONSE ) ) {
cli_shutdown ( cli ) ;
2007-09-17 19:34:22 +04:00
return NT_STATUS_OK ;
2006-02-23 00:18:23 +03:00
} else {
DEBUG ( 0 , ( " net_rpc_join_ok: failed to get schannel session "
" key from server %s for domain %s. Error was %s \n " ,
cli - > desthost , domain , nt_errstr ( ntret ) ) ) ;
cli_shutdown ( cli ) ;
2007-09-17 19:34:22 +04:00
return ntret ;
2006-02-23 00:18:23 +03:00
}
}
/* Only do the rest of the schannel test if the client is allowed to do this. */
if ( ! lp_client_schannel ( ) ) {
cli_shutdown ( cli ) ;
/* We're good... */
2007-09-17 19:34:22 +04:00
return ntret ;
2002-08-17 18:45:04 +04:00
}
2005-09-30 21:13:37 +04:00
2006-02-23 00:18:23 +03:00
pipe_hnd = cli_rpc_pipe_open_schannel_with_key ( cli , PI_NETLOGON ,
PIPE_AUTH_LEVEL_PRIVACY ,
domain , netlogon_pipe - > dc , & ntret ) ;
if ( ! pipe_hnd ) {
DEBUG ( 0 , ( " net_rpc_join_ok: failed to open schannel session "
" on netlogon pipe to server %s for domain %s. Error was %s \n " ,
cli - > desthost , domain , nt_errstr ( ntret ) ) ) ;
2007-09-17 19:34:22 +04:00
/*
* Note : here , we have :
* ( pipe_hnd ! = NULL ) if and only if NT_STATUS_IS_OK ( ntret )
*/
2006-02-23 00:18:23 +03:00
}
2002-08-17 18:45:04 +04:00
cli_shutdown ( cli ) ;
2007-09-17 19:34:22 +04:00
return ntret ;
2002-08-17 18:45:04 +04:00
}
2001-12-30 13:54:58 +03:00
/**
* Join a domain using the administrator username and password
*
* @ param argc Standard main ( ) style argc
* @ param argc Standard main ( ) style argv . Initial components are already
* stripped . Currently not used .
* @ return A shell status integer ( 0 for success )
*
* */
2001-12-04 08:03:03 +03:00
2002-03-16 01:10:19 +03:00
int net_rpc_join_newstyle ( int argc , const char * * argv )
2001-12-04 08:03:03 +03:00
{
/* libsmb variables */
struct cli_state * cli ;
TALLOC_CTX * mem_ctx ;
2003-04-21 18:09:03 +04:00
uint32 acb_info = ACB_WSTRUST ;
2008-01-17 12:11:11 +03:00
uint32 neg_flags = NETLOGON_NEG_SELECT_AUTH2_FLAGS | ( lp_client_schannel ( ) ? NETLOGON_NEG_SCHANNEL : 0 ) ;
2003-04-21 18:09:03 +04:00
uint32 sec_channel_type ;
2005-09-30 21:13:37 +04:00
struct rpc_pipe_client * pipe_hnd = NULL ;
2001-12-04 08:03:03 +03:00
/* rpc variables */
POLICY_HND lsa_pol , sam_pol , domain_pol , user_pol ;
2004-01-15 22:45:36 +03:00
DOM_SID * domain_sid ;
2001-12-04 08:03:03 +03:00
uint32 user_rid ;
/* Password stuff */
char * clear_trust_password = NULL ;
2003-04-21 18:09:03 +04:00
uchar pwbuf [ 516 ] ;
2001-12-04 08:03:03 +03:00
SAM_USERINFO_CTR ctr ;
SAM_USER_INFO_24 p24 ;
2005-07-19 04:59:25 +04:00
SAM_USER_INFO_16 p16 ;
2003-04-21 18:09:03 +04:00
uchar md4_trust_password [ 16 ] ;
2001-12-04 08:03:03 +03:00
/* Misc */
NTSTATUS result ;
int retval = 1 ;
2008-01-15 18:40:02 +03:00
const char * domain = NULL ;
2002-08-17 18:45:04 +04:00
char * acct_name ;
2008-02-01 16:21:54 +03:00
struct lsa_String lsa_acct_name ;
2008-01-24 00:54:02 +03:00
uint32 acct_flags = 0 ;
2008-02-01 16:21:54 +03:00
uint32_t access_granted = 0 ;
2008-02-08 04:12:30 +03:00
union lsa_PolicyInformation * info = NULL ;
2008-02-08 16:49:30 +03:00
struct samr_Ids user_rids ;
struct samr_Ids name_types ;
2003-04-21 18:09:03 +04:00
/* check what type of join */
if ( argc > = 0 ) {
sec_channel_type = get_sec_channel_type ( argv [ 0 ] ) ;
} else {
sec_channel_type = get_sec_channel_type ( NULL ) ;
}
switch ( sec_channel_type ) {
case SEC_CHAN_WKSTA :
acb_info = ACB_WSTRUST ;
2003-04-22 09:32:01 +04:00
break ;
2003-04-21 18:09:03 +04:00
case SEC_CHAN_BDC :
acb_info = ACB_SVRTRUST ;
2003-04-22 09:32:01 +04:00
break ;
2003-04-21 18:09:03 +04:00
#if 0
case SEC_CHAN_DOMAIN :
acb_info = ACB_DOMTRUST ;
2003-04-22 09:32:01 +04:00
break ;
2003-04-21 18:09:03 +04:00
# endif
}
2002-08-17 18:45:04 +04:00
2005-09-30 21:13:37 +04:00
/* Make authenticated connection to remote machine */
2001-12-04 08:03:03 +03:00
2007-09-17 19:11:20 +04:00
result = net_make_ipc_connection ( NET_FLAGS_PDC , & cli ) ;
if ( ! NT_STATUS_IS_OK ( result ) ) {
2001-12-04 08:03:03 +03:00
return 1 ;
2007-09-17 19:11:20 +04:00
}
2001-12-04 08:03:03 +03:00
2002-12-20 23:21:31 +03:00
if ( ! ( mem_ctx = talloc_init ( " net_rpc_join_newstyle " ) ) ) {
2001-12-04 08:03:03 +03:00
DEBUG ( 0 , ( " Could not initialise talloc context \n " ) ) ;
goto done ;
}
/* Fetch domain sid */
2005-09-30 21:13:37 +04:00
pipe_hnd = cli_rpc_pipe_open_noauth ( cli , PI_LSARPC , & result ) ;
if ( ! pipe_hnd ) {
DEBUG ( 0 , ( " Error connecting to LSA pipe. Error was %s \n " ,
nt_errstr ( result ) ) ) ;
2001-12-04 08:03:03 +03:00
goto done ;
}
2005-09-30 21:13:37 +04:00
CHECK_RPC_ERR ( rpccli_lsa_open_policy ( pipe_hnd , mem_ctx , True ,
2001-12-04 08:03:03 +03:00
SEC_RIGHTS_MAXIMUM_ALLOWED ,
& lsa_pol ) ,
" error opening lsa policy handle " ) ;
2008-02-08 04:12:30 +03:00
CHECK_RPC_ERR ( rpccli_lsa_QueryInfoPolicy ( pipe_hnd , mem_ctx ,
& lsa_pol ,
LSA_POLICY_INFO_ACCOUNT_DOMAIN ,
& info ) ,
2001-12-04 08:03:03 +03:00
" error querying info policy " ) ;
2008-02-08 04:12:30 +03:00
domain = info - > account_domain . name . string ;
domain_sid = info - > account_domain . sid ;
2006-09-21 02:49:02 +04:00
rpccli_lsa_Close ( pipe_hnd , mem_ctx , & lsa_pol ) ;
2005-09-30 21:13:37 +04:00
cli_rpc_pipe_close ( pipe_hnd ) ; /* Done with this pipe */
2001-12-04 08:03:03 +03:00
2006-03-09 21:35:57 +03:00
/* Bail out if domain didn't get set. */
if ( ! domain ) {
DEBUG ( 0 , ( " Could not get domain name. \n " ) ) ;
goto done ;
}
2001-12-04 08:03:03 +03:00
/* Create domain user */
2005-09-30 21:13:37 +04:00
pipe_hnd = cli_rpc_pipe_open_noauth ( cli , PI_SAMR , & result ) ;
if ( ! pipe_hnd ) {
DEBUG ( 0 , ( " Error connecting to SAM pipe. Error was %s \n " ,
nt_errstr ( result ) ) ) ;
2001-12-04 08:03:03 +03:00
goto done ;
}
2008-02-04 21:43:07 +03:00
CHECK_RPC_ERR ( rpccli_samr_Connect2 ( pipe_hnd , mem_ctx ,
pipe_hnd - > cli - > desthost ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
& sam_pol ) ,
2001-12-04 08:03:03 +03:00
" could not connect to SAM database " ) ;
2008-02-01 13:12:05 +03:00
CHECK_RPC_ERR ( rpccli_samr_OpenDomain ( pipe_hnd , mem_ctx ,
& sam_pol ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
domain_sid ,
& domain_pol ) ,
2001-12-04 08:03:03 +03:00
" could not open domain " ) ;
/* Create domain user */
2006-06-19 23:07:39 +04:00
if ( ( acct_name = talloc_asprintf ( mem_ctx , " %s$ " , global_myname ( ) ) ) = = NULL ) {
result = NT_STATUS_NO_MEMORY ;
goto done ;
}
2003-07-03 23:11:31 +04:00
strlower_m ( acct_name ) ;
2001-12-04 08:03:03 +03:00
2008-02-01 16:21:54 +03:00
init_lsa_String ( & lsa_acct_name , acct_name ) ;
2008-01-25 03:00:51 +03:00
acct_flags = SEC_GENERIC_READ | SEC_GENERIC_WRITE | SEC_GENERIC_EXECUTE |
SEC_STD_WRITE_DAC | SEC_STD_DELETE |
SAMR_USER_ACCESS_SET_PASSWORD |
SAMR_USER_ACCESS_GET_ATTRIBUTES |
SAMR_USER_ACCESS_SET_ATTRIBUTES ;
2008-01-24 00:54:02 +03:00
DEBUG ( 10 , ( " Creating account with flags: %d \n " , acct_flags ) ) ;
2008-01-25 03:00:51 +03:00
2008-02-01 16:21:54 +03:00
result = rpccli_samr_CreateUser2 ( pipe_hnd , mem_ctx ,
& domain_pol ,
& lsa_acct_name ,
acb_info ,
acct_flags ,
& user_pol ,
& access_granted ,
& user_rid ) ;
2001-12-04 08:03:03 +03:00
2001-12-11 15:29:03 +03:00
if ( ! NT_STATUS_IS_OK ( result ) & &
! NT_STATUS_EQUAL ( result , NT_STATUS_USER_EXISTS ) ) {
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Creation of workstation account failed \n " ) ;
2001-12-14 06:55:44 +03:00
/* If NT_STATUS_ACCESS_DENIED then we have a valid
username / password combo but the user does not have
administrator access . */
if ( NT_STATUS_V ( result ) = = NT_STATUS_V ( NT_STATUS_ACCESS_DENIED ) )
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " User specified does not have administrator privileges \n " ) ;
2001-12-14 06:55:44 +03:00
2001-12-11 15:29:03 +03:00
goto done ;
}
2001-12-14 05:17:18 +03:00
/* We *must* do this.... don't ask... */
2005-09-30 21:13:37 +04:00
if ( NT_STATUS_IS_OK ( result ) ) {
2008-01-30 14:39:20 +03:00
rpccli_samr_Close ( pipe_hnd , mem_ctx , & user_pol ) ;
2005-09-30 21:13:37 +04:00
}
2001-12-04 08:03:03 +03:00
2008-02-08 16:49:30 +03:00
CHECK_RPC_ERR_DEBUG ( rpccli_samr_LookupNames ( pipe_hnd , mem_ctx ,
& domain_pol ,
1 ,
& lsa_acct_name ,
& user_rids ,
& name_types ) ,
2001-12-11 15:29:03 +03:00
( " error looking up rid for user %s: %s \n " ,
2002-03-17 07:36:35 +03:00
acct_name , nt_errstr ( result ) ) ) ;
2001-12-04 08:03:03 +03:00
2008-02-08 16:49:30 +03:00
if ( name_types . ids [ 0 ] ! = SID_NAME_USER ) {
DEBUG ( 0 , ( " %s is not a user account (type=%d) \n " , acct_name , name_types . ids [ 0 ] ) ) ;
2001-12-04 08:03:03 +03:00
goto done ;
}
2008-02-08 16:49:30 +03:00
user_rid = user_rids . ids [ 0 ] ;
2001-12-11 15:29:03 +03:00
/* Open handle on user */
CHECK_RPC_ERR_DEBUG (
2008-02-01 13:57:53 +03:00
rpccli_samr_OpenUser ( pipe_hnd , mem_ctx ,
& domain_pol ,
SEC_RIGHTS_MAXIMUM_ALLOWED ,
user_rid ,
& user_pol ) ,
2001-12-11 15:29:03 +03:00
( " could not re-open existing user %s: %s \n " ,
2002-03-17 07:36:35 +03:00
acct_name , nt_errstr ( result ) ) ) ;
2001-12-11 15:29:03 +03:00
2001-12-04 08:03:03 +03:00
/* Create a random machine account password */
2001-12-05 04:59:32 +03:00
{
char * str ;
2001-12-05 14:00:26 +03:00
str = generate_random_str ( DEFAULT_TRUST_ACCOUNT_PASSWORD_LENGTH ) ;
2004-12-07 21:25:53 +03:00
clear_trust_password = SMB_STRDUP ( str ) ;
2003-04-21 18:09:03 +04:00
E_md4hash ( clear_trust_password , md4_trust_password ) ;
2001-12-05 04:59:32 +03:00
}
2004-01-26 11:45:02 +03:00
encode_pw_buffer ( pwbuf , clear_trust_password , STR_UNICODE ) ;
2001-12-04 08:03:03 +03:00
/* Set password on machine account */
ZERO_STRUCT ( ctr ) ;
ZERO_STRUCT ( p24 ) ;
init_sam_user_info24 ( & p24 , ( char * ) pwbuf , 24 ) ;
ctr . switch_value = 24 ;
ctr . info . id24 = & p24 ;
2005-09-30 21:13:37 +04:00
CHECK_RPC_ERR ( rpccli_samr_set_userinfo ( pipe_hnd , mem_ctx , & user_pol , 24 ,
2003-11-23 02:38:41 +03:00
& cli - > user_session_key , & ctr ) ,
2001-12-04 08:03:03 +03:00
" error setting trust account password " ) ;
/* Why do we have to try to (re-)set the ACB to be the same as what
we passed in the samr_create_dom_user ( ) call ? When a NT
workstation is joined to a domain by an administrator the
acb_info is set to 0x80 . For a normal user with " Add
workstations to the domain " rights the acb_info is 0x84. I'm
not sure whether it is supposed to make a difference or not . NT
seems to cope with either value so don ' t bomb out if the set
userinfo2 level 0x10 fails . - tpot */
ZERO_STRUCT ( ctr ) ;
2005-07-19 04:59:25 +04:00
ctr . switch_value = 16 ;
ctr . info . id16 = & p16 ;
2001-12-04 08:03:03 +03:00
2005-07-19 04:59:25 +04:00
init_sam_user_info16 ( & p16 , acb_info ) ;
2001-12-04 08:03:03 +03:00
/* Ignoring the return value is necessary for joining a domain
as a normal user with " Add workstation to domain " privilege . */
2005-09-30 21:13:37 +04:00
result = rpccli_samr_set_userinfo2 ( pipe_hnd , mem_ctx , & user_pol , 16 ,
2003-11-23 02:38:41 +03:00
& cli - > user_session_key , & ctr ) ;
2003-04-21 18:09:03 +04:00
2008-01-30 14:39:20 +03:00
rpccli_samr_Close ( pipe_hnd , mem_ctx , & user_pol ) ;
2005-09-30 21:13:37 +04:00
cli_rpc_pipe_close ( pipe_hnd ) ; /* Done with this pipe */
2003-04-21 18:09:03 +04:00
/* Now check the whole process from top-to-bottom */
2001-12-04 08:03:03 +03:00
2005-09-30 21:13:37 +04:00
pipe_hnd = cli_rpc_pipe_open_noauth ( cli , PI_NETLOGON , & result ) ;
if ( ! pipe_hnd ) {
DEBUG ( 0 , ( " Error connecting to NETLOGON pipe. Error was %s \n " ,
nt_errstr ( result ) ) ) ;
2003-04-21 18:09:03 +04:00
goto done ;
}
2005-09-30 21:13:37 +04:00
result = rpccli_netlogon_setup_creds ( pipe_hnd ,
2005-11-04 03:03:55 +03:00
cli - > desthost , /* server name */
domain , /* domain */
global_myname ( ) , /* client name */
global_myname ( ) , /* machine account name */
2005-09-30 21:13:37 +04:00
md4_trust_password ,
sec_channel_type ,
& neg_flags ) ;
if ( ! NT_STATUS_IS_OK ( result ) ) {
DEBUG ( 0 , ( " Error in domain join verification (credential setup failed): %s \n \n " ,
nt_errstr ( result ) ) ) ;
2003-06-16 19:59:05 +04:00
2005-09-30 21:13:37 +04:00
if ( NT_STATUS_EQUAL ( result , NT_STATUS_ACCESS_DENIED ) & &
( sec_channel_type = = SEC_CHAN_BDC ) ) {
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Please make sure that no computer account \n "
2005-09-30 21:13:37 +04:00
" named like this machine (%s) exists in the domain \n " ,
global_myname ( ) ) ;
}
goto done ;
}
2006-02-22 07:56:53 +03:00
/* We can only check the schannel connection if the client is allowed
to do this and the server supports it . If not , just assume success
( after all the rpccli_netlogon_setup_creds ( ) succeeded , and we ' ll
do the same again ( setup creds ) in net_rpc_join_ok ( ) . JRA . */
if ( lp_client_schannel ( ) & & ( neg_flags & NETLOGON_NEG_SCHANNEL ) ) {
struct rpc_pipe_client * netlogon_schannel_pipe =
cli_rpc_pipe_open_schannel_with_key ( cli ,
2005-09-30 21:13:37 +04:00
PI_NETLOGON ,
PIPE_AUTH_LEVEL_PRIVACY ,
domain ,
pipe_hnd - > dc ,
& result ) ;
2003-06-16 19:59:05 +04:00
2006-02-22 07:56:53 +03:00
if ( ! NT_STATUS_IS_OK ( result ) ) {
DEBUG ( 0 , ( " Error in domain join verification (schannel setup failed): %s \n \n " ,
nt_errstr ( result ) ) ) ;
2003-06-16 19:59:05 +04:00
2006-02-22 07:56:53 +03:00
if ( NT_STATUS_EQUAL ( result , NT_STATUS_ACCESS_DENIED ) & &
( sec_channel_type = = SEC_CHAN_BDC ) ) {
d_fprintf ( stderr , " Please make sure that no computer account \n "
" named like this machine (%s) exists in the domain \n " ,
global_myname ( ) ) ;
}
2003-06-16 19:59:05 +04:00
2006-02-22 07:56:53 +03:00
goto done ;
}
cli_rpc_pipe_close ( netlogon_schannel_pipe ) ;
2003-06-16 19:59:05 +04:00
}
2003-06-08 15:39:28 +04:00
2005-09-30 21:13:37 +04:00
cli_rpc_pipe_close ( pipe_hnd ) ;
2001-12-04 08:03:03 +03:00
/* Now store the secret in the secrets database */
2008-01-15 18:40:02 +03:00
strupper_m ( CONST_DISCARD ( char * , domain ) ) ;
2001-12-04 08:03:03 +03:00
2004-01-15 22:45:36 +03:00
if ( ! secrets_store_domain_sid ( domain , domain_sid ) ) {
2001-12-04 08:03:03 +03:00
DEBUG ( 0 , ( " error storing domain sid for %s \n " , domain ) ) ;
goto done ;
}
2007-03-13 23:53:38 +03:00
if ( ! secrets_store_machine_password ( clear_trust_password , domain , sec_channel_type ) ) {
2001-12-04 08:03:03 +03:00
DEBUG ( 0 , ( " error storing plaintext domain secrets for %s \n " , domain ) ) ;
}
2003-04-21 18:09:03 +04:00
/* double-check, connection from scratch */
2007-10-25 01:16:54 +04:00
result = net_rpc_join_ok ( domain , cli - > desthost , & cli - > dest_ss ) ;
2007-09-17 19:34:22 +04:00
retval = NT_STATUS_IS_OK ( result ) ? 0 : - 1 ;
2001-12-04 08:03:03 +03:00
done :
/* Display success or failure */
2006-03-09 21:35:57 +03:00
if ( domain ) {
if ( retval ! = 0 ) {
fprintf ( stderr , " Unable to join domain %s. \n " , domain ) ;
} else {
printf ( " Joined domain %s. \n " , domain ) ;
}
2001-12-04 08:03:03 +03:00
}
cli_shutdown ( cli ) ;
SAFE_FREE ( clear_trust_password ) ;
return retval ;
}
2002-08-17 18:45:04 +04:00
/**
* check that a join is OK
*
* @ return A shell status integer ( 0 for success )
*
* */
int net_rpc_testjoin ( int argc , const char * * argv )
{
2003-06-08 15:39:28 +04:00
char * domain = smb_xstrdup ( opt_target_workgroup ) ;
2007-09-17 19:34:22 +04:00
NTSTATUS nt_status ;
2002-08-17 18:45:04 +04:00
/* Display success or failure */
2007-09-17 19:34:22 +04:00
nt_status = net_rpc_join_ok ( domain , NULL , NULL ) ;
if ( ! NT_STATUS_IS_OK ( nt_status ) ) {
fprintf ( stderr , " Join to domain '%s' is not valid: %s \n " ,
nt_errstr ( nt_status ) , domain ) ;
2002-08-17 18:45:04 +04:00
free ( domain ) ;
return - 1 ;
}
printf ( " Join to '%s' is OK \n " , domain ) ;
free ( domain ) ;
return 0 ;
}