2008-05-08 11:14:16 +04:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
2001-10-19 20:51:26 +04:00
Copyright ( C ) 2001 Steve French ( sfrench @ us . ibm . com )
Copyright ( C ) 2001 Jim McDonough ( jmcd @ us . ibm . com )
2001-11-24 16:26:01 +03:00
Copyright ( C ) 2001 Andrew Tridgell ( tridge @ samba . org )
2001-12-03 07:39:23 +03:00
Copyright ( C ) 2001 Andrew Bartlett ( abartlet @ samba . org )
2008-05-10 01:22:12 +04:00
Copyright ( C ) 2008 Kai Blin ( kai @ samba . org )
2001-10-19 20:51:26 +04:00
2001-11-24 16:26:01 +03:00
Originally written by Steve and Jim . Largely rewritten by tridge in
November 2001.
2001-10-19 20:51:26 +04:00
2001-12-03 07:39:23 +03:00
Reworked again by abartlet in December 2001
2008-05-10 01:22:12 +04:00
Another overhaul , moving functionality into plug - ins loaded on demand by Kai
in May 2008.
2001-10-19 20:51:26 +04: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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2001-10-19 20:51:26 +04:00
( at your option ) any later version .
2008-05-08 11:14:16 +04:00
2001-10-19 20:51:26 +04:00
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 .
2008-05-08 11:14:16 +04:00
2001-10-19 20:51:26 +04:00
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/>. */
2008-05-08 11:14:16 +04:00
2001-10-19 20:51:26 +04:00
/*****************************************************/
/* */
/* Distributed SMB/CIFS Server Management Utility */
/* */
/* The intent was to make the syntax similar */
/* to the NET utility (first developed in DOS */
/* with additional interesting & useful functions */
/* added in later SMB server network operating */
/* systems). */
/* */
/*****************************************************/
2001-11-25 03:18:11 +03:00
# include "includes.h"
2004-10-07 08:01:18 +04:00
# include "utils/net.h"
2001-10-19 20:51:26 +04:00
2008-06-05 20:40:26 +04:00
extern bool AllowDebugChange ;
2008-05-14 11:01:53 +04:00
# ifdef WITH_FAKE_KASERVER
# include "utils/net_afs.h"
# endif
2008-05-08 11:14:16 +04:00
/***********************************************************************/
/* end of internationalization section */
/***********************************************************************/
2001-10-19 20:51:26 +04:00
2009-10-13 12:15:34 +04:00
enum netr_SchannelType get_sec_channel_type ( const char * param )
2003-04-21 18:09:03 +04:00
{
if ( ! ( param & & * param ) ) {
return get_default_sec_channel ( ) ;
} else {
2003-10-23 03:38:20 +04:00
if ( strequal ( param , " PDC " ) ) {
2003-04-21 18:09:03 +04:00
return SEC_CHAN_BDC ;
2003-10-23 03:38:20 +04:00
} else if ( strequal ( param , " BDC " ) ) {
2003-04-21 18:09:03 +04:00
return SEC_CHAN_BDC ;
2003-10-23 03:38:20 +04:00
} else if ( strequal ( param , " MEMBER " ) ) {
2003-04-21 18:09:03 +04:00
return SEC_CHAN_WKSTA ;
2008-05-08 11:14:16 +04:00
#if 0
2003-10-23 03:38:20 +04:00
} else if ( strequal ( param , " DOMAIN " ) ) {
2003-04-21 18:09:03 +04:00
return SEC_CHAN_DOMAIN ;
# endif
} else {
return get_default_sec_channel ( ) ;
}
}
}
2008-05-10 01:22:12 +04:00
static int net_changetrustpw ( struct net_context * c , int argc , const char * * argv )
2003-04-15 02:27:09 +04:00
{
2008-05-10 01:22:12 +04:00
if ( net_ads_check_our_domain ( c ) = = 0 )
return net_ads_changetrustpw ( c , argc , argv ) ;
2003-04-15 02:27:09 +04:00
2008-05-10 01:22:12 +04:00
return net_rpc_changetrustpw ( c , argc , argv ) ;
2003-04-15 02:27:09 +04:00
}
2006-05-31 02:10:09 +04:00
static void set_line_buffering ( FILE * f )
{
setvbuf ( f , NULL , _IOLBF , 0 ) ;
}
2008-05-10 01:22:12 +04:00
static int net_changesecretpw ( struct net_context * c , int argc ,
const char * * argv )
2003-08-29 00:24:25 +04:00
{
char * trust_pw ;
2009-10-13 12:15:34 +04:00
enum netr_SchannelType sec_channel_type = SEC_CHAN_WKSTA ;
2003-08-29 00:24:25 +04:00
2008-05-10 01:22:12 +04:00
if ( c - > opt_force ) {
if ( c - > opt_stdin ) {
2006-05-31 02:10:09 +04:00
set_line_buffering ( stdin ) ;
set_line_buffering ( stdout ) ;
set_line_buffering ( stderr ) ;
}
2006-07-11 22:01:26 +04:00
2009-07-29 22:07:47 +04:00
trust_pw = get_pass ( _ ( " Enter machine password: " ) , c - > opt_stdin ) ;
2003-08-29 00:24:25 +04:00
2007-03-13 23:53:38 +03:00
if ( ! secrets_store_machine_password ( trust_pw , lp_workgroup ( ) , sec_channel_type ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr ,
_ ( " Unable to write the machine account password in the secrets database " ) ) ;
2003-08-29 00:24:25 +04:00
return 1 ;
}
else {
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " Modified trust account password in secrets database \n " ) ) ;
2003-08-29 00:24:25 +04:00
}
}
else {
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " Machine account password change requires the -f flag. \n "
" Do NOT use this function unless you know what it does! \n "
" This function will change the ADS Domain member "
" machine account password in the secrets.tdb file! \n " ) ) ;
2003-08-29 00:24:25 +04:00
}
return 0 ;
}
2009-08-13 01:40:05 +04:00
/**
* @ brief Set the authorised user for winbindd access in secrets . tdb
*/
static int net_setauthuser ( struct net_context * c , int argc , const char * * argv )
{
const char * password = NULL ;
if ( ! secrets_init ( ) ) {
d_fprintf ( stderr , _ ( " Failed to open secrets.tdb. \n " ) ) ;
return 1 ;
}
/* Delete the settings. */
if ( argc > = 1 ) {
if ( strncmp ( argv [ 0 ] , " delete " , 6 ) ! = 0 ) {
d_fprintf ( stderr , _ ( " Usage: \n " ) ) ;
d_fprintf ( stderr ,
_ ( " net setauthuser -U user[%%password] \n "
" Set the auth user account to user "
" password. Prompt for password if not "
" specified. \n " ) ) ;
d_fprintf ( stderr ,
_ ( " net setauthuser delete \n "
" Delete the auth user setting. \n " ) ) ;
return 1 ;
}
secrets_delete ( SECRETS_AUTH_USER ) ;
secrets_delete ( SECRETS_AUTH_DOMAIN ) ;
secrets_delete ( SECRETS_AUTH_PASSWORD ) ;
return 0 ;
}
if ( ! c - > opt_user_specified ) {
d_fprintf ( stderr , _ ( " Usage: \n " ) ) ;
d_fprintf ( stderr ,
_ ( " net setauthuser -U user[%%password] \n "
" Set the auth user account to user "
" password. Prompt for password if not "
" specified. \n " ) ) ;
d_fprintf ( stderr ,
_ ( " net setauthuser delete \n "
" Delete the auth user setting. \n " ) ) ;
return 1 ;
}
password = net_prompt_pass ( c , _ ( " the auth user " ) ) ;
if ( password = = NULL ) {
d_fprintf ( stderr , _ ( " Failed to get the auth users password. \n " ) ) ;
return 1 ;
}
if ( ! secrets_store ( SECRETS_AUTH_USER , c - > opt_user_name ,
strlen ( c - > opt_user_name ) + 1 ) ) {
d_fprintf ( stderr , _ ( " error storing auth user name \n " ) ) ;
return 1 ;
}
if ( ! secrets_store ( SECRETS_AUTH_DOMAIN , c - > opt_workgroup ,
strlen ( c - > opt_workgroup ) + 1 ) ) {
d_fprintf ( stderr , _ ( " error storing auth user domain \n " ) ) ;
return 1 ;
}
if ( ! secrets_store ( SECRETS_AUTH_PASSWORD , password ,
strlen ( password ) + 1 ) ) {
d_fprintf ( stderr , _ ( " error storing auth user password \n " ) ) ;
return 1 ;
}
return 0 ;
}
/**
* @ brief Get the auth user settings
*/
static int net_getauthuser ( struct net_context * c , int argc , const char * * argv )
{
char * user , * domain , * password ;
/* Lift data from secrets file */
secrets_fetch_ipc_userpass ( & user , & domain , & password ) ;
if ( ( ! user | | ! * user ) & & ( ! domain | | ! * domain ) & &
( ! password | | ! * password ) ) {
SAFE_FREE ( user ) ;
SAFE_FREE ( domain ) ;
SAFE_FREE ( password ) ;
d_printf ( _ ( " No authorised user configured \n " ) ) ;
return 0 ;
}
/* Pretty print authorised user info */
d_printf ( " %s%s%s%s%s \n " , domain ? domain : " " ,
domain ? lp_winbind_separator ( ) : " " , user ,
password ? " % " : " " , password ? password : " " ) ;
SAFE_FREE ( user ) ;
SAFE_FREE ( domain ) ;
SAFE_FREE ( password ) ;
return 0 ;
}
2002-09-25 19:19:00 +04:00
/*
Retrieve our local SID or the SID for the specified name
*/
2008-05-10 01:22:12 +04:00
static int net_getlocalsid ( struct net_context * c , int argc , const char * * argv )
2002-09-25 19:19:00 +04:00
{
DOM_SID sid ;
const char * name ;
fstring sid_str ;
if ( argc > = 1 ) {
name = argv [ 0 ] ;
}
else {
2002-11-13 02:20:50 +03:00
name = global_myname ( ) ;
2002-09-25 19:19:00 +04:00
}
2008-05-12 13:53:23 +04:00
if ( ! initialize_password_db ( false , NULL ) ) {
2004-02-26 01:01:02 +03:00
DEBUG ( 0 , ( " WARNING: Could not open passdb - local sid may not reflect passdb \n "
2007-10-03 16:55:45 +04:00
" backend knowledge (such as the sid stored in LDAP) \n " ) ) ;
2004-02-26 01:01:02 +03:00
}
2004-11-15 20:20:58 +03:00
/* first check to see if we can even access secrets, so we don't
panic when we can ' t . */
if ( ! secrets_init ( ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr ,
_ ( " Unable to open secrets.tdb. Can't fetch domain "
" SID for name: %s \n " ) , name ) ;
2004-11-15 20:20:58 +03:00
return 1 ;
}
2004-02-26 02:12:29 +03:00
/* Generate one, if it doesn't exist */
get_global_sam_sid ( ) ;
2002-09-25 19:19:00 +04:00
if ( ! secrets_fetch_domain_sid ( name , & sid ) ) {
2004-11-15 20:20:58 +03:00
DEBUG ( 0 , ( " Can't fetch domain SID for name: %s \n " , name ) ) ;
2002-09-25 19:19:00 +04:00
return 1 ;
}
2007-12-16 00:47:30 +03:00
sid_to_fstring ( sid_str , & sid ) ;
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " SID for domain %s is: %s \n " ) , name , sid_str ) ;
2002-09-25 19:19:00 +04:00
return 0 ;
}
2008-05-10 01:22:12 +04:00
static int net_setlocalsid ( struct net_context * c , int argc , const char * * argv )
2002-09-25 19:19:00 +04:00
{
DOM_SID sid ;
if ( ( argc ! = 1 )
| | ( strncmp ( argv [ 0 ] , " S-1-5-21- " , strlen ( " S-1-5-21- " ) ) ! = 0 )
| | ( ! string_to_sid ( & sid , argv [ 0 ] ) )
| | ( sid . num_auths ! = 4 ) ) {
2010-01-19 13:43:54 +03:00
d_printf ( _ ( " Usage: " ) ) ;
d_printf ( " net setlocalsid S-1-5-21-x-y-z \n " ) ;
2002-09-25 19:19:00 +04:00
return 1 ;
}
2002-11-13 02:20:50 +03:00
if ( ! secrets_store_domain_sid ( global_myname ( ) , & sid ) ) {
2002-09-25 19:19:00 +04:00
DEBUG ( 0 , ( " Can't store domain SID as a pdc/bdc. \n " ) ) ;
return 1 ;
}
return 0 ;
}
2008-05-10 01:22:12 +04:00
static int net_setdomainsid ( struct net_context * c , int argc , const char * * argv )
2006-05-16 21:40:28 +04:00
{
DOM_SID sid ;
if ( ( argc ! = 1 )
| | ( strncmp ( argv [ 0 ] , " S-1-5-21- " , strlen ( " S-1-5-21- " ) ) ! = 0 )
| | ( ! string_to_sid ( & sid , argv [ 0 ] ) )
| | ( sid . num_auths ! = 4 ) ) {
2010-01-19 13:43:54 +03:00
d_printf ( _ ( " Usage: " ) ) ;
d_printf ( " net setdomainsid S-1-5-21-x-y-z \n " ) ;
2006-05-16 21:40:28 +04:00
return 1 ;
}
if ( ! secrets_store_domain_sid ( lp_workgroup ( ) , & sid ) ) {
DEBUG ( 0 , ( " Can't store domain SID. \n " ) ) ;
return 1 ;
}
return 0 ;
}
2008-05-10 01:22:12 +04:00
static int net_getdomainsid ( struct net_context * c , int argc , const char * * argv )
2002-09-25 19:19:00 +04:00
{
DOM_SID domain_sid ;
fstring sid_str ;
2007-12-06 15:54:45 +03:00
if ( argc > 0 ) {
2010-01-19 13:43:54 +03:00
d_printf ( _ ( " Usage: " ) ) ;
d_printf ( " net getdomainsid \n " ) ;
2007-12-06 15:54:45 +03:00
return 1 ;
}
2008-05-12 13:53:23 +04:00
if ( ! initialize_password_db ( false , NULL ) ) {
2007-12-06 15:54:45 +03:00
DEBUG ( 0 , ( " WARNING: Could not open passdb - domain SID may "
2007-12-03 12:45:47 +03:00
" not reflect passdb \n "
2007-12-06 15:54:45 +03:00
" backend knowledge (such as the SID stored in "
2007-12-03 12:45:47 +03:00
" LDAP) \n " ) ) ;
2007-10-03 16:55:45 +04:00
}
/* first check to see if we can even access secrets, so we don't
panic when we can ' t . */
if ( ! secrets_init ( ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " Unable to open secrets.tdb. Can't fetch "
" domain SID for name: %s \n " ) ,
get_global_sam_name ( ) ) ;
2007-10-03 16:55:45 +04:00
return 1 ;
2004-02-26 01:01:02 +03:00
}
2004-02-26 02:12:29 +03:00
/* Generate one, if it doesn't exist */
get_global_sam_sid ( ) ;
2002-11-13 02:20:50 +03:00
if ( ! secrets_fetch_domain_sid ( global_myname ( ) , & domain_sid ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " Could not fetch local SID \n " ) ) ;
2002-09-25 19:19:00 +04:00
return 1 ;
}
2007-12-16 00:47:30 +03:00
sid_to_fstring ( sid_str , & domain_sid ) ;
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " SID for local machine %s is: %s \n " ) ,
global_myname ( ) , sid_str ) ;
2002-09-25 19:19:00 +04:00
2008-05-10 01:22:12 +04:00
if ( ! secrets_fetch_domain_sid ( c - > opt_workgroup , & domain_sid ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " Could not fetch domain SID \n " ) ) ;
2002-09-25 19:19:00 +04:00
return 1 ;
}
2007-12-16 00:47:30 +03:00
sid_to_fstring ( sid_str , & domain_sid ) ;
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " SID for domain %s is: %s \n " ) , c - > opt_workgroup , sid_str ) ;
2002-09-25 19:19:00 +04:00
return 0 ;
}
2007-10-19 04:40:25 +04:00
static bool search_maxrid ( struct pdb_search * search , const char * type ,
2005-04-10 19:26:37 +04:00
uint32 * max_rid )
2003-01-15 20:22:48 +03:00
{
2005-04-10 19:26:37 +04:00
struct samr_displayentry * entries ;
uint32 i , num_entries ;
2003-01-15 20:22:48 +03:00
2005-04-10 19:26:37 +04:00
if ( search = = NULL ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " get_maxrid: Could not search %s \n " ) , type ) ;
2008-05-12 13:53:23 +04:00
return false ;
2003-01-15 20:22:48 +03:00
}
2005-04-10 19:26:37 +04:00
num_entries = pdb_search_entries ( search , 0 , 0xffffffff , & entries ) ;
for ( i = 0 ; i < num_entries ; i + + )
* max_rid = MAX ( * max_rid , entries [ i ] . rid ) ;
2009-02-12 19:48:52 +03:00
TALLOC_FREE ( search ) ;
2008-05-12 13:53:23 +04:00
return true ;
2005-04-10 19:26:37 +04:00
}
2003-01-15 20:22:48 +03:00
2005-04-10 19:26:37 +04:00
static uint32 get_maxrid ( void )
{
uint32 max_rid = 0 ;
2003-01-15 20:22:48 +03:00
2009-02-12 19:48:52 +03:00
if ( ! search_maxrid ( pdb_search_users ( talloc_tos ( ) , 0 ) , " users " , & max_rid ) )
2005-04-10 19:26:37 +04:00
return 0 ;
2003-01-15 20:22:48 +03:00
2009-02-12 19:48:52 +03:00
if ( ! search_maxrid ( pdb_search_groups ( talloc_tos ( ) ) , " groups " , & max_rid ) )
2005-04-10 19:26:37 +04:00
return 0 ;
2003-01-15 20:22:48 +03:00
2009-02-12 19:48:52 +03:00
if ( ! search_maxrid ( pdb_search_aliases ( talloc_tos ( ) ,
get_global_sam_sid ( ) ) ,
2005-04-10 19:26:37 +04:00
" aliases " , & max_rid ) )
return 0 ;
2008-05-08 11:14:16 +04:00
2003-01-15 20:22:48 +03:00
return max_rid ;
}
2008-05-10 01:22:12 +04:00
static int net_maxrid ( struct net_context * c , int argc , const char * * argv )
2003-01-15 20:22:48 +03:00
{
uint32 rid ;
if ( argc ! = 0 ) {
2010-01-19 13:43:54 +03:00
d_fprintf ( stderr , " %s net maxrid \n " , _ ( " Usage: " ) ) ;
2003-01-15 20:22:48 +03:00
return 1 ;
}
if ( ( rid = get_maxrid ( ) ) = = 0 ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " can't get current maximum rid \n " ) ) ;
2003-01-15 20:22:48 +03:00
return 1 ;
}
2009-07-29 22:07:47 +04:00
d_printf ( _ ( " Currently used maximum rid: %d \n " ) , rid ) ;
2003-01-15 20:22:48 +03:00
return 0 ;
}
2001-11-24 16:26:01 +03:00
/* main function table */
2008-06-07 04:25:08 +04:00
static struct functable net_func [ ] = {
2008-05-26 00:41:58 +04:00
{
" rpc " ,
net_rpc ,
NET_TRANSPORT_RPC ,
2009-07-29 22:07:47 +04:00
N_ ( " Run functions using RPC transport " ) ,
N_ ( " Use 'net help rpc' to get more extensive information "
" about 'net rpc' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" rap " ,
net_rap ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Run functions using RAP transport " ) ,
N_ ( " Use 'net help rap' to get more extensive information "
" about 'net rap' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" ads " ,
net_ads ,
NET_TRANSPORT_ADS ,
2009-07-29 22:07:47 +04:00
N_ ( " Run functions using ADS transport " ) ,
N_ ( " Use 'net help ads' to get more extensive information "
" about 'net ads' commands. " )
2008-05-26 00:41:58 +04:00
} ,
2001-12-11 01:25:21 +03:00
/* eventually these should auto-choose the transport ... */
2008-05-26 00:41:58 +04:00
{
" file " ,
net_file ,
NET_TRANSPORT_RPC | NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Functions on remote opened files " ) ,
N_ ( " Use 'net help file' to get more information about 'net "
" file' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" share " ,
net_share ,
NET_TRANSPORT_RPC | NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Functions on shares " ) ,
N_ ( " Use 'net help share' to get more information about 'net "
" share' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" session " ,
net_rap_session ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage sessions " ) ,
N_ ( " Use 'net help session' to get more information about "
" 'net session' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" server " ,
net_rap_server ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " List servers in workgroup " ) ,
N_ ( " Use 'net help server' to get more information about 'net "
" server' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" domain " ,
net_rap_domain ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " List domains/workgroups on network " ) ,
N_ ( " Use 'net help domain' to get more information about 'net "
" domain' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" printq " ,
net_rap_printq ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Modify printer queue " ) ,
N_ ( " Use 'net help printq' to get more information about 'net "
" printq' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" user " ,
net_user ,
NET_TRANSPORT_ADS | NET_TRANSPORT_RPC | NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage users " ) ,
N_ ( " Use 'net help user' to get more information about 'net "
" user' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" group " ,
net_group ,
NET_TRANSPORT_ADS | NET_TRANSPORT_RPC | NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage groups " ) ,
N_ ( " Use 'net help group' to get more information about 'net "
" group' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" groupmap " ,
net_groupmap ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage group mappings " ) ,
N_ ( " Use 'net help groupmap' to get more information about "
" 'net groupmap' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" sam " ,
net_sam ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Functions on the SAM database " ) ,
N_ ( " Use 'net help sam' to get more information about 'net "
" sam' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" validate " ,
net_rap_validate ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Validate username and password " ) ,
N_ ( " Use 'net help validate' to get more information about "
" 'net validate' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" groupmember " ,
net_rap_groupmember ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Modify group memberships " ) ,
N_ ( " Use 'net help groupmember' to get more information about "
" 'net groupmember' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " admin " ,
net_rap_admin ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Execute remote command on a remote OS/2 server " ) ,
N_ ( " Use 'net help admin' to get more information about 'net "
" admin' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " service " ,
net_rap_service ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " List/modify running services " ) ,
N_ ( " Use 'net help service' to get more information about "
" 'net service' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{
" password " ,
net_rap_password ,
NET_TRANSPORT_RAP ,
2009-07-29 22:07:47 +04:00
N_ ( " Change user password on target server " ) ,
N_ ( " Use 'net help password' to get more information about "
" 'net password' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " changetrustpw " ,
net_changetrustpw ,
NET_TRANSPORT_ADS | NET_TRANSPORT_RPC ,
2009-07-29 22:07:47 +04:00
N_ ( " Change the trust password " ) ,
N_ ( " Use 'net help changetrustpw' to get more information "
" about 'net changetrustpw'. " )
2008-05-26 00:41:58 +04:00
} ,
{ " changesecretpw " ,
net_changesecretpw ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Change the secret password " ) ,
N_ ( " net [options] changesecretpw \n "
" Change the ADS domain member machine account password "
" in secrets.tdb. \n "
" Do NOT use this function unless you know what it does. \n "
" Requires the -f flag to work. " )
2008-05-26 00:41:58 +04:00
} ,
2009-08-13 01:40:05 +04:00
{
" setauthuser " ,
net_setauthuser ,
NET_TRANSPORT_LOCAL ,
N_ ( " Set the winbind auth user " ) ,
N_ ( " net -U user[%%password] [-W domain] setauthuser \n "
" Set the auth user, password (and optionally domain \n "
" Will prompt for password if not given. \n "
" net setauthuser delete \n "
" Delete the existing auth user settings. " )
} ,
{
" getauthuser " ,
net_getauthuser ,
NET_TRANSPORT_LOCAL ,
N_ ( " Get the winbind auth user settings " ) ,
N_ ( " net getauthuser \n "
" Get the current winbind auth user settings. " )
} ,
2008-05-26 00:41:58 +04:00
{ " time " ,
net_time ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Show/set time " ) ,
N_ ( " Use 'net help time' to get more information about 'net "
" time' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " lookup " ,
net_lookup ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Look up host names/IP addresses " ) ,
N_ ( " Use 'net help lookup' to get more information about 'net "
" lookup' commands. " )
2008-05-26 00:41:58 +04:00
} ,
2009-10-25 18:12:12 +03:00
{ " g_lock " ,
net_g_lock ,
NET_TRANSPORT_LOCAL ,
N_ ( " Manipulate the global lock table " ) ,
N_ ( " Use 'net help g_lock' to get more information about "
" 'net g_lock' commands. " )
} ,
2008-05-26 00:41:58 +04:00
{ " join " ,
net_join ,
NET_TRANSPORT_ADS | NET_TRANSPORT_RPC ,
2009-07-29 22:07:47 +04:00
N_ ( " Join a domain/AD " ) ,
N_ ( " Use 'net help join' to get more information about 'net "
" join'. " )
2008-05-26 00:41:58 +04:00
} ,
{ " dom " ,
net_dom ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Join/unjoin (remote) machines to/from a domain/AD " ) ,
N_ ( " Use 'net help dom' to get more information about 'net "
" dom' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " cache " ,
net_cache ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Operate on the cache tdb file " ) ,
N_ ( " Use 'net help cache' to get more information about 'net "
" cache' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " getlocalsid " ,
net_getlocalsid ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Get the SID for the local domain " ) ,
N_ ( " net getlocalsid " )
2008-05-26 00:41:58 +04:00
} ,
{ " setlocalsid " ,
net_setlocalsid ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Set the SID for the local domain " ) ,
N_ ( " net setlocalsid S-1-5-21-x-y-z " )
2008-05-26 00:41:58 +04:00
} ,
{ " setdomainsid " ,
net_setdomainsid ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Set domain SID on member servers " ) ,
N_ ( " net setdomainsid S-1-5-21-x-y-z " )
2008-05-26 00:41:58 +04:00
} ,
{ " getdomainsid " ,
net_getdomainsid ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Get domain SID on member servers " ) ,
N_ ( " net getdomainsid " )
2008-05-26 00:41:58 +04:00
} ,
{ " maxrid " ,
net_maxrid ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Display the maximul RID currently used " ) ,
N_ ( " net maxrid " )
2008-05-26 00:41:58 +04:00
} ,
{ " idmap " ,
net_idmap ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " IDmap functions " ) ,
N_ ( " Use 'net help idmap to get more information about 'net "
" idmap' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " status " ,
net_status ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Display server status " ) ,
N_ ( " Use 'net help status' to get more information about 'net "
" status' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " usershare " ,
net_usershare ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage user-modifiable shares " ) ,
N_ ( " Use 'net help usershare to get more information about "
" 'net usershare' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " usersidlist " ,
net_usersidlist ,
NET_TRANSPORT_RPC ,
2009-07-29 22:07:47 +04:00
N_ ( " Display list of all users with SID " ) ,
N_ ( " Use 'net help usersidlist' to get more information about "
" 'net usersidlist'. " )
2008-05-26 00:41:58 +04:00
} ,
{ " conf " ,
net_conf ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage Samba registry based configuration " ) ,
N_ ( " Use 'net help conf' to get more information about 'net "
" conf' commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ " registry " ,
net_registry ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage the Samba registry " ) ,
N_ ( " Use 'net help registry' to get more information about "
" 'net registry' commands. " )
2008-05-26 00:41:58 +04:00
} ,
2009-01-23 17:00:17 +03:00
{ " eventlog " ,
net_eventlog ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Process Win32 *.evt eventlog files " ) ,
N_ ( " Use 'net help eventlog' to get more information about "
" 'net eventlog' commands. " )
2009-01-23 17:00:17 +03:00
} ,
2003-09-07 20:36:13 +04:00
# ifdef WITH_FAKE_KASERVER
2008-05-26 00:41:58 +04:00
{ " afs " ,
net_afs ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Manage AFS tokens " ) ,
N_ ( " Use 'net help afs' to get more information about 'net "
" afs' commands. " )
2008-05-26 00:41:58 +04:00
} ,
2003-09-07 20:36:13 +04:00
# endif
2001-12-11 01:25:21 +03:00
2008-05-26 00:41:58 +04:00
{ " help " ,
net_help ,
NET_TRANSPORT_LOCAL ,
2009-07-29 22:07:47 +04:00
N_ ( " Print usage information " ) ,
N_ ( " Use 'net help help' to list usage information for 'net' "
" commands. " )
2008-05-26 00:41:58 +04:00
} ,
{ NULL , NULL , 0 , NULL , NULL }
2001-11-24 16:26:01 +03:00
} ;
2001-11-13 01:50:48 +03:00
2001-10-19 20:51:26 +04:00
/****************************************************************************
main program
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-11-26 08:59:43 +03:00
int main ( int argc , const char * * argv )
2001-10-19 20:51:26 +04:00
{
2001-11-24 16:26:01 +03:00
int opt , i ;
2009-07-05 11:21:07 +04:00
char * p ;
2001-11-24 16:26:01 +03:00
int rc = 0 ;
int argc_new = 0 ;
const char * * argv_new ;
poptContext pc ;
2008-05-10 01:22:12 +04:00
TALLOC_CTX * frame = talloc_stackframe ( ) ;
struct net_context * c = talloc_zero ( frame , struct net_context ) ;
2001-11-24 16:26:01 +03:00
struct poptOption long_options [ ] = {
2002-03-15 23:03:07 +03:00
{ " help " , ' h ' , POPT_ARG_NONE , 0 , ' h ' } ,
2008-05-10 01:22:12 +04:00
{ " workgroup " , ' w ' , POPT_ARG_STRING , & c - > opt_target_workgroup } ,
2009-07-05 11:21:07 +04:00
{ " user " , ' U ' , POPT_ARG_STRING , & c - > opt_user_name , ' U ' } ,
2002-03-15 23:03:07 +03:00
{ " ipaddress " , ' I ' , POPT_ARG_STRING , 0 , ' I ' } ,
2008-05-10 01:22:12 +04:00
{ " port " , ' p ' , POPT_ARG_INT , & c - > opt_port } ,
{ " myname " , ' n ' , POPT_ARG_STRING , & c - > opt_requester_name } ,
{ " server " , ' S ' , POPT_ARG_STRING , & c - > opt_host } ,
2009-07-29 22:07:47 +04:00
{ " encrypt " , ' e ' , POPT_ARG_NONE , NULL , ' e ' , N_ ( " Encrypt SMB transport (UNIX extended servers only) " ) } ,
2008-05-10 01:22:12 +04:00
{ " container " , ' c ' , POPT_ARG_STRING , & c - > opt_container } ,
{ " comment " , ' C ' , POPT_ARG_STRING , & c - > opt_comment } ,
{ " maxusers " , ' M ' , POPT_ARG_INT , & c - > opt_maxusers } ,
{ " flags " , ' F ' , POPT_ARG_INT , & c - > opt_flags } ,
{ " long " , ' l ' , POPT_ARG_NONE , & c - > opt_long_list_entries } ,
{ " reboot " , ' r ' , POPT_ARG_NONE , & c - > opt_reboot } ,
{ " force " , ' f ' , POPT_ARG_NONE , & c - > opt_force } ,
{ " stdin " , ' i ' , POPT_ARG_NONE , & c - > opt_stdin } ,
{ " timeout " , ' t ' , POPT_ARG_INT , & c - > opt_timeout } ,
2009-03-26 22:32:55 +03:00
{ " request-timeout " , 0 , POPT_ARG_INT , & c - > opt_request_timeout } ,
2009-07-05 11:21:07 +04:00
{ " machine-pass " , ' P ' , POPT_ARG_NONE , & c - > opt_machine_pass } ,
{ " kerberos " , ' k ' , POPT_ARG_NONE , & c - > opt_kerberos } ,
2008-05-10 01:22:12 +04:00
{ " myworkgroup " , ' W ' , POPT_ARG_STRING , & c - > opt_workgroup } ,
2010-01-24 20:50:48 +03:00
{ " use-ccache " , 0 , POPT_ARG_NONE , & c - > opt_ccache } ,
2008-05-10 01:22:12 +04:00
{ " verbose " , ' v ' , POPT_ARG_NONE , & c - > opt_verbose } ,
{ " test " , ' T ' , POPT_ARG_NONE , & c - > opt_testmode } ,
2004-02-26 14:29:56 +03:00
/* Options for 'net groupmap set' */
2008-05-10 01:22:12 +04:00
{ " local " , ' L ' , POPT_ARG_NONE , & c - > opt_localgroup } ,
{ " domain " , ' D ' , POPT_ARG_NONE , & c - > opt_domaingroup } ,
2009-07-05 11:21:07 +04:00
{ " ntname " , ' N ' , POPT_ARG_STRING , & c - > opt_newntname } ,
2008-05-10 01:22:12 +04:00
{ " rid " , ' R ' , POPT_ARG_INT , & c - > opt_rid } ,
2004-08-10 18:27:17 +04:00
/* Options for 'net rpc share migrate' */
2008-05-10 01:22:12 +04:00
{ " acls " , 0 , POPT_ARG_NONE , & c - > opt_acls } ,
{ " attrs " , 0 , POPT_ARG_NONE , & c - > opt_attrs } ,
{ " timestamps " , 0 , POPT_ARG_NONE , & c - > opt_timestamps } ,
{ " exclude " , ' X ' , POPT_ARG_STRING , & c - > opt_exclude } ,
{ " destination " , 0 , POPT_ARG_STRING , & c - > opt_destination } ,
{ " tallocreport " , 0 , POPT_ARG_NONE , & c - > do_talloc_report } ,
2008-07-30 00:52:59 +04:00
/* Options for 'net rpc vampire (keytab)' */
2008-07-30 19:46:13 +04:00
{ " force-full-repl " , 0 , POPT_ARG_NONE , & c - > opt_force_full_repl } ,
2008-08-01 01:05:45 +04:00
{ " single-obj-repl " , 0 , POPT_ARG_NONE , & c - > opt_single_obj_repl } ,
2008-08-01 02:12:18 +04:00
{ " clean-old-entries " , 0 , POPT_ARG_NONE , & c - > opt_clean_old_entries } ,
2004-02-26 14:29:56 +03:00
2003-04-14 07:59:04 +04:00
POPT_COMMON_SAMBA
2001-11-24 16:26:01 +03:00
{ 0 , 0 , 0 , 0 }
} ;
2008-12-03 10:29:57 +03:00
zero_sockaddr ( & c - > opt_dest_ip ) ;
2001-11-24 16:26:01 +03:00
2005-12-29 00:10:11 +03:00
load_case_tables ( ) ;
2009-07-29 22:07:47 +04:00
setlocale ( LC_ALL , " " ) ;
2009-08-13 04:44:48 +04:00
# if defined(HAVE_BINDTEXTDOMAIN)
2009-07-29 22:07:47 +04:00
bindtextdomain ( MODULE_NAME , dyn_LOCALEDIR ) ;
2009-08-13 04:44:48 +04:00
# endif
# if defined(HAVE_TEXTDOMAIN)
2009-07-29 22:07:47 +04:00
textdomain ( MODULE_NAME ) ;
2009-08-13 04:44:48 +04:00
# endif
2009-07-29 22:07:47 +04:00
2003-07-19 04:23:08 +04:00
/* set default debug level to 0 regardless of what smb.conf sets */
DEBUGLEVEL_CLASS [ DBGC_ALL ] = 0 ;
2001-12-20 10:13:47 +03:00
dbf = x_stderr ;
2008-06-21 02:07:21 +04:00
c - > private_data = net_func ;
2008-05-08 11:14:16 +04:00
pc = poptGetContext ( NULL , argc , ( const char * * ) argv , long_options ,
2001-11-24 16:26:01 +03:00
POPT_CONTEXT_KEEP_FIRST ) ;
2008-05-08 11:14:16 +04:00
2001-11-24 16:26:01 +03:00
while ( ( opt = poptGetNextOpt ( pc ) ) ! = - 1 ) {
switch ( opt ) {
case ' h ' :
2008-05-26 00:41:58 +04:00
c - > display_usage = true ;
2009-07-05 11:21:07 +04:00
break ;
case ' e ' :
c - > smb_encrypt = true ;
2008-01-05 11:23:35 +03:00
break ;
2001-11-24 16:26:01 +03:00
case ' I ' :
2008-05-10 01:22:12 +04:00
if ( ! interpret_string_addr ( & c - > opt_dest_ip ,
2007-10-25 01:16:54 +04:00
poptGetOptArg ( pc ) , 0 ) ) {
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " \n Invalid ip address specified \n " ) ) ;
2007-10-25 01:16:54 +04:00
} else {
2008-05-10 01:22:12 +04:00
c - > opt_have_ip = true ;
2007-10-25 01:16:54 +04:00
}
2001-11-24 16:26:01 +03:00
break ;
2009-07-05 11:21:07 +04:00
case ' U ' :
c - > opt_user_specified = true ;
c - > opt_user_name = SMB_STRDUP ( c - > opt_user_name ) ;
p = strchr ( c - > opt_user_name , ' % ' ) ;
if ( p ) {
* p = 0 ;
c - > opt_password = p + 1 ;
}
break ;
2001-11-24 16:26:01 +03:00
default :
2009-07-29 22:07:47 +04:00
d_fprintf ( stderr , _ ( " \n Invalid option %s: %s \n " ) ,
2003-01-21 17:08:33 +03:00
poptBadOption ( pc , 0 ) , poptStrerror ( opt ) ) ;
2008-05-10 01:22:12 +04:00
net_help ( c , argc , argv ) ;
2002-07-15 14:35:28 +04:00
exit ( 1 ) ;
2001-11-24 16:26:01 +03:00
}
2001-10-23 18:16:59 +04:00
}
2008-05-08 11:14:16 +04:00
2003-07-19 04:23:08 +04:00
/*
* Don ' t load debug level from smb . conf . It should be
* set by cmdline arg or remain default ( 0 )
*/
2008-06-05 20:40:26 +04:00
AllowDebugChange = false ;
2008-05-10 01:22:12 +04:00
lp_load ( get_dyn_CONFIGFILE ( ) , true , false , false , true ) ;
2008-05-08 11:14:16 +04:00
2003-07-19 04:23:08 +04:00
argv_new = ( const char * * ) poptGetArgs ( pc ) ;
2001-10-19 20:51:26 +04:00
2001-11-24 16:26:01 +03:00
argc_new = argc ;
for ( i = 0 ; i < argc ; i + + ) {
if ( argv_new [ i ] = = NULL ) {
argc_new = i ;
break ;
}
}
2002-07-15 14:35:28 +04:00
2008-05-10 01:22:12 +04:00
if ( c - > do_talloc_report ) {
2006-07-11 22:01:26 +04:00
talloc_enable_leak_report ( ) ;
}
2008-05-10 01:22:12 +04:00
if ( c - > opt_requester_name ) {
set_global_myname ( c - > opt_requester_name ) ;
2001-11-24 16:26:01 +03:00
}
2009-07-05 11:21:07 +04:00
if ( ! c - > opt_user_name & & getenv ( " LOGNAME " ) ) {
c - > opt_user_name = getenv ( " LOGNAME " ) ;
}
2008-05-10 01:22:12 +04:00
if ( ! c - > opt_workgroup ) {
c - > opt_workgroup = smb_xstrdup ( lp_workgroup ( ) ) ;
2001-11-24 16:26:01 +03:00
}
2008-05-08 11:14:16 +04:00
2008-05-10 01:22:12 +04:00
if ( ! c - > opt_target_workgroup ) {
c - > opt_target_workgroup = smb_xstrdup ( lp_workgroup ( ) ) ;
2001-12-04 07:48:01 +03:00
}
2008-05-08 11:14:16 +04:00
2002-11-13 02:20:50 +03:00
if ( ! init_names ( ) )
exit ( 1 ) ;
2001-12-05 14:00:26 +03:00
2001-11-24 16:26:01 +03:00
load_interfaces ( ) ;
2008-05-08 11:14:16 +04:00
/* this makes sure that when we do things like call scripts,
2010-03-03 18:03:13 +03:00
that it won ' t assert because we are not root */
2003-06-14 04:49:02 +04:00
sec_init ( ) ;
2001-10-19 20:51:26 +04:00
2009-07-05 11:21:07 +04:00
if ( c - > opt_machine_pass ) {
/* it is very useful to be able to make ads queries as the
machine account for testing purposes and for domain leave */
net_use_krb_machine_account ( c ) ;
}
if ( ! c - > opt_password ) {
c - > opt_password = getenv ( " PASSWD " ) ;
}
2008-06-07 04:25:08 +04:00
rc = net_run_function ( c , argc_new - 1 , argv_new + 1 , " net " , net_func ) ;
2008-05-08 11:14:16 +04:00
2001-11-24 16:26:01 +03:00
DEBUG ( 2 , ( " return code = %d \n " , rc ) ) ;
2008-04-16 04:16:08 +04:00
2009-07-13 19:04:29 +04:00
gencache_stabilize ( ) ;
2008-05-10 01:22:12 +04:00
libnetapi_free ( c - > netapi_ctx ) ;
2008-04-16 04:16:08 +04:00
2008-06-04 04:44:24 +04:00
poptFreeContext ( pc ) ;
2007-08-31 13:10:54 +04:00
TALLOC_FREE ( frame ) ;
2001-11-24 16:26:01 +03:00
return rc ;
}